Compare commits

...

47 Commits
v1.1 ... master

Author SHA1 Message Date
Dmitry Isaenko e176460061 Define 'ul destination' as dropped folder
continuous-integration/drone/push Build is passing Details
2023-09-15 01:14:39 +03:00
Dmitry Isaenko 230dece91f fix typos
continuous-integration/drone/push Build is passing Details
2023-09-13 06:17:58 +03:00
Dmitry Isaenko 3c391cf1d3 UI enhancements
continuous-integration/drone/push Build is passing Details
2023-09-12 16:07:13 +03:00
Dmitry Isaenko ab47f1c960 Add drag-n-drop support for ISO files and ul.cfg. Last one opens new 'ul.cfg manager' window. Update few digits, version number.
continuous-integration/drone Build is passing Details
2023-09-08 22:13:09 +03:00
Dmitry Isaenko b99357a361
Merge pull request #8 from blckbearx/master
Add Spanish README
2023-09-06 12:53:00 +03:00
blckbearx 39c5977af7 Reorder language flags and rephrase some stuff in README_ES.md 2023-09-01 17:54:54 -03:00
blckbearx 2aaf655481 Add Spanish README_ES.md 2023-09-01 17:47:34 -03:00
Dmitry Isaenko 6a93a73a63 Unify pom L4J section
continuous-integration/drone/push Build is passing Details
2023-03-21 17:33:08 +03:00
Dmitry Isaenko 2bee159eb9 Set 24-bit BMP to make it compatible with NSIS
continuous-integration/drone/push Build is passing Details
2023-03-21 14:21:18 +03:00
Dmitry Isaenko c516f9bc57 Set correct volume, update images
continuous-integration/drone/push Build is passing Details
2023-03-21 14:06:10 +03:00
Dmitry Isaenko 4f45d98c3d Another CI corrections, one more readme update
continuous-integration/drone/push Build is failing Details
2023-03-21 13:59:01 +03:00
Dmitry Isaenko 8f8a793cb3 Correct CI, update readme
continuous-integration/drone/push Build is failing Details
2023-03-21 13:49:36 +03:00
Dmitry Isaenko 984366e584 Set NSIS packaging, update readme files.
continuous-integration/drone/push Build is failing Details
2023-03-21 13:41:13 +03:00
Dmitry Isaenko 07ad4e92dd
Merge pull request #5 from kuragehimekurara1/master
Added Japanese and Ryukyuan translations for README
2023-02-20 17:17:08 +03:00
kuragehime fd6ff777b8
Update README_RU.md 2023-02-19 12:11:31 +09:00
kuragehime 506e0a2a2b
Update README_RYU.md 2023-02-19 12:06:51 +09:00
kuragehime 8d27c1628f
Update README_JP.md 2023-02-19 11:58:12 +09:00
kuragehime 4300b7192e
Update README.md 2023-02-19 11:45:36 +09:00
kuragehime 2be64b322c
Update README_RU.md 2023-02-19 11:26:51 +09:00
kuragehime d9f09aa4a2
Update README.md 2023-02-19 11:24:19 +09:00
kuragehime 83ae7a1c1b
Update README.md 2023-02-19 11:22:56 +09:00
kuragehime 0df7f04e54
Rename us-flag to us-flag.svg 2023-02-19 11:18:57 +09:00
kuragehime c3007059c7
Create us-flag 2023-02-19 11:18:10 +09:00
kuragehime 3c035de6e4
Create ru-flag.svg 2023-02-19 08:39:46 +09:00
kuragehime 94aa5fea13
Create jp-flag.svg 2023-02-19 08:38:00 +09:00
kuragehime 1113bef51c
Create README_RYU.md 2023-02-19 06:32:01 +09:00
kuragehime 1c9b08c886
Create README_JP.md 2023-02-19 06:31:37 +09:00
Dmitry Isaenko 0e7e7785cc Update screenshot
continuous-integration/drone/push Build is passing Details
2023-02-02 01:05:13 +03:00
Dmitry Isaenko b709916df1 Minor updates to correctly display Ryukyuan languages in menu 2023-02-02 00:40:22 +03:00
Dmitry Isaenko 569411d2cc
Merge pull request #4 from kuragehimekurara1/master
Added Japanese and Ryukyuan translations
2023-02-02 00:13:55 +03:00
kuragehime 238c97131e
Update locale_ja_RYU.properties 2023-01-31 23:53:17 +09:00
kuragehime 5db2c83606
Update locale_ja_JP.properties 2023-01-31 23:27:19 +09:00
kuragehime 0cc195a809
Create locale_ja_RYU.properties 2023-01-31 22:59:54 +09:00
kuragehime 6404505d29
Create locale_ja_JP.properties 2023-01-31 22:59:40 +09:00
Dmitry Isaenko 31800fb2da Correct UI
continuous-integration/drone/push Build is passing Details
2022-12-25 18:28:25 +03:00
Dmitry Isaenko 2d30683436 Add language selector, update build config, add launch4j, other small changes that does not make impact on functionality
continuous-integration/drone/push Build is passing Details
2022-12-25 07:03:37 +03:00
Dmitry Isaenko 8d860189d4
Merge pull request #3 from blckbearx/master
continuous-integration/drone/push Build is passing Details
Add Spanish translation.
2022-12-23 22:52:07 +03:00
blckbearx 508aac228c Add Spanish translation. 2022-12-23 16:02:48 -03:00
Dmitry Isaenko 9198fb7a08 Increment version
continuous-integration/drone/push Build is passing Details
2022-09-29 23:03:38 +03:00
Dmitry Isaenko 3a7b63ee54
Merge pull request #2 from DDinghoya/patch-2
continuous-integration/drone/push Build is passing Details
Update locale_ko_KO.properties
2022-09-28 20:23:57 +03:00
DDinghoya c9bc50af41
Update locale_ko_KO.properties 2022-09-27 23:13:35 +09:00
Dmitry Isaenko 42f16777fe Add screenshots. Remove ul.cfg in case user removed all records inside.
continuous-integration/drone/push Build is passing Details
2022-09-24 23:42:34 +03:00
Dmitry Isaenko ecc586d82a Implement back end for ul.cfg manager. Now it's ready. Fix incorrect CRC32 returning value issue (!).
continuous-integration/drone/push Build is passing Details
2022-09-24 17:58:36 +03:00
Dmitry Isaenko 939ca2a7bd Implement front end for ul.cfg manager. ul.cfg manager needed to safely rename or remove existing split-files.
continuous-integration/drone/push Build is passing Details
2022-09-23 02:00:56 +03:00
Dmitry Isaenko 5cd6d98ff9 Update readme, quick and small refactoring that doesn't make any impact on functionality.
continuous-integration/drone/push Build is passing Details
2022-09-19 23:30:11 +03:00
Dmitry Isaenko 2ead991524
Merge pull request #1 from DDinghoya/patch-1
Create locale_ko_KO.properties
2022-09-19 23:26:50 +03:00
DDinghoya 134167336e
Create locale_ko_KO.properties 2022-09-19 09:30:41 +09:00
57 changed files with 3283 additions and 185 deletions

View File

@ -3,8 +3,8 @@ type: docker
name: default
steps:
- name: build-install-locally
image: maven:3-jdk-11
- name: build
image: maven:3-openjdk-17
commands:
- mvn -B -DskipTests clean install
- mvn test -B
@ -12,19 +12,37 @@ steps:
- name: m2
path: /root/.m2
- name: archive-artifact
- name: archive-artifacts
image: alpine:latest
commands:
- mkdir -p /builds/Tihwin
- cp target/Tihwin-*[0-9].jar /builds/Tihwin/
- cp target/Tihwin-*[0-9].exe /builds/Tihwin/
volumes:
- name: builds
path: /builds
- name: make-win-installer
image: wheatstalk/makensis:3
commands:
- cp target/Tihwin-*.exe NSIS/Tihwin.exe
- NSIS/update_version.sh
- cd NSIS
- makensis -V4 ./installer.nsi
- cp Installer-*.exe /builds/Tihwin/
volumes:
- name: builds
path: /builds
- name: jdk
path: /drone/src/NSIS/jdk
volumes:
- name: m2
host:
path: /home/docker/drone/files/m2
- name: builds
host:
path: /home/www/builds
path: /home/www/builds
- name: jdk
host:
path: /home/docker/drone/files/assembly/openjdk-19.0.2

146
NSIS/installer.nsi Normal file
View File

@ -0,0 +1,146 @@
;Include Modern UI
!include "MUI.nsh"
Unicode true
;Name and file
!define APPNAME "Tihwin"
!define COMPANYNAME "Dmitry Isaenko"
!define VERSIONMAJOR 0
!define VERSIONMINOR 0
!define VERSIONBUILD 0
Name "Tihwin"
OutFile "Installer.exe"
;Default installation folder
InstallDir "$PROGRAMFILES\${APPNAME}"
;Get installation folder from registry if available
InstallDirRegKey HKCU "Software\${APPNAME}" ""
;Request application privileges for Windows Vista
RequestExecutionLevel admin
!define MUI_ICON installer_logo.ico
!define MUI_UNICON uninstaller_logo.ico
; !define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_WELCOMEFINISHPAGE_BITMAP "leftbar.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "leftbar_uninstall.bmp"
!define MUI_FINISHPAGE_LINK "Tihwin at GitHub"
!define MUI_FINISHPAGE_LINK_LOCATION https://github.com/developersu/Tihwin/
!define MUI_FINISHPAGE_RUN "$INSTDIR\Tihwin.exe"
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_TEXT $(l10n_CreateShortcut)
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortCut
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
;--------------------------------
;Interface Settings
!define MUI_ABORTWARNING
;--------------------------------
;Language Selection Dialog Settings
;Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
!define MUI_LANGDLL_REGISTRY_KEY "Software\${APPNAME}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
;--------------------------------
;Pages
;!define MUI_HEADERIMAGE
;!define MUI_HEADERIMAGE_RIGHTi
;!define MUI_HEADERIMAGE_BITMAP "install_header.bmp"
;!define MUI_HEADERIMAGE_UNBITMAP "install_header.bmp"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
;--------------------------------
;Languages
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Japanese"
;Language strings
LangString l10n_CreateShortcut ${LANG_ENGLISH} "Create Desktop Shortcut"
LangString l10n_CreateShortcut ${LANG_RUSSIAN} "Создать ярлык на Рабочем столе"
;--------------------------------
Section "Tihwin" Install
SetOutPath "$INSTDIR"
file /r jdk
file Tihwin.exe
file logo.ico
; Registry information for add/remove programs
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$\"$INSTDIR\logo.ico$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "Publisher" "$\"${COMPANYNAME}$\""
; Start Menu
CreateDirectory "$SMPROGRAMS\${APPNAME}"
CreateShortCut "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk" "$INSTDIR\Tihwin.exe" "" "$INSTDIR\logo.ico"
CreateShortCut "$SMPROGRAMS\${APPNAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
;Store installation folder
WriteRegStr HKCU "Software\${APPNAME}" "" $INSTDIR
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
;--------------------------------
;Installer Functions
Function .onInit
; set mandatory installation rule to section
SectionSetFlags ${Install} 17
FunctionEnd
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
Function CreateDesktopShortCut
CreateShortcut "$DESKTOP\Tihwin.lnk" "$INSTDIR\Tihwin.exe"
FunctionEnd
;--------------------------------
;Uninstaller Section
Section "Uninstall"
; Start Menu
Delete "$SMPROGRAMS\${APPNAME}\${APPNAME}.lnk"
Delete "$SMPROGRAMS\${APPNAME}\Uninstall.lnk"
Delete "$DESKTOP\Tihwin.lnk"
rmDir "$SMPROGRAMS\${APPNAME}"
;Delete installed files
RMDir /r "$INSTDIR\jdk\*"
Delete "$INSTDIR\Tihwin.exe"
Delete "$INSTDIR\logo.ico"
Delete "$SMPROGRAMS\Uninstall.exe"
RMDir "$INSTDIR"
DeleteRegKey /ifempty HKCU "Software\${APPNAME}"
; Cleanup records stored for uninstaller from the registry
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
SectionEnd
;--------------------------------
;Uninstaller Functions

BIN
NSIS/installer_logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
NSIS/leftbar.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
NSIS/leftbar_uninstall.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

1070
NSIS/license.txt Normal file

File diff suppressed because it is too large Load Diff

BIN
NSIS/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
NSIS/uninstaller_logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

8
NSIS/update_version.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
TIMESTAMP=`date +%Y%m%d.%H%M%S`
VERSIONMAJOR=`grep '<version>' pom.xml | head -1 | sed -e 's/^.*<version>//g' -e 's/\..*$//g'`
VERSIONMINOR=`grep '<version>' pom.xml | head -1 | sed -E 's/^.*<version>[0-9]+?\.//g' | sed -E -e 's/(\..*|-SNAPSHOT|)<\/version>.*$//g'`
sed -z -i -e "s/!define\ VERSIONMAJOR\ [0-9]/!define\ VERSIONMAJOR $VERSIONMAJOR\ /" NSIS/installer.nsi
sed -z -i -e "s/!define\ VERSIONMINOR\ [0-9]/!define\ VERSIONMINOR $VERSIONMINOR\ /" NSIS/installer.nsi
sed -z -i -e "s/OutFile\ \"Installer.exe\"/OutFile\ \"Installer-$VERSIONMAJOR.$VERSIONMINOR-$TIMESTAMP.exe\"\ /" NSIS/installer.nsi

View File

@ -1,10 +1,16 @@
## Tihwin
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
[![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
#### Other languages
[![Russian](flag/ru-flag.svg)](README_RU.md)
[![Spanish](flag/es-flag.svg)](README_ES.md)
[![Japanese](flag/jp-flag.svg)](README_JP.md)
[![Ryukyuan](flag/jp-flag.svg)](README_RYU.md)(Ryukyuan)
OPL-compatible PS2 tool for making split files. Sort of ul.cfg manager or USBUtil.
OPL-compatible PS2 tool for making split files. Sort of ul.cfg manager or USBUtil. Good for use on mac and linux.
![Application screenshot](screenshots/1.png)
![Application screenshot1](screenshots/1.png)
![Application screenshot2](screenshots/2.png)
#### Let's stay in touch
@ -14,10 +20,20 @@ GitHubs are arising and passing, cozy mirrors are eternal: https://git.redrise.r
GNU GLPv3 or higher. Please see LICENSE.
#### Requirements
* Java (no need if Installer.exe used)
#### Feedback
Create new GitHub issue with bug report or proposition
#### Thanks
* [DDinghoya](https://github.com/DDinghoya), who translated this application to Korean!
* [Ignacio Grosso](https://github.com/blckbearx), who translated this application to Spanish!
* [kuragehime](https://github.com/kuragehimekurara1), who translated this application to Japanese and Ryukyuan languages!
#### Translations
Everyone knows that [your_language_here] is the best! And just to make sure, go create PR (pull request) or create an issue with translated `.../src/main/resources/locale.properties`
@ -26,4 +42,4 @@ Everyone knows that [your_language_here] is the best! And just to make sure, go
#### Support
Give a star on GitHub
Give a star on GitHub

45
README_ES.md Normal file
View File

@ -0,0 +1,45 @@
## Tihwin
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
#### Otros idiomas
[![Inglés](flag/us-flag.svg)](README.md)
[![Ruso](flag/ru-flag.svg)](README_RU.md)
[![Japonés](flag/jp-flag.svg)](README_JP.md)
[![Ryukyuan](flag/jp-flag.svg)](README_RYU.md)(Ryukyuan)
Herramienta compatible con OPL para crear archivos de juego fraccionados. Similar a "ul.cfg manager" o "USBUtil". Compatible con Mac y Linux.
![Application screenshot1](screenshots/1.png)
![Application screenshot2](screenshots/2.png)
#### Mantengámonos en contacto
Los repositorios de GitHub vienen y van, los mirrors son eternos: https://git.redrise.ru/desu/Tihwin
#### Licencia
GNU GLPv3 o más reciente. Por favor ver LICENSE.
#### Requisitos
* Java (no es necesario si se utiliza Installer.exe)
#### Comentarios
Crea una nueva entrada en "Issues" con un reporte de error o una propuesta para ayudar al desarrollo del software.
#### Agradecimientos
* [DDinghoya](https://github.com/DDinghoya), quien tradujo la app a Coreano!
* [Ignacio Grosso](https://github.com/blckbearx), quien tradujo la app a Español!
* [kuragehime](https://github.com/kuragehimekurara1), quien tradujo la app a Japonés y Ryukyuan!
#### Traducciones
Todos sabemos que [tu_idioma] es el mejor! Por esto, por favor crea un "PR" ("Pull Request") o un "Issue" con el archivo `.../src/main/resources/locale.properties` traducido a tu idioma.
(Por cierto, para convertir archivos de cualquier idioma a un formato legible (y viceversa) puedes utilizar este sitio [https://itpro.cz/juniconv/](https://itpro.cz/juniconv/))
#### Apoyo
Dale una estrella al proyecto en GitHub.

45
README_JP.md Normal file
View File

@ -0,0 +1,45 @@
## Tihwin
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
#### 他の言語
[![英語](flag/us-flag.svg)](README.md)
[![ロシア語](flag/ru-flag.svg)](README_RU.md)
[![スペイン語](flag/es-flag.svg)](README_ES.md)
[![琉球諸語](flag/jp-flag.svg)](README_RYU.md)(琉球諸語)
分割ファイルを作成するためのOPL互換のPS2ツール。 ul.cfg ネージャーまたはUSBUtilの並べ替え。MacおよびLinuxでの使用に適しています。
![Application screenshot1](screenshots/1.png)
![Application screenshot2](screenshots/2.png)
#### 連絡を取り合いましょう
GitHubは生まれては過ぎ去り、居心地の良いミラーは永遠です。 https://git.redrise.ru/desu/Tihwin
#### ライセンス
GNU GLPv3以降。 ライセンスをご覧ください。
#### 要件
* Java
#### フィードバック
バグレポートまたは提案で新しいGitHub issueを作成してください
#### 感謝
* [DDinghoya](https://github.com/DDinghoya), このアプリケーションを韓国語に翻訳しました!
* [Ignacio Grosso](https://github.com/blckbearx), このアプリケーションをスペイン語に翻訳しました!
* [kuragehime](https://github.com/kuragehimekurara1), このアプリケーションを日本語と琉球諸語に翻訳しました!
#### 翻訳
[あなたの言語]が最高であることは誰もが知っていますPR (pull request)を作成するか、翻訳された `.../src/main/resources/locale.properties`でissueを作成してください。
(任意のロケールのファイルを読み取り可能な形式に変換する (およびその逆) には、このサイトを使用できます [https://itpro.cz/juniconv/](https://itpro.cz/juniconv/))
#### 支援
GitHubでstarを付ける

45
README_RU.md Normal file
View File

@ -0,0 +1,45 @@
## Tihwin
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
#### Другие языки
[![Английский язык](flag/us-flag.svg)](README.md)
[![испанский](flag/es-flag.svg)](README_ES.md)
[![Японский язык](flag/jp-flag.svg)](README_JP.md)
[![Рюкюские языки](flag/jp-flag.svg)](README_RYU.md)(Рюкюские языки)
Это OPL-совместимая утилита для PS2. Используется для создания т.н. «сплит-файлов». Это что-то вроде менеджера ul.cfg или, другими словами, аналог USBUtil. Отличной подойдёт для использования в маке и линуксе.
![Application screenshot1](screenshots/1.png)
![Application screenshot2](screenshots/2.png)
#### Не будем теряться!
Гитхабы приходят и уходят, уютные зеркала же вечны! https://git.redrise.ru/desu/Tihwin
#### Лицензия
GNU GLPv3 или выше. Ознакомьтесь с файлом LICENSE.
#### Требования
* Java (не требуется при использовании Installer.exe)
#### Обратная связь
Просто создайте новую issue с отчётом об ошибке или предложением.
#### Спасибо
* [DDinghoya](https://github.com/DDinghoya), кто перевели приложение на Корейский!
* [Ignacio Grosso](https://github.com/blckbearx), кто перевели приложение на Испанский!
* [kuragehime](https://github.com/kuragehimekurara1), кто перевели приложение на Японский и языки Рюкю!
#### Переводы
Все знают что [вставьте_сюдааш_родной_язык] просто лучший! Вообще, просто на всякий случай, сделайте PR (пул реквест) или создайте issue с переведённым файлом `.../src/main/resources/locale.properties`
(Кстати, чтобы конвертировать фалйы ил любой локали в читабельный формат и обратно, можете воспользоваться этим сайтом [https://itpro.cz/juniconv/](https://itpro.cz/juniconv/))
#### Как поддержать
Да просто влепите звездочку GitHub

45
README_RYU.md Normal file
View File

@ -0,0 +1,45 @@
## Tihwin
![License](https://img.shields.io/badge/License-GPLv3-blue.svg) ![LatestVer](https://img.shields.io/github/release/developersu/Tihwin.svg) [![Build Status](https://ci.redrise.ru/api/badges/desu/Tihwin/status.svg)](https://ci.redrise.ru/desu/Tihwin)
#### 他ぬ言語
[![英語](flag/us-flag.svg)](README.md)
[![ロシア語](flag/ru-flag.svg)](README_RU.md)
[![Spanish](flag/es-flag.svg)](README_ES.md)
[![やまとぅぐち](flag/jp-flag.svg)](README_JP.md)(やまとぅぐち)
分割ファイル作成するたみぬOPL互換ぬPS2ツール。 ul.cfgマネージャーあらんでぃUSBUtilぬ並べい替い。MacうゆびLinuxっしぬ使用んかい適ちょーいびーん。
![Application screenshot1](screenshots/1.png)
![Application screenshot2](screenshots/2.png)
#### 連絡取り合やびら
GitHubーんまりてー過ぎ去い、居心地ぬゆたさるミラーや永遠やいびーん。 https://git.redrise.ru/desu/Tihwin
#### ライセンス
GNU GLPv3以降。 ライセンスんーちくぃみそーれー。
#### 要件
* Java
#### フィードバック
バグレポートあらんでぃ提案っしみーさるGitHub issue作成しみそーれー
#### 感謝
* [DDinghoya](https://github.com/DDinghoya), くぬアプリケーション韓国語んかい翻訳さびたん!
* [Ignacio Grosso](https://github.com/blckbearx), くぬアプリケーションスペイン語んかい翻訳さびたん!
* [kuragehime](https://github.com/kuragehimekurara1), くぬアプリケーションやまとぅぐちとぅるーちゅー諸語んかい翻訳さびたん!
#### 翻訳
[うんじゅが言語]やしがじょーとぅーやんくとーたーんが知っちょーいびーんPR (pull request)作成すが、翻訳さったん `.../src/main/resources/locale.properties`でぃissue作成しみそーれー。
(任意ぬロケールぬファイル読み取い可能やる形式んかい変換すん (うゆびうぬ逆) んかえー、くぬサイト使用なやびーん [https://itpro.cz/juniconv/](https://itpro.cz/juniconv/))
#### 支援
GitHubっしstarちきーん

1
flag/es-flag.svg Normal file
View File

@ -0,0 +1 @@
<svg width="21" height="15" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="a"><stop stop-color="#FFF" offset="0%"/><stop stop-color="#F0F0F0" offset="100%"/></linearGradient><linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="b"><stop stop-color="#DD172C" offset="0%"/><stop stop-color="#C60B1F" offset="100%"/></linearGradient><linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="c"><stop stop-color="#FFD133" offset="0%"/><stop stop-color="#FFC500" offset="100%"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><path fill="url(#a)" d="M0 0h21v15H0z"/><path fill="url(#b)" d="M0 0h21v4H0zm0 11h21v4H0z"/><path fill="url(#c)" d="M0 4h21v7H0z"/><path fill="#FFEDB1" d="M5.5 7h1v.5h-1z"/><path d="M4.915 8.46c.025.295.291.54.585.54s.56-.246.585-.54L6.207 7H4.793l.122 1.46zm-.624-1.465a.456.456 0 0 1 .465-.495h1.488a.45.45 0 0 1 .465.495l-.126 1.506A1.104 1.104 0 0 1 5.5 9.5a1.104 1.104 0 0 1-1.083-.999L4.29 6.995z" fill="#A41517" fill-rule="nonzero"/><path fill="#A41517" d="M4.5 7.5h2V8H6l-.5 1L5 8h-.5zM3 6h1v3.5H3zm4 0h1v3.5H7zm-2.5-.5c0-.276.214-.5.505-.5h.99c.279 0 .505.232.505.5v.248A.248.248 0 0 1 6.255 6h-1.51a.245.245 0 0 1-.245-.252V5.5z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

22
flag/jp-flag.svg Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="15px" viewBox="0 0 21 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: sketchtool 46 (44423) - http://www.bohemiancoding.com/sketch -->
<title>JP</title>
<desc>Created with sketchtool.</desc>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#F0F0F0" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#D81441" offset="0%"></stop>
<stop stop-color="#BB0831" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="JP">
<rect id="FlagBackground" fill="url(#linearGradient-1)" x="0" y="0" width="21" height="15"></rect>
<circle id="Oval-9" fill="url(#linearGradient-2)" cx="10.5" cy="7.5" r="4.5"></circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

28
flag/ru-flag.svg Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="15px" viewBox="0 0 21 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: sketchtool 46 (44423) - http://www.bohemiancoding.com/sketch -->
<title>RU</title>
<desc>Created with sketchtool.</desc>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#F0F0F0" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#0C47B7" offset="0%"></stop>
<stop stop-color="#073DA4" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-3">
<stop stop-color="#E53B35" offset="0%"></stop>
<stop stop-color="#D32E28" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="RU">
<rect id="FlagBackground" fill="url(#linearGradient-1)" x="0" y="0" width="21" height="15"></rect>
<rect id="Rectangle-2" fill="url(#linearGradient-2)" x="0" y="5" width="21" height="5"></rect>
<rect id="Rectangle-2" fill="url(#linearGradient-3)" x="0" y="10" width="21" height="5"></rect>
<rect id="Rectangle-2" fill="url(#linearGradient-1)" x="0" y="0" width="21" height="5"></rect>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

28
flag/us-flag.svg Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="15px" viewBox="0 0 21 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: sketchtool 46 (44423) - http://www.bohemiancoding.com/sketch -->
<title>US</title>
<desc>Created with sketchtool.</desc>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#F0F0F0" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#D02F44" offset="0%"></stop>
<stop stop-color="#B12537" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-3">
<stop stop-color="#46467F" offset="0%"></stop>
<stop stop-color="#3C3C6D" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="US">
<rect id="FlagBackground" fill="url(#linearGradient-1)" x="0" y="0" width="21" height="15"></rect>
<path d="M0,0 L21,0 L21,1 L0,1 L0,0 Z M0,2 L21,2 L21,3 L0,3 L0,2 Z M0,4 L21,4 L21,5 L0,5 L0,4 Z M0,6 L21,6 L21,7 L0,7 L0,6 Z M0,8 L21,8 L21,9 L0,9 L0,8 Z M0,10 L21,10 L21,11 L0,11 L0,10 Z M0,12 L21,12 L21,13 L0,13 L0,12 Z M0,14 L21,14 L21,15 L0,15 L0,14 Z" id="Rectangle-511" fill="url(#linearGradient-2)"></path>
<rect id="Rectangle-511" fill="url(#linearGradient-3)" x="0" y="0" width="9" height="7"></rect>
<path d="M1.5,2 C1.22385763,2 1,1.77614237 1,1.5 C1,1.22385763 1.22385763,1 1.5,1 C1.77614237,1 2,1.22385763 2,1.5 C2,1.77614237 1.77614237,2 1.5,2 Z M3.5,2 C3.22385763,2 3,1.77614237 3,1.5 C3,1.22385763 3.22385763,1 3.5,1 C3.77614237,1 4,1.22385763 4,1.5 C4,1.77614237 3.77614237,2 3.5,2 Z M5.5,2 C5.22385763,2 5,1.77614237 5,1.5 C5,1.22385763 5.22385763,1 5.5,1 C5.77614237,1 6,1.22385763 6,1.5 C6,1.77614237 5.77614237,2 5.5,2 Z M7.5,2 C7.22385763,2 7,1.77614237 7,1.5 C7,1.22385763 7.22385763,1 7.5,1 C7.77614237,1 8,1.22385763 8,1.5 C8,1.77614237 7.77614237,2 7.5,2 Z M2.5,3 C2.22385763,3 2,2.77614237 2,2.5 C2,2.22385763 2.22385763,2 2.5,2 C2.77614237,2 3,2.22385763 3,2.5 C3,2.77614237 2.77614237,3 2.5,3 Z M4.5,3 C4.22385763,3 4,2.77614237 4,2.5 C4,2.22385763 4.22385763,2 4.5,2 C4.77614237,2 5,2.22385763 5,2.5 C5,2.77614237 4.77614237,3 4.5,3 Z M6.5,3 C6.22385763,3 6,2.77614237 6,2.5 C6,2.22385763 6.22385763,2 6.5,2 C6.77614237,2 7,2.22385763 7,2.5 C7,2.77614237 6.77614237,3 6.5,3 Z M7.5,4 C7.22385763,4 7,3.77614237 7,3.5 C7,3.22385763 7.22385763,3 7.5,3 C7.77614237,3 8,3.22385763 8,3.5 C8,3.77614237 7.77614237,4 7.5,4 Z M5.5,4 C5.22385763,4 5,3.77614237 5,3.5 C5,3.22385763 5.22385763,3 5.5,3 C5.77614237,3 6,3.22385763 6,3.5 C6,3.77614237 5.77614237,4 5.5,4 Z M3.5,4 C3.22385763,4 3,3.77614237 3,3.5 C3,3.22385763 3.22385763,3 3.5,3 C3.77614237,3 4,3.22385763 4,3.5 C4,3.77614237 3.77614237,4 3.5,4 Z M1.5,4 C1.22385763,4 1,3.77614237 1,3.5 C1,3.22385763 1.22385763,3 1.5,3 C1.77614237,3 2,3.22385763 2,3.5 C2,3.77614237 1.77614237,4 1.5,4 Z M2.5,5 C2.22385763,5 2,4.77614237 2,4.5 C2,4.22385763 2.22385763,4 2.5,4 C2.77614237,4 3,4.22385763 3,4.5 C3,4.77614237 2.77614237,5 2.5,5 Z M4.5,5 C4.22385763,5 4,4.77614237 4,4.5 C4,4.22385763 4.22385763,4 4.5,4 C4.77614237,4 5,4.22385763 5,4.5 C5,4.77614237 4.77614237,5 4.5,5 Z M6.5,5 C6.22385763,5 6,4.77614237 6,4.5 C6,4.22385763 6.22385763,4 6.5,4 C6.77614237,4 7,4.22385763 7,4.5 C7,4.77614237 6.77614237,5 6.5,5 Z M7.5,6 C7.22385763,6 7,5.77614237 7,5.5 C7,5.22385763 7.22385763,5 7.5,5 C7.77614237,5 8,5.22385763 8,5.5 C8,5.77614237 7.77614237,6 7.5,6 Z M5.5,6 C5.22385763,6 5,5.77614237 5,5.5 C5,5.22385763 5.22385763,5 5.5,5 C5.77614237,5 6,5.22385763 6,5.5 C6,5.77614237 5.77614237,6 5.5,6 Z M3.5,6 C3.22385763,6 3,5.77614237 3,5.5 C3,5.22385763 3.22385763,5 3.5,5 C3.77614237,5 4,5.22385763 4,5.5 C4,5.77614237 3.77614237,6 3.5,6 Z M1.5,6 C1.22385763,6 1,5.77614237 1,5.5 C1,5.22385763 1.22385763,5 1.5,5 C1.77614237,5 2,5.22385763 2,5.5 C2,5.77614237 1.77614237,6 1.5,6 Z" id="Oval-43" fill="url(#linearGradient-1)"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

50
pom.xml
View File

@ -8,7 +8,7 @@
<name>Tihwin</name>
<artifactId>Tihwin</artifactId>
<version>1.1</version>
<version>2.4</version>
<url>https://github.com/developersu/${project.artifactId}/</url>
<description>
@ -120,6 +120,54 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<version>2.2.0</version>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
<id>l4j-${project.name}</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<icon>tw_icon.ico</icon>
<outfile>target/${project.name}-${project.version}-${maven.build.timestamp}.exe</outfile>
<jar>target/${project.artifactId}-${project.version}-${maven.build.timestamp}.jar</jar>
<errTitle>${project.name} launching error</errTitle>
<classPath>
<mainClass>tihwin.Main</mainClass>
<addDependencies>false</addDependencies>
<preCp>anything</preCp>
</classPath>
<jre>
<minVersion>1.8.0</minVersion>
<path>%PWD%/jdk;%JAVA_HOME%;%PATH%</path>
</jre>
<versionInfo>
<fileVersion>${project.version}.0.0</fileVersion>
<txtFileVersion>${project.version}</txtFileVersion>
<fileDescription>ul.cfg utility</fileDescription>
<copyright>GNU General Public License v3, ${project.inceptionYear} ${project.organization.name}, Russia</copyright>
<productVersion>${project.version}.0.0</productVersion>
<txtProductVersion>${project.version}</txtProductVersion>
<companyName>${project.organization.name}</companyName>
<productName>${project.name}</productName>
<internalName>${project.name}</internalName>
<originalFilename>${project.name}.exe</originalFilename>
</versionInfo>
<messages>
<startupErr>Startup error</startupErr>
<jreNotFoundErr>Please check your Java Runtime installation. JDK not found</jreNotFoundErr>
<jreVersionErr>Please check your Java Runtime installation. JDK Version mismatch</jreVersionErr>
<launcherErr>Launcher Error</launcherErr>
</messages>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 36 KiB

BIN
screenshots/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -1,6 +1,6 @@
/*
Copyright "2022" Dmitry Isaenko
Copyright 2022-2023 Dmitry Isaenko
This file is part of Tihwin.
@ -20,6 +20,8 @@
*/
package tihwin;
import java.io.File;
public class AwesomeMediator {
private final static AwesomeMediator INSTANCE = new AwesomeMediator();
@ -33,4 +35,11 @@ public class AwesomeMediator {
public static void notifyAllConvertsEnded(){
INSTANCE.mainAppUi.notifySplitFinished();
}
public static void setDiskImage(File file){
INSTANCE.mainAppUi.setDiskImageFile(file);
}
public static void setDestination(File folder){
INSTANCE.mainAppUi.setDestinationDir(folder);
}
}

View File

@ -20,11 +20,13 @@ package tihwin;
import javax.swing.*;
import java.awt.*;
import java.util.Locale;
import java.util.Objects;
import java.util.ResourceBundle;
public class Main {
public static void main(String[] args) {
Locale.setDefault(Settings.INSTANCE.getLocale());
String appVersion = ResourceBundle.getBundle("app").getString("_version");
MainAppUi frame = new MainAppUi("Tihwin "+appVersion);
@ -32,7 +34,7 @@ public class Main {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Image img = new ImageIcon(Objects.requireNonNull(MainAppUi.class.getClassLoader().getResource("tray_icon.gif"))).getImage();
frame.setIconImage(img);
frame.setMinimumSize(new Dimension(700, 300));
frame.setMinimumSize(new Dimension(700, 350));
//frame.setResizable(false);
frame.setVisible(true);
}

View File

@ -2,6 +2,7 @@
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="tihwin.MainAppUi">
<grid id="27dc6" binding="mainPanel" layout-manager="FormLayout">
<rowspec value="center:max(d;4px):noGrow"/>
<rowspec value="top:m:grow"/>
<rowspec value="top:4dlu:noGrow"/>
<rowspec value="center:max(d;4px):noGrow"/>
<rowspec value="top:4dlu:noGrow"/>
@ -10,9 +11,10 @@
<rowspec value="center:max(d;4px):noGrow"/>
<rowspec value="top:4dlu:noGrow"/>
<rowspec value="center:max(d;4px):noGrow"/>
<rowspec value="top:p:grow"/>
<rowspec value="top:4dlu:noGrow"/>
<rowspec value="center:max(d;4px):noGrow"/>
<rowspec value="top:4dlu:noGrow"/>
<rowspec value="center:max(d;1dlu):noGrow"/>
<colspec value="fill:p:noGrow"/>
<colspec value="left:4dlu:noGrow"/>
<colspec value="fill:p:noGrow"/>
@ -20,26 +22,27 @@
<colspec value="fill:p:noGrow"/>
<colspec value="fill:max(d;4px):noGrow"/>
<colspec value="fill:d:grow"/>
<colspec value="left:4dlu:noGrow"/>
<colspec value="fill:p:noGrow"/>
<constraints>
<xy x="0" y="0" width="729" height="288"/>
<xy x="0" y="0" width="763" height="488"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="3f7d8" class="javax.swing.JButton" binding="diskImageSelectBtn">
<constraints>
<grid row="2" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<forms top="0" left="5" bottom="0" right="0"/>
<grid row="3" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<forms top="0" left="5" bottom="0" right="0" defaultalign-vert="false"/>
</constraints>
<properties>
<background color="-2034433"/>
<iconTextGap value="4"/>
<text resource-bundle="locale" key="SelectBtn"/>
</properties>
</component>
<component id="8e185" class="javax.swing.JTextField" binding="titleField">
<constraints>
<grid row="4" column="6" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="1" use-parent-layout="false">
<grid row="5" column="6" row-span="1" col-span="3" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="1" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
<forms top="0" left="0" bottom="0" right="5"/>
@ -48,8 +51,8 @@
</component>
<component id="b32ec" class="javax.swing.JLabel" binding="destinationDirectoryLbl">
<constraints>
<grid row="6" column="6" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms top="0" left="0" bottom="0" right="5"/>
<grid row="7" column="6" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<text value=""/>
@ -57,8 +60,8 @@
</component>
<component id="43fa" class="javax.swing.JLabel" binding="diskImageNameLbl">
<constraints>
<grid row="2" column="6" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms top="0" left="0" bottom="0" right="5"/>
<grid row="3" column="6" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<text value=""/>
@ -66,7 +69,7 @@
</component>
<component id="fbb6" class="javax.swing.JButton" binding="destinationSelectBtn">
<constraints>
<grid row="6" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<grid row="7" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<forms top="0" left="5" bottom="0" right="0"/>
</constraints>
<properties>
@ -74,27 +77,27 @@
<text resource-bundle="locale" key="SelectBtn"/>
</properties>
</component>
<component id="ed01c" class="javax.swing.JLabel">
<component id="ed01c" class="javax.swing.JLabel" binding="ulDestinationRoLbl">
<constraints>
<grid row="6" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="7" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<text resource-bundle="locale" key="ulDestinationLbl"/>
</properties>
</component>
<component id="778d6" class="javax.swing.JLabel">
<component id="778d6" class="javax.swing.JLabel" binding="diskImageRoLbl">
<constraints>
<grid row="2" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="3" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<text resource-bundle="locale" key="DiskImageLbl"/>
</properties>
</component>
<component id="cbd88" class="javax.swing.JLabel">
<component id="cbd88" class="javax.swing.JLabel" binding="titleRoLbl">
<constraints>
<grid row="4" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="5" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
@ -103,26 +106,26 @@
</component>
<component id="a214f" class="javax.swing.JRadioButton" binding="CDRadioButton" default-binding="true">
<constraints>
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="5" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<text value="CD"/>
<text resource-bundle="locale" key="CD"/>
</properties>
</component>
<component id="1dd66" class="javax.swing.JRadioButton" binding="DVDRadioButton" default-binding="true">
<constraints>
<grid row="4" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="5" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<selected value="true"/>
<text value="DVD"/>
<text resource-bundle="locale" key="DVD"/>
</properties>
</component>
<component id="308a4" class="javax.swing.JButton" binding="convertBtn">
<constraints>
<grid row="8" column="0" row-span="1" col-span="7" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<grid row="9" column="0" row-span="1" col-span="9" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="-1" height="50"/>
</grid>
<forms top="0" left="5" bottom="0" right="5"/>
@ -132,10 +135,68 @@
<text resource-bundle="locale" key="ConvertBtn"/>
</properties>
</component>
<component id="be17f" class="javax.swing.JProgressBar" binding="progressBar" default-binding="true">
<constraints>
<grid row="11" column="0" row-span="1" col-span="9" vsize-policy="0" hsize-policy="6" anchor="1" fill="1" indent="0" use-parent-layout="false"/>
<forms defaultalign-horz="false" defaultalign-vert="false"/>
</constraints>
<properties>
<borderPainted value="false"/>
<foreground color="-26368"/>
<indeterminate value="false"/>
</properties>
</component>
<grid id="a5cce" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="0" row-span="1" col-span="9" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<background color="-9251843"/>
</properties>
<border type="none"/>
<children>
<component id="2c1c4" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<icon value="banner.png"/>
<text value=""/>
</properties>
</component>
<component id="92f10" class="javax.swing.JComboBox" binding="ulLangComboBox" custom-create="true">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="9" fill="1" indent="1" use-parent-layout="false"/>
</constraints>
<properties>
<background color="-9251843"/>
<foreground color="-1"/>
</properties>
<clientProperties>
<html.disable class="java.lang.Boolean" value="false"/>
</clientProperties>
</component>
</children>
</grid>
<component id="824ea" class="javax.swing.JButton" binding="ulCfgBtn">
<constraints>
<grid row="3" column="8" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<forms top="0" left="0" bottom="0" right="5"/>
</constraints>
<properties>
<background color="-2031648"/>
<margin top="1" left="1" bottom="1" right="1"/>
<minimumSize width="130" height="30"/>
<preferredSize width="140" height="30"/>
<text resource-bundle="locale" key="editUlCfgBtn"/>
</properties>
</component>
<grid id="8b0eb" binding="statusJPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="5" left="5" bottom="5" right="5"/>
<constraints>
<grid row="11" column="0" row-span="1" col-span="7" vsize-policy="0" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<grid row="13" column="0" row-span="1" col-span="9" vsize-policy="0" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
@ -155,39 +216,6 @@
</component>
</children>
</grid>
<component id="be17f" class="javax.swing.JProgressBar" binding="progressBar" default-binding="true">
<constraints>
<grid row="10" column="0" row-span="1" col-span="7" vsize-policy="0" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
<forms defaultalign-horz="false"/>
</constraints>
<properties>
<borderPainted value="false"/>
<foreground color="-9251843"/>
<indeterminate value="false"/>
</properties>
</component>
<grid id="a5cce" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="0" column="0" row-span="1" col-span="7" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<forms/>
</constraints>
<properties>
<background color="-9251843"/>
</properties>
<border type="none"/>
<children>
<component id="2c1c4" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<icon value="banner.png"/>
<text value=""/>
</properties>
</component>
</children>
</grid>
</children>
</grid>
<buttonGroups>

View File

@ -1,5 +1,5 @@
/*
Copyright 2022 Dmitry Isaenko
Copyright 2022-2023 Dmitry Isaenko
This file is part of Tihwin.
@ -23,19 +23,21 @@ import com.intellij.uiDesigner.core.GridLayoutManager;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import tihwin.cd.ISO9660;
import tihwin.ui.IsoFileFilter;
import tihwin.ui.TitleFieldFilter;
import tihwin.ui.UiUpdater;
import tihwin.ui.*;
import tihwin.ui.model.LocaleHolder;
import tihwin.ul.UlConfiguration;
import tihwin.ul.UlMaker;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.text.AbstractDocument;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.lang.reflect.Method;
import java.util.Locale;
import java.util.ResourceBundle;
public class MainAppUi extends JFrame {
@ -51,7 +53,12 @@ public class MainAppUi extends JFrame {
private JTextField titleField;
private JRadioButton CDRadioButton;
private JRadioButton DVDRadioButton;
private final ResourceBundle resourceBundle;
private JButton ulCfgBtn;
private JComboBox<LocaleHolder> ulLangComboBox;
private JLabel diskImageRoLbl;
private JLabel titleRoLbl;
private JLabel ulDestinationRoLbl;
private ResourceBundle resourceBundle;
private String recentRomLocation;
private File diskImage;
@ -62,15 +69,18 @@ public class MainAppUi extends JFrame {
public MainAppUi(String appName) {
super(appName);
$$$setupUI$$$();
resourceBundle = ResourceBundle.getBundle("locale");
AwesomeMediator.setMainUi(this);
setLocationRelativeTo(null); // Set window on [kinda] center
new FilesDropListener(mainPanel);
setContentPane(mainPanel);
statusJPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.darkGray));
convertBtn.setEnabled(false);
diskImageSelectBtn.addActionListener(actionEvent -> diskImageSelectEventHandler());
destinationSelectBtn.addActionListener(actionEvent -> destinationSelectEventHandler());
convertBtn.addActionListener(actionEvent -> convertButtonAction());
ulCfgBtn.addActionListener(actionEvent -> ulConfigButtonAction());
((AbstractDocument) titleField.getDocument()).setDocumentFilter(new TitleFieldFilter());
if (Settings.INSTANCE.getDvdSelected())
DVDRadioButton.setSelected(true);
@ -78,76 +88,53 @@ public class MainAppUi extends JFrame {
CDRadioButton.setSelected(true);
recentRomLocation = Settings.INSTANCE.getRomLocation();
destinationDirectoryLbl.setText(FilesHelper.getRealFolder(Settings.INSTANCE.getDestination()));
addWindowListener(getWindowListener());
}
private WindowListener getWindowListener() {
return new WindowListener() {
@Override
public void windowOpened(WindowEvent windowEvent) {
}
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
Settings.INSTANCE.setRomLocation(recentRomLocation);
Settings.INSTANCE.setDestination(destinationDirectoryLbl.getText());
Settings.INSTANCE.setDvdSelected(DVDRadioButton.isSelected());
Settings.INSTANCE.setLocale(((LocaleHolder) ulLangComboBox.getSelectedItem()).getLocaleCode());
}
});
@Override
public void windowClosed(WindowEvent windowEvent) {
}
Border fitMoreTextOnButtonBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.gray),
BorderFactory.createEmptyBorder(5, 5, 5, 5));
diskImageSelectBtn.setBorder(fitMoreTextOnButtonBorder);
destinationSelectBtn.setBorder(fitMoreTextOnButtonBorder);
diskImageSelectBtn.addMouseListener(new TwButtonsActionListener());
destinationSelectBtn.addMouseListener(new TwButtonsActionListener());
@Override
public void windowIconified(WindowEvent windowEvent) {
}
@Override
public void windowDeiconified(WindowEvent windowEvent) {
}
@Override
public void windowActivated(WindowEvent windowEvent) {
}
@Override
public void windowDeactivated(WindowEvent windowEvent) {
}
};
titleField.setBorder(new LineBorder(Color.lightGray));
}
private void diskImageSelectEventHandler() {
JFileChooser fileChooser = new JFileChooser(FilesHelper.getRealFolder(recentRomLocation));
fileChooser.setDialogTitle(resourceBundle.getString("SelectDiskImageText"));
fileChooser.setFileFilter(new IsoFileFilter());
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
setDiskImageFile(fileChooser.getSelectedFile());
}
public void setDiskImageFile(File imageFile) {
try {
JFileChooser fileChooser = new JFileChooser(FilesHelper.getRealFolder(recentRomLocation));
fileChooser.setDialogTitle(resourceBundle.getString("SelectDiskImageText"));
fileChooser.setFileFilter(new IsoFileFilter());
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
setDiskImageFile(fileChooser.getSelectedFile());
recentRomLocation = imageFile.getParent();
ISO9660 iso9660 = new ISO9660(imageFile);
publisherTitle = iso9660.getTitle();
diskImageNameLbl.setText(imageFile.getName());
convertBtn.setEnabled(true);
statusLbl.setText(imageFile.getAbsolutePath());
diskImage = imageFile;
setProposedTitle();
} catch (Exception e) {
statusLbl.setText(e.getMessage());
e.printStackTrace();
}
}
private void setDiskImageFile(File imageFile) throws Exception {
recentRomLocation = imageFile.getParent();
ISO9660 iso9660 = new ISO9660(imageFile);
publisherTitle = iso9660.getTitle();
diskImageNameLbl.setText(imageFile.getName());
convertBtn.setEnabled(true);
statusLbl.setText(imageFile.getAbsolutePath());
diskImage = imageFile;
setProposedTitle();
}
private void setProposedTitle() {
String proposedName = diskImage.getName().replaceAll("(\\..*)|(\\[.*)", "").trim();
if (proposedName.length() > 31)
@ -161,12 +148,11 @@ public class MainAppUi extends JFrame {
JFileChooser fileChooser = new JFileChooser(FilesHelper.getRealFolder(destinationDirectoryLbl.getText()));
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setDialogTitle(resourceBundle.getString("SetDestinationDirectoryText"));
fileChooser.setFileFilter(new IsoFileFilter());
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
setDestinationDir(fileChooser.getSelectedFile());
}
private void setDestinationDir(File folder) {
public void setDestinationDir(File folder) {
destinationDirectoryLbl.setText(folder.getAbsolutePath());
}
@ -215,11 +201,35 @@ public class MainAppUi extends JFrame {
convertBtn.setText(resourceBundle.getString("ConvertBtn"));
}
{
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
$$$setupUI$$$();
private void ulConfigButtonAction() {
new UpdateUlTableUi(destinationDirectoryLbl.getText());
}
private void onLanguageChanged() {
Locale newLocale = ((LocaleHolder) ulLangComboBox.getSelectedItem()).getLocale();
Locale.setDefault(newLocale);
resourceBundle = ResourceBundle.getBundle("locale");
diskImageSelectBtn.setText(resourceBundle.getString("SelectBtn"));
destinationSelectBtn.setText(resourceBundle.getString("SelectBtn"));
if (doWeConvertAnythingNow) {
convertBtn.setText(resourceBundle.getString("AbortText"));
statusLbl.setText(resourceBundle.getString("InProgressText"));
} else
convertBtn.setText(resourceBundle.getString("ConvertBtn"));
diskImageRoLbl.setText(resourceBundle.getString("DiskImageLbl"));
titleRoLbl.setText(resourceBundle.getString("TitleLbl"));
ulDestinationRoLbl.setText(resourceBundle.getString("ulDestinationLbl"));
CDRadioButton.setText(resourceBundle.getString("CD"));
DVDRadioButton.setText(resourceBundle.getString("DVD"));
ulCfgBtn.setText(resourceBundle.getString("editUlCfgBtn"));
}
private void createUIComponents() {
this.ulLangComboBox = new LanguageComboBox();
ulLangComboBox.addActionListener(e -> onLanguageChanged());
}
/**
@ -230,66 +240,77 @@ public class MainAppUi extends JFrame {
* @noinspection ALL
*/
private void $$$setupUI$$$() {
createUIComponents();
mainPanel = new JPanel();
mainPanel.setLayout(new FormLayout("fill:p:noGrow,left:4dlu:noGrow,fill:p:noGrow,left:4dlu:noGrow,fill:p:noGrow,fill:max(d;4px):noGrow,fill:d:grow", "center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:p:grow,top:4dlu:noGrow,center:max(d;4px):noGrow"));
mainPanel.setLayout(new FormLayout("fill:p:noGrow,left:4dlu:noGrow,fill:p:noGrow,left:4dlu:noGrow,fill:p:noGrow,fill:max(d;4px):noGrow,fill:d:grow,left:4dlu:noGrow,fill:p:noGrow", "center:max(d;4px):noGrow,top:m:grow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;4px):noGrow,top:4dlu:noGrow,center:max(d;1dlu):noGrow"));
diskImageSelectBtn = new JButton();
diskImageSelectBtn.setBackground(new Color(-2034433));
diskImageSelectBtn.setIconTextGap(4);
this.$$$loadButtonText$$$(diskImageSelectBtn, this.$$$getMessageFromBundle$$$("locale", "SelectBtn"));
CellConstraints cc = new CellConstraints();
mainPanel.add(diskImageSelectBtn, new CellConstraints(1, 3, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 0)));
mainPanel.add(diskImageSelectBtn, new CellConstraints(1, 4, 3, 1, CellConstraints.DEFAULT, CellConstraints.CENTER, new Insets(0, 5, 0, 0)));
titleField = new JTextField();
mainPanel.add(titleField, new CellConstraints(7, 5, 1, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 5)));
mainPanel.add(titleField, new CellConstraints(7, 6, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 5)));
destinationDirectoryLbl = new JLabel();
destinationDirectoryLbl.setText("");
mainPanel.add(destinationDirectoryLbl, new CellConstraints(7, 7, 1, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 5)));
mainPanel.add(destinationDirectoryLbl, cc.xyw(7, 8, 3));
diskImageNameLbl = new JLabel();
diskImageNameLbl.setText("");
mainPanel.add(diskImageNameLbl, new CellConstraints(7, 3, 1, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 5)));
mainPanel.add(diskImageNameLbl, cc.xy(7, 4));
destinationSelectBtn = new JButton();
destinationSelectBtn.setBackground(new Color(-2034433));
this.$$$loadButtonText$$$(destinationSelectBtn, this.$$$getMessageFromBundle$$$("locale", "SelectBtn"));
mainPanel.add(destinationSelectBtn, new CellConstraints(1, 7, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 0)));
final JLabel label1 = new JLabel();
this.$$$loadLabelText$$$(label1, this.$$$getMessageFromBundle$$$("locale", "ulDestinationLbl"));
mainPanel.add(label1, cc.xy(5, 7));
final JLabel label2 = new JLabel();
this.$$$loadLabelText$$$(label2, this.$$$getMessageFromBundle$$$("locale", "DiskImageLbl"));
mainPanel.add(label2, cc.xy(5, 3));
final JLabel label3 = new JLabel();
this.$$$loadLabelText$$$(label3, this.$$$getMessageFromBundle$$$("locale", "TitleLbl"));
mainPanel.add(label3, cc.xy(5, 5));
mainPanel.add(destinationSelectBtn, new CellConstraints(1, 8, 3, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 0)));
ulDestinationRoLbl = new JLabel();
this.$$$loadLabelText$$$(ulDestinationRoLbl, this.$$$getMessageFromBundle$$$("locale", "ulDestinationLbl"));
mainPanel.add(ulDestinationRoLbl, cc.xy(5, 8));
diskImageRoLbl = new JLabel();
this.$$$loadLabelText$$$(diskImageRoLbl, this.$$$getMessageFromBundle$$$("locale", "DiskImageLbl"));
mainPanel.add(diskImageRoLbl, cc.xy(5, 4));
titleRoLbl = new JLabel();
this.$$$loadLabelText$$$(titleRoLbl, this.$$$getMessageFromBundle$$$("locale", "TitleLbl"));
mainPanel.add(titleRoLbl, cc.xy(5, 6));
CDRadioButton = new JRadioButton();
CDRadioButton.setText("CD");
mainPanel.add(CDRadioButton, cc.xy(1, 5));
this.$$$loadButtonText$$$(CDRadioButton, this.$$$getMessageFromBundle$$$("locale", "CD"));
mainPanel.add(CDRadioButton, cc.xy(1, 6));
DVDRadioButton = new JRadioButton();
DVDRadioButton.setSelected(true);
DVDRadioButton.setText("DVD");
mainPanel.add(DVDRadioButton, cc.xy(3, 5));
this.$$$loadButtonText$$$(DVDRadioButton, this.$$$getMessageFromBundle$$$("locale", "DVD"));
mainPanel.add(DVDRadioButton, cc.xy(3, 6));
convertBtn = new JButton();
convertBtn.setBackground(new Color(-2034433));
this.$$$loadButtonText$$$(convertBtn, this.$$$getMessageFromBundle$$$("locale", "ConvertBtn"));
mainPanel.add(convertBtn, new CellConstraints(1, 9, 7, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 5)));
mainPanel.add(convertBtn, new CellConstraints(1, 10, 9, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 5, 0, 5)));
progressBar = new JProgressBar();
progressBar.setBorderPainted(false);
progressBar.setForeground(new Color(-26368));
progressBar.setIndeterminate(false);
mainPanel.add(progressBar, cc.xyw(1, 12, 9, CellConstraints.FILL, CellConstraints.TOP));
final JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
panel1.setBackground(new Color(-9251843));
mainPanel.add(panel1, cc.xyw(1, 1, 9));
final JLabel label1 = new JLabel();
label1.setIcon(new ImageIcon(getClass().getResource("/banner.png")));
label1.setText("");
panel1.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
ulLangComboBox.setBackground(new Color(-9251843));
ulLangComboBox.setForeground(new Color(-1));
ulLangComboBox.putClientProperty("html.disable", Boolean.FALSE);
panel1.add(ulLangComboBox, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 1, false));
ulCfgBtn = new JButton();
ulCfgBtn.setBackground(new Color(-2031648));
ulCfgBtn.setMargin(new Insets(1, 1, 1, 1));
ulCfgBtn.setMinimumSize(new Dimension(130, 30));
ulCfgBtn.setPreferredSize(new Dimension(140, 30));
this.$$$loadButtonText$$$(ulCfgBtn, this.$$$getMessageFromBundle$$$("locale", "editUlCfgBtn"));
mainPanel.add(ulCfgBtn, new CellConstraints(9, 4, 1, 1, CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 5)));
statusJPanel = new JPanel();
statusJPanel.setLayout(new GridLayoutManager(1, 1, new Insets(5, 5, 5, 5), -1, -1));
statusJPanel.setBackground(new Color(-1));
mainPanel.add(statusJPanel, cc.xyw(1, 12, 7));
mainPanel.add(statusJPanel, cc.xyw(1, 14, 9));
statusLbl = new JLabel();
this.$$$loadLabelText$$$(statusLbl, this.$$$getMessageFromBundle$$$("locale", "WelcomeText"));
statusJPanel.add(statusLbl, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
progressBar = new JProgressBar();
progressBar.setBorderPainted(false);
progressBar.setForeground(new Color(-9251843));
progressBar.setIndeterminate(false);
mainPanel.add(progressBar, cc.xyw(1, 11, 7, CellConstraints.FILL, CellConstraints.DEFAULT));
final JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
panel1.setBackground(new Color(-9251843));
mainPanel.add(panel1, cc.xyw(1, 1, 7));
final JLabel label4 = new JLabel();
label4.setIcon(new ImageIcon(getClass().getResource("/banner.png")));
label4.setText("");
panel1.add(label4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
ButtonGroup buttonGroup;
buttonGroup = new ButtonGroup();
buttonGroup.add(DVDRadioButton);
@ -373,4 +394,5 @@ public class MainAppUi extends JFrame {
public JComponent $$$getRootComponent$$$() {
return mainPanel;
}
}

View File

@ -18,15 +18,19 @@
*/
package tihwin;
import java.util.Locale;
import java.util.prefs.Preferences;
public class Settings {
public static final Settings INSTANCE = new Settings();
private final Preferences preferences;
private final Locale locale;
Settings(){
this.preferences = Preferences.userRoot().node("tihwin");
String localeCode = preferences.get("locale", Locale.getDefault().toString());
this.locale = new Locale(localeCode.substring(0, 2), localeCode.substring(3));
}
public String getRomLocation(){
@ -48,4 +52,7 @@ public class Settings {
public void setDvdSelected(boolean value) {
preferences.putBoolean("dvd_selected", value);
}
public Locale getLocale(){ return this.locale; }
public void setLocale(String localeId){ preferences.put("locale", localeId); }
}

View File

@ -0,0 +1,229 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import tihwin.ui.ulupdater.*;
import tihwin.ul.UlConfiguration;
import tihwin.ul.UlServiceTools;
import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.io.File;
import java.nio.file.Files;
import java.util.*;
import java.util.List;
public class UpdateUlTableUi extends JFrame {
private JTable table;
private UlTableModel model;
private JButton saveChangesBtn;
private final JLabel ulLocationLbl;
private JLabel statusLbl;
private String recentRomLocation;
private final ResourceBundle resourceBundle;
public UpdateUlTableUi(String ulDestinationLocation) {
super();
this.resourceBundle = ResourceBundle.getBundle("locale");
this.ulLocationLbl = new JLabel(ulDestinationLocation);
this.recentRomLocation = ulDestinationLocation;
setupTable();
setupSaveButton();
FormLayout primaryPanelLayout = new FormLayout(
"80dlu, 2dlu, fill:pref:grow",
"fill:pref:grow, 25dlu:noGrow, 25dlu:noGrow, fill:pref:noGrow"
);
JPanel primaryPanel = new JPanel();
primaryPanel.setLayout(primaryPanelLayout);
primaryPanel.add(getScrollPane(), new CellConstraints(1, 1, 3, 1,
CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 0)));
primaryPanel.add(getSelectUlLocationButton(), new CellConstraints(1, 2, 1, 1,
CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(3, 3, 3, 3)));
primaryPanel.add(ulLocationLbl, new CellConstraints(3, 2, 1, 1,
CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 0)));
primaryPanel.add(saveChangesBtn, new CellConstraints(1, 3, 3, 1,
CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(3, 3, 3, 3)));
primaryPanel.add(getStatusPanel(), new CellConstraints(1, 4, 3, 1,
CellConstraints.DEFAULT, CellConstraints.DEFAULT, new Insets(0, 0, 0, 0)));
setLocationRelativeTo(null);
setContentPane(primaryPanel);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Image img = new ImageIcon(Objects.requireNonNull(
MainAppUi.class.getClassLoader().getResource("tray_icon.gif"))).getImage();
setIconImage(img);
setMinimumSize(new Dimension(800, 400));
setVisible(true);
setTitle(resourceBundle.getString("ulManager"));
File ulCfgFile = new File(ulDestinationLocation + File.separator + "ul.cfg");
if (ulCfgFile.exists())
showInTableUlCfgFile(ulCfgFile);
}
private void setupSaveButton(){
saveChangesBtn = new JButton(resourceBundle.getString("ulManagerWindow_SaveBtn"));
saveChangesBtn.setBackground(Color.getHSBColor(0.5591398f, 0.12156863f, 1));
saveChangesBtn.addActionListener(actionEvent -> saveChangesAction());
saveChangesBtn.setEnabled(false);
}
private void setupTable(){
model = new UlTableModel();
table = new JTable(model);
JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new UlTableHeaderRenderer());
header.setPreferredSize(new Dimension(header.getHeight(), 25));
table.setDefaultRenderer(JButton.class, new UlTableContentJButtonRenderer());
table.setDefaultRenderer(JLabel.class, new UlTableContentJLabelRenderer());
table.setRowHeight(30);
UlTableColumnModel columnModel = new UlTableColumnModel((DefaultTableColumnModel) table.getColumnModel());
table.setColumnModel(columnModel);
table.setRowSelectionAllowed(false);
}
private JScrollPane getScrollPane(){
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setPreferredSize(new Dimension(0,50));
return scrollPane;
}
private JButton getSelectUlLocationButton(){
JButton selectUlBtn = new JButton(resourceBundle.getString("ulManagerWindow_SelectUlCfgBtn"));
selectUlBtn.setBackground(Color.getHSBColor(0.5591398f, 0.12156863f, 1));
selectUlBtn.addActionListener(actionEvent -> selectUlCfgAction());
return selectUlBtn;
}
private JPanel getStatusPanel(){
statusLbl = new JLabel();
JPanel statusPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
statusPanel.setBackground(Color.white);
statusPanel.setBorder(new MatteBorder(1,0,0,0, Color.darkGray));
statusPanel.add(statusLbl);
return statusPanel;
}
private void showInTableUlCfgFile(File ulCfgFile){
try{
if (ulCfgFile.length() < 64){
statusLbl.setText(resourceBundle.getString("ulManagerWindow_EmptyOrIncorrectText")+" "+ulCfgFile.getAbsolutePath());
return;
}
model.clear();
String ulCfgFileLocation = ulCfgFile.getParentFile().getAbsolutePath();
for (int i = 0; i < ulCfgFile.length()/64; i++) {
UlConfiguration ulConfiguration = new UlConfiguration(ulCfgFile, i);
boolean isConsistent = UlServiceTools.verifyChunksCount(ulCfgFileLocation, ulConfiguration);
model.addRow(new UlTableModelRecord(ulConfiguration, isConsistent));
}
saveChangesBtn.setEnabled(true);
ulLocationLbl.setText(ulCfgFile.getParentFile().getAbsolutePath());
statusLbl.setText(ulCfgFile.getAbsolutePath());
}
catch (Exception e){
statusLbl.setText(resourceBundle.getString("ulManagerWindow_EmptyOrIncorrectText")+" "+e.getMessage());
e.printStackTrace();
}
}
private void saveChangesAction(){
try{
String ulLocation = ulLocationLbl.getText();
List<UlTableModelRecord> modelRecords = model.getInitialRows();
List<UlConfiguration> finalConfigurationSet = new ArrayList<>();
// Collect what we'll have in the final ul.cfg file
for (int i = 0; i < modelRecords.size(); i++){
UlConfiguration configuration = new UlConfiguration(
model.getTitle(i),
model.getPublisherTitle(i),
model.getChunksCount(i),
model.getCdDvd(i).equals("DVD")
);
finalConfigurationSet.add(configuration);
}
// Updating chunk file names if needed
for (int i = 0; i < modelRecords.size(); i++){
UlTableModelRecord initialRecord = modelRecords.get(i);
String initialRecordTitle = initialRecord.getConfiguration().getTitle();
if (initialRecord.isConsistent() && ! model.getTitle(i).equals(initialRecordTitle)){
UlServiceTools.renameChunks(ulLocation,
initialRecord.getConfiguration(),
finalConfigurationSet.get(i));
}
}
// Remove chunks in case user removed record from the table
List<UlTableModelRecord> removedRows = model.getRemovedRows();
for (UlTableModelRecord removedRow : removedRows) {
UlServiceTools.removeChunks(ulLocation, removedRow.getConfiguration());
}
// Write new ul.cfg
UlServiceTools.writeUlCfgFile(ulLocation, finalConfigurationSet);
File ulCfgFile = new File(ulLocation+File.separator+"ul.cfg");
if (ulCfgFile.length() == 0) {
Files.deleteIfExists(ulCfgFile.toPath());
saveChangesBtn.setEnabled(false);
}
else {
showInTableUlCfgFile(ulCfgFile);
}
statusLbl.setText(resourceBundle.getString("SuccessText"));
}
catch (Exception e){
statusLbl.setText(resourceBundle.getString("ulManagerWindow_SaveChangesFailureText")+" "+e.getMessage());
e.printStackTrace();
}
}
private void selectUlCfgAction(){
try {
JFileChooser fileChooser = new JFileChooser(FilesHelper.getRealFolder(recentRomLocation));
fileChooser.setDialogTitle(resourceBundle.getString("ulManagerWindow_SelectUlCfgBtn"));
fileChooser.setFileFilter(new UlCfgFileFilter());
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
recentRomLocation = file.getParent();
showInTableUlCfgFile(file);
}
} catch (Exception e) {
statusLbl.setText(e.getMessage());
e.printStackTrace();
}
}
}

View File

@ -23,7 +23,7 @@ import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
public class DirectoryEntry {
private final int extentLocation; // lsb start
private final int extentLocation; // lsb start
private final int dataSize;
private final String identifier;

View File

@ -35,7 +35,7 @@ public class ISO9660 {
this.resourceBundle = ResourceBundle.getBundle("locale");
skipFirst16Sectors();
getRootDirectoryDescriptor();
getSystemCnfContent(rootEntry);
getSystemCnfContent();
}
private void skipFirst16Sectors() throws Exception{
randomAccessFile.seek(2048*16);
@ -59,14 +59,14 @@ public class ISO9660 {
this.rootEntry = new DirectoryEntry(Arrays.copyOfRange(firstPayloadDescriptor, 0x9c, 0xbe));
}
private void getSystemCnfContent(DirectoryEntry entry) throws Exception{
randomAccessFile.seek(entry.getExtentLocation() * 2048L);
byte[] bytes = new byte[entry.getDataSize()];
if (entry.getDataSize() != randomAccessFile.read(bytes))
private void getSystemCnfContent() throws Exception{
randomAccessFile.seek(rootEntry.getExtentLocation() * 2048L);
byte[] bytes = new byte[rootEntry.getDataSize()];
if (rootEntry.getDataSize() != randomAccessFile.read(bytes))
throw new Exception(resourceBundle.getString("ISO_CantReadRootDescriptor"));
int entryOffset = 0;
while (entryOffset < entry.getDataSize()){
while (entryOffset < rootEntry.getDataSize()){
int entryLength = Byte.toUnsignedInt(bytes[entryOffset]);
if (entryLength == 0)

View File

@ -0,0 +1,70 @@
/*
Copyright 2023 Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui;
import tihwin.AwesomeMediator;
import tihwin.UpdateUlTableUi;
import javax.swing.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.*;
import java.io.File;
import java.util.List;
public class FilesDropListener extends DropTargetAdapter {
public FilesDropListener(JPanel panel){
new DropTarget(panel, DnDConstants.ACTION_COPY, this, true, null);
}
@Override
public void drop(DropTargetDropEvent event) {
if (! event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
event.rejectDrop();
return;
}
event.acceptDrop(DnDConstants.ACTION_COPY);
Transferable transferable = event.getTransferable();
try {
List<File> files = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
for (File file : files) {
if (file.isDirectory()){
AwesomeMediator.setDestination(file);
break;
}
// Pick up first ISO file found and drop iteration
if (file.getName().toLowerCase().endsWith(".iso")) {
AwesomeMediator.setDiskImage(file);
break;
}
// If no ISO maybe there are ul.cfg than
if (file.isFile() && file.getName().equalsIgnoreCase("ul.cfg")){
new UpdateUlTableUi(file.getParentFile().getAbsolutePath());
break;
}
}
} catch (Exception e) {
e.printStackTrace();
event.rejectDrop();
}
event.dropComplete(true);
}
}

View File

@ -20,11 +20,11 @@
*/
package tihwin.ui;
import javax.swing.filechooser.FileFilter;
import java.io.File;
import java.io.FileFilter;
import java.util.ResourceBundle;
public class IsoFileFilter extends javax.swing.filechooser.FileFilter implements FileFilter {
public class IsoFileFilter extends FileFilter {
@Override
public boolean accept(File file) {
if (file.isDirectory())

View File

@ -0,0 +1,81 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui;
import tihwin.ui.model.LocaleHolder;
import tihwin.ui.model.SettingsLanguagesSetup;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicComboBoxUI;
import java.awt.*;
import java.util.List;
public class LanguageComboBox extends JComboBox<LocaleHolder> {
private static final Color COLOR_SKY_BLUE = new Color(114, 211, 253);
private final Color COLOR_DARK = new Color(71, 81, 93);
private final Border myBorder = new EmptyBorder(5, 10, 5, 10);
public LanguageComboBox(){
super();
UIManager.put("ComboBox.selectionForeground", COLOR_DARK);
UIManager.put("ComboBox.selectionBackground", COLOR_SKY_BLUE);
UIManager.put("ComboBox.squareButton", Boolean.FALSE);
setUI(new BasicComboBoxUI(){
@Override
protected JButton createArrowButton() {
JButton button = new JButton();
button.setBackground(COLOR_SKY_BLUE);
button.setBorder(BorderFactory.createEmptyBorder());
button.setVisible(false);
return button;
}
});
ListCellRenderer<LocaleHolder> current = (ListCellRenderer<LocaleHolder>) getRenderer();
setRenderer((list, localeHolder, index, isSelected, hasFocus) -> {
JLabel component = (JLabel) current.getListCellRendererComponent(list, localeHolder, index, isSelected, hasFocus);
component.setHorizontalAlignment(SwingConstants.RIGHT);
component.setBorder(myBorder);
if (isSelected) {
component.setForeground(COLOR_DARK);
component.setBackground(Color.ORANGE);
} else {
component.setForeground(Color.white);
component.setBackground(COLOR_DARK);
}
return component;
});
setForeground(Color.white);
setBackground(COLOR_SKY_BLUE);
SettingsLanguagesSetup setup = new SettingsLanguagesSetup();
List<LocaleHolder> languages = setup.getLanguages();
for (LocaleHolder lang: languages)
addItem(lang);
this.setSelectedItem(setup.getRecentLanguage());
}
}

View File

@ -25,13 +25,12 @@ import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TitleFieldFilter extends DocumentFilter {
private final static int MAX_USER_DEFINED_GAME_TITLE_LENGTH = 31;
private final static int MAX_USER_DEFINED_GAME_TITLE_LENGTH = 32;
public TitleFieldFilter() {}
protected boolean isNotAscii(String str){
if (str == null)
return false;
return ! str.matches("\\A\\p{ASCII}*\\z");
}
@ -40,7 +39,7 @@ public class TitleFieldFilter extends DocumentFilter {
if (isNotAscii(str))
return;
int documentLength = fb.getDocument().getLength();
if ((documentLength + str.length()) <= MAX_USER_DEFINED_GAME_TITLE_LENGTH)
if ((documentLength + str.length()) < MAX_USER_DEFINED_GAME_TITLE_LENGTH)
super.insertString(fb, offs, str, attr);
}
@ -49,7 +48,8 @@ public class TitleFieldFilter extends DocumentFilter {
if (isNotAscii(str))
return;
int documentLength = fb.getDocument().getLength();
if ((documentLength + str.length() - length) <= MAX_USER_DEFINED_GAME_TITLE_LENGTH)
if ((documentLength + str.length() - length) < MAX_USER_DEFINED_GAME_TITLE_LENGTH)
super.replace(fb, offs, length, str, attr);
}
}

View File

@ -0,0 +1,57 @@
/*
Copyright 2022 Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class TwButtonsActionListener implements MouseListener {
private final Border normalBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.gray),
BorderFactory.createEmptyBorder(5, 5, 5, 5));
private final Border boldBorder = BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.gray),
BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(new Color(164, 181, 255)),
BorderFactory.createEmptyBorder(4, 4, 4, 4)
)
);
@Override
public void mouseEntered(MouseEvent mouseEvent) {
((JButton) mouseEvent.getSource()).setBorder(boldBorder);
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
((JButton) mouseEvent.getSource()).setBorder(normalBorder);
}
@Override
public void mouseClicked(MouseEvent mouseEvent) {}
@Override
public void mousePressed(MouseEvent mouseEvent) {}
@Override
public void mouseReleased(MouseEvent mouseEvent) {}
}

View File

@ -32,6 +32,7 @@ public class UiUpdater {
this.progressBar = progressBar;
this.statusLine = statusLine;
progressBar.setMaximum(100);
progressBar.setStringPainted(true);
}
public synchronized void updateProgressBySize(int value){
@ -49,6 +50,7 @@ public class UiUpdater {
public void close(){
progressBar.setValue(0);
progressBar.setStringPainted(false);
AwesomeMediator.notifyAllConvertsEnded();
}
}

View File

@ -0,0 +1,58 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.model;
import java.util.Locale;
public class LocaleHolder {
private final Locale locale;
private final String localeCode;
private final String languageName;
public LocaleHolder(String localeFileName) {
String language = localeFileName.substring(7, 9);
String country;
if (localeFileName.length() > 23)
country = localeFileName.substring(10, localeFileName.indexOf('.'));
else
country = localeFileName.substring(10, 12);
this.locale = new Locale(language, country);
this.localeCode = locale.toString();
if (country.equals("RYU")) // Ryukyuan
this.languageName = "琉球語派";
else
this.languageName = locale.getDisplayLanguage(locale).toUpperCase();
}
@Override
public String toString(){
return languageName;
}
public String getLocaleCode(){
return localeCode;
}
public Locale getLocale() {
return locale;
}
}

View File

@ -0,0 +1,127 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.model;
import tihwin.Settings;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class SettingsLanguagesSetup {
private final List<LocaleHolder> languages;
private File thisApplicationFile;
private LocaleHolder recentlyUsedLanguageHolder;
public SettingsLanguagesSetup() {
this.languages = new ArrayList<>();
parseFiles();
sortLanguages();
defineRecentlyUsedLanguageHolder();
}
private void parseFiles() {
if (isApplicationIsJar()) // Executed as JAR file
parseFilesInsideJar();
else // Executed within IDE
parseFilesInFilesystem();
}
private boolean isApplicationIsJar() {
getThisApplicationFile();
return thisApplicationFile != null && thisApplicationFile.isFile();
}
private void getThisApplicationFile() {
try {
String encodedJarLocation =
getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("+", "%2B");
this.thisApplicationFile = new File(URLDecoder.decode(encodedJarLocation, "UTF-8"));
} catch (UnsupportedEncodingException uee) {
uee.printStackTrace();
this.thisApplicationFile = null;
}
}
private void parseFilesInsideJar() {
try {
JarFile jar = new JarFile(thisApplicationFile);
Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
while (entries.hasMoreElements()) {
String name = entries.nextElement().getName();
if (name.startsWith("locale_")) {
languages.add(new LocaleHolder(name));
}
}
jar.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
private void parseFilesInFilesystem() {
URL resourceURL = this.getClass().getResource("/");
String[] filesList = new File(resourceURL.getFile()).list(); // Screw it. This WON'T produce NullPointerException
for (String jarFileName : filesList) {
if (jarFileName.startsWith("locale_")) {
languages.add(new LocaleHolder(jarFileName));
}
}
}
private void sortLanguages() {
languages.sort(Comparator.comparing(LocaleHolder::toString));
}
private void defineRecentlyUsedLanguageHolder() {
Locale localeFromPreferences = Settings.INSTANCE.getLocale();
for (LocaleHolder holder : languages) {
Locale holderLocale = holder.getLocale();
if (holderLocale.equals(localeFromPreferences)) {
this.recentlyUsedLanguageHolder = holder;
return;
}
}
// Otherwise define default one that is "en_US"
for (LocaleHolder holder : languages) {
if (holder.getLocaleCode().equals("en_US")) {
this.recentlyUsedLanguageHolder = holder;
return;
}
}
}
public List<LocaleHolder> getLanguages() {
return languages;
}
public LocaleHolder getRecentLanguage() {
return recentlyUsedLanguageHolder;
}
}

View File

@ -0,0 +1,38 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
public class UlButtonCellEditor extends AbstractCellEditor implements TableCellEditor {
@Override
public Object getCellEditorValue() {
return null;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
((UlTableModel) table.getModel()).removeRow(row);
return null;
}
}

View File

@ -0,0 +1,34 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.*;
public class UlCdDvdCellEditor extends DefaultCellEditor {
static {
CD_DVD = new String[]{"CD", "DVD"};
}
private static final String[] CD_DVD;
public UlCdDvdCellEditor(){
super(new JComboBox<>(CD_DVD));
}
}

View File

@ -0,0 +1,38 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.filechooser.FileFilter;
import java.io.File;
public class UlCfgFileFilter extends FileFilter {
@Override
public boolean accept(File file) {
if (file.isDirectory())
return true;
return file.getName().equalsIgnoreCase("ul.cfg");
}
@Override
public String getDescription() {
return "ul.cfg";
}
}

View File

@ -0,0 +1,107 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import tihwin.ui.TitleFieldFilter;
import javax.swing.*;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.text.AbstractDocument;
import java.util.Enumeration;
public class UlTableColumnModel extends DefaultTableColumnModel {
public UlTableColumnModel(DefaultTableColumnModel parentModel){
Enumeration<TableColumn> columns = parentModel.getColumns();
while (columns.hasMoreElements()){
addColumn(columns.nextElement());
}
getColumn(0).setMinWidth(20);
getColumn(0).setPreferredWidth(25);
getColumn(0).setMaxWidth(50);
getColumn(1).setMinWidth(200);
getColumn(1).setPreferredWidth(230);
getColumn(1).setMaxWidth(300);
getColumn(2).setMinWidth(100);
getColumn(2).setPreferredWidth(135);
getColumn(2).setMaxWidth(150);
getColumn(3).setMinWidth(75);
getColumn(3).setPreferredWidth(100);
getColumn(3).setMaxWidth(125);
getColumn(4).setMinWidth(50);
getColumn(4).setPreferredWidth(75);
getColumn(4).setMaxWidth(100);
getColumn(5).setMinWidth(100);
getColumn(5).setPreferredWidth(135);
getColumn(5).setMaxWidth(150);
JTextField textField = new JTextField();
((AbstractDocument) textField.getDocument()).setDocumentFilter(new TitleFieldFilter());
getColumn(1).setCellEditor(new DefaultCellEditor(textField));
getColumn(4).setCellEditor(new UlCdDvdCellEditor());
getColumn(5).setCellEditor(new UlButtonCellEditor());
setColumnSelectionAllowed(false);
}
@Override
public void addColumn(TableColumn aColumn) {
super.addColumn(aColumn);
}
@Override
public void removeColumn(TableColumn column) {
super.removeColumn(column);
}
@Override
public void moveColumn(int columnIndex, int newIndex) {}
@Override
protected void fireColumnAdded(TableColumnModelEvent e) {
super.fireColumnAdded(e);
}
@Override
protected void fireColumnRemoved(TableColumnModelEvent e) {
super.fireColumnRemoved(e);
}
@Override
protected void fireColumnMoved(TableColumnModelEvent e) {
super.fireColumnMoved(e);
}
@Override
protected void fireColumnMarginChanged() {
super.fireColumnMarginChanged();
}
}

View File

@ -0,0 +1,42 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
public class UlTableContentJButtonRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column){
JButton button = (JButton) value;
if (hasFocus)
button.setBackground(Color.getHSBColor(0.559524f, 0.119658f, 0.917647f));
else
button.setBackground(Color.getHSBColor(0.5591398f, 0.12156863f, 1));
return button;
}
}

View File

@ -0,0 +1,53 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
public class UlTableContentJLabelRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column){
JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setBackground(Color.getHSBColor(0, 0, 0.9411765f));
label.setBorder(new EmptyBorder(0, 3, 0, 3));
switch (column){
case 0:
case 3:
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setOpaque(true);
break;
case 2:
label.setHorizontalAlignment(SwingConstants.LEFT);
label.setOpaque(true);
break;
default:
label.setHorizontalAlignment(SwingConstants.LEFT);
label.setOpaque(false);
}
return label;
}
}

View File

@ -0,0 +1,42 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
public class UlTableHeaderRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column){
JLabel label = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Font font = label.getFont();
label.setFont(new Font(font.getFontName(), Font.BOLD, font.getSize()));
label.setBorder(new LineBorder(Color.darkGray));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBackground(Color.getHSBColor(0.33333334f, 0.12765957f, 0.92156863f));
return label;
}
}

View File

@ -0,0 +1,127 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
public class UlTableModel extends DefaultTableModel {
private final String REMOVE_ME_BUTTON_TEXT;
private final String OK_STATUS;
private final String INCONSISTENT_STATUS;
private final List<UlTableModelRecord> rows;
private final List<UlTableModelRecord> removedRows;
public UlTableModel(){
super();
ResourceBundle bundle = ResourceBundle.getBundle("locale");
String[] columns = new String[]{
bundle.getString("ulManagerWindow_ColumnNameNumber"),
bundle.getString("ulManagerWindow_ColumnNameTitle"),
bundle.getString("ulManagerWindow_ColumnNamePublisherTitle"),
bundle.getString("ulManagerWindow_ColumnNameChunksCount"),
bundle.getString("ulManagerWindow_ColumnCdDvdFlag"),
"",
""};
super.setColumnIdentifiers(columns);
REMOVE_ME_BUTTON_TEXT = bundle.getString("ulManagerWindow_Row_RemoveRowBtn");
OK_STATUS = bundle.getString("Ok");
INCONSISTENT_STATUS = bundle.getString("ulManagerWindow_InconsistentFileText");
this.rows = new ArrayList<>();
this.removedRows = new ArrayList<>();
}
public void addRow(UlTableModelRecord record){
rows.add(record);
super.addRow(new Object[]{
rows.size(),
record.getConfiguration().getTitle(),
record.getConfiguration().getPublisherTitle(),
record.getConfiguration().getChunksCount(),
record.getConfiguration().isDvd()? "DVD" : "CD",
new JButton(REMOVE_ME_BUTTON_TEXT),
record.isConsistent()?OK_STATUS:INCONSISTENT_STATUS
});
}
@Override
public Class<?> getColumnClass(int column) {
if (column == 5)
return JButton.class;
return JLabel.class;
}
@Override
public boolean isCellEditable(int row, int column) {
switch (column){
case 1:
case 4:
case 5:
return true;
default:
return false;
}
}
@Override
public void removeRow(int row) {
removedRows.add(rows.get(row));
rows.remove(row);
super.removeRow(row);
for (int i = row; i < rows.size(); i++)
setValueAt(i+1, i, 0);
}
public void clear(){
for (int i = getRowCount()-1; i >= 0 ; i--)
super.removeRow(i);
rows.clear();
removedRows.clear();
}
public List<UlTableModelRecord> getInitialRows(){
return rows;
}
public List<UlTableModelRecord> getRemovedRows() {
return removedRows;
}
public String getTitle(int row){
return (String) getValueAt(row, 1);
}
public String getPublisherTitle(int row){
return (String) getValueAt(row, 2);
}
public byte getChunksCount(int row){
return (byte) getValueAt(row, 3);
}
public String getCdDvd(int row){
return (String) getValueAt(row, 4);
}
}

View File

@ -0,0 +1,41 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ui.ulupdater;
import tihwin.ul.UlConfiguration;
public class UlTableModelRecord {
private final UlConfiguration configuration;
private final boolean isConsistent;
public UlTableModelRecord(UlConfiguration configuration, boolean isConsistent){
this.configuration = configuration;
this.isConsistent = isConsistent;
}
public UlConfiguration getConfiguration() {
return configuration;
}
public boolean isConsistent() {
return isConsistent;
}
}

View File

@ -20,27 +20,53 @@
*/
package tihwin.ul;
import java.io.BufferedInputStream;
import java.io.File;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
public class UlConfiguration {
private static final byte DVD_FLAG = 0x14;
private static final byte CD_FLAG = 0x12;
private final String title;
private final String publisherTitle;
private final String crc32;
private final byte chunksCount;
private final byte cdDvdFlag;
private final boolean romIsDvdImage;
public UlConfiguration(File ulCfg, int recordNumber) throws Exception{
try(BufferedInputStream stream = new BufferedInputStream(Files.newInputStream(ulCfg.toPath()))){
int offset = recordNumber * 0x40;
int read = 0;
while (offset != read)
read += stream.skip(offset);
byte[] buffer = new byte[0x40];
if (0x40 != stream.read(buffer))
throw new Exception(recordNumber+" 0x40");
this.title = new String(buffer, 0, 0x20, StandardCharsets.US_ASCII).trim();
this.publisherTitle = new String(buffer, 0x23, 0xB, StandardCharsets.US_ASCII).trim();
this.crc32 = String.format("%08x", OplCRC32(title)).toUpperCase();
this.chunksCount = buffer[0x2f];
this.cdDvdFlag = buffer[0x30];
this.romIsDvdImage = (cdDvdFlag == DVD_FLAG);
}
}
public UlConfiguration(String title, String publisherTitle, byte chunksCount, boolean isDVD) throws Exception{
this.title = title;
this.publisherTitle = publisherTitle;
this.crc32 = Integer.toHexString(OplCRC32(title)).toUpperCase();
this.crc32 = String.format("%08x", OplCRC32(title)).toUpperCase();
this.chunksCount = chunksCount;
if (isDVD)
cdDvdFlag = 0x14;
cdDvdFlag = DVD_FLAG;
else
cdDvdFlag = 0x12;
cdDvdFlag = CD_FLAG;
this.romIsDvdImage = isDVD;
}
private int OplCRC32(String string) throws Exception{
@ -75,6 +101,14 @@ public class UlConfiguration {
return crc32;
}
public String getTitle() {
return title;
}
public boolean isDvd() {
return romIsDvdImage;
}
public String getPublisherTitle() {
return publisherTitle;
}

View File

@ -0,0 +1,93 @@
/*
Copyright "2022" Dmitry Isaenko
This file is part of Tihwin.
Tihwin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Tihwin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Tihwin. If not, see <https://www.gnu.org/licenses/>.
*/
package tihwin.ul;
import java.io.BufferedOutputStream;
import java.io.File;
import java.nio.file.*;
import java.util.List;
public class UlServiceTools {
public static boolean verifyChunksCount(String ulCfgLocation, UlConfiguration configuration){
int declaredChunksCount = configuration.getChunksCount();
File[] files = collectChunks(ulCfgLocation, configuration);
int realChunkCount = 0;
for (File chunkFile : files) {
if (chunkFile.exists())
realChunkCount++;
}
return declaredChunksCount == realChunkCount;
}
private static File[] collectChunks(String ulCfgLocation, UlConfiguration configuration){
String pattern = makePattern(ulCfgLocation, configuration);
int declaredChunksCount = configuration.getChunksCount();
File[] files = new File[declaredChunksCount];
for (int i = 0; i < declaredChunksCount; i++) {
File chunkFile = new File(String.format(pattern, i));
files[i] = chunkFile;
}
return files;
}
private static String makePattern(String ulCfgLocation, UlConfiguration configuration){
return ulCfgLocation +
File.separator +
String.format("ul.%s.%s.", configuration.getCrc32(), configuration.getPublisherTitle()) +
"%02d";
}
public static void renameChunks(String ulCfgLocation,
UlConfiguration oldConfiguration,
UlConfiguration newConfiguration) throws Exception{
String pattern = makePattern(ulCfgLocation, newConfiguration);
File[] files = collectChunks(ulCfgLocation, oldConfiguration);
for (int i = 0; i < files.length; i++){
String fileName = String.format(pattern, i);
Files.move(files[i].toPath(), Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING);
}
}
public static void removeChunks(String ulCfgLocation, UlConfiguration configuration) throws Exception{
File[] files = collectChunks(ulCfgLocation, configuration);
for (File file : files) {
Files.deleteIfExists(file.toPath());
}
}
public static void writeUlCfgFile(String ulCfgLocation, List<UlConfiguration> fileContent) throws Exception{
String ulCfg = ulCfgLocation + File.separator + "ul.cfg";
try (BufferedOutputStream stream = new BufferedOutputStream(Files.newOutputStream(Paths.get(ulCfg)))){
for (UlConfiguration configuration: fileContent){
stream.write(configuration.generateUlConfig());
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -8,7 +8,7 @@ InterruptedAndFilesDeletedText=Task interrupted and file chunks deleted
InterruptedAndFilesNotDeletedText=Task interrupted and file chunks are NOT deleted
InterruptedText=Interrupted
isoFilesText=ISO files
WelcomeText=Welcome! It's Tihwin: ul-utility for your PS2! GPLv3+, 2022, Dmitry Isaenko
WelcomeText=Welcome! It's Tihwin: ul-utility for your PS2! GPLv3+, 2022-2023, Dmitry Isaenko
SelectBtn=Select
SelectDiskImageText=Select disk image
SetDestinationDirectoryText=Set destination directory
@ -22,3 +22,19 @@ ISO_CantReadRootDescriptor=Can't read CD/DVD directory entry for the root direct
ISO_NoSystemCnf=SYSTEM.CNF not found in this CD/DVD. Is it a PS2 Disk?
ISO_PublisherTitleNotFound=Title not found. SYSTEM.CNF file is next:
PleaseWaitText=Please wait while useless file fragments removing...
editUlCfgBtn=Edit ul.cfg
ulManager=ul.cfg manager
ulManagerWindow_ColumnNameNumber=#
ulManagerWindow_ColumnNameTitle=Name
ulManagerWindow_ColumnNamePublisherTitle=Publisher title
ulManagerWindow_ColumnNameChunksCount=Chunks count
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
ulManagerWindow_Row_RemoveRowBtn=Remove
ulManagerWindow_SaveBtn=Save changes
ulManagerWindow_SelectUlCfgBtn=Select ul.cfg
ulManagerWindow_EmptyOrIncorrectText=Empty or incorrect ul.cfg size
ulManagerWindow_InconsistentFileText=One or more chunks not found. It is recommended to delete this entry.
Ok=Ok
CD=CD
DVD=DVD
ulManagerWindow_SaveChangesFailureText=Save changes failure:

View File

@ -0,0 +1,40 @@
AbortText=Abortar
ISO_CantReadISOInitialDescriptorText=No se pudo leer el Descriptor de Volumen Primario del CD/DVD
ConvertBtn=Convertir/Instalar
DiskImageLbl=Imagen de disco:
FailedText=Error!
InProgressText=Procesando...
InterruptedAndFilesDeletedText=Tarea interrumpida y archivos fraccionados eliminados
InterruptedAndFilesNotDeletedText=Tarea interrumpida y archivos fraccionados NO eliminados
InterruptedText=Interrumpido
isoFilesText=Archivos ISO
WelcomeText=Bienvenido! Soy Tihwin: una utilidad de formato ul para tu PS2! GPLv3+, 2022-2023, Dmitry Isaenko
SelectBtn=Seleccionar
SelectDiskImageText=Seleccionar imagen de disco
SetDestinationDirectoryText=Elegir directorio de destino
SizesDifferent=Error en el chequeo de tama\u00F1o del archivo. NO utilices este archivo!
SuccessText=\u00C9xito!
TitleLbl=T\u00EDtulo:
ulDestinationLbl=Destino de ul:
UnableCheckResultsText=No se pudo comprobar los resultados. Algo sali\u00F3 mal
ISO_NotSupportedCdDvd=Formato de CD/DVD no soportado
ISO_CantReadRootDescriptor=No se pudo leer el directorio ra\u00EDz del CD/DVD
ISO_NoSystemCnf=No se encontr\u00F3 SYSTEM.CNF en este CD/DVD. Es un disco de PS2?
ISO_PublisherTitleNotFound=Titulo no encontrado. El archivo SYSTEM.CNF es el siguiente:
PleaseWaitText=Por favor, espera mientras que se quitan los fragmentos innecesarios del archivo...
editUlCfgBtn=Editar ul.cfg
ulManager=Administrador de ul.cfg
ulManagerWindow_ColumnNameNumber=#
ulManagerWindow_ColumnNameTitle=T\u00EDtulo
ulManagerWindow_ColumnNamePublisherTitle=T\u00EDtulo del editor
ulManagerWindow_ColumnNameChunksCount=N\u00FAm. fragmentos
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
ulManagerWindow_Row_RemoveRowBtn=Eliminar
ulManagerWindow_SaveBtn=Guardar cambios
ulManagerWindow_SelectUlCfgBtn=Seleccionar ul.cfg
ulManagerWindow_EmptyOrIncorrectText=Archivo ul.cfg vac\u00EDo o de tama\u00F1o incorrecto
ulManagerWindow_InconsistentFileText=Uno o mas fragmentos no han sido encontrados. Se recomienda eliminar este t\u00EDtulo.
Ok=Ok
CD=CD
DVD=DVD
ulManagerWindow_SaveChangesFailureText=Error al guardar cambios:

View File

@ -0,0 +1,40 @@
AbortText=\u4E2D\u6B62
ISO_CantReadISOInitialDescriptorText=CD/DVD\u306E\u30D7\u30E9\u30A4\u30DE\u30EA\u30DC\u30EA\u30E5\u30FC\u30E0\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF\u304C\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093
ConvertBtn=\u5909\u63DB/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB
DiskImageLbl=\u30C7\u30A3\u30B9\u30AF\u30A4\u30E1\u30FC\u30B8\uFF1A
FailedText=\u5931\u6557\u3057\u307E\u3057\u305F\uFF01
InProgressText=\u9032\u884C\u4E2D...
InterruptedAndFilesDeletedText=\u30BF\u30B9\u30AF\u304C\u4E2D\u65AD\u3055\u308C\u3001\u30D5\u30A1\u30A4\u30EB\u30C1\u30E3\u30F3\u30AF\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F
InterruptedAndFilesNotDeletedText=\u30BF\u30B9\u30AF\u306E\u4E2D\u65AD\u3068\u30D5\u30A1\u30A4\u30EB\u30C1\u30E3\u30F3\u30AF\u306E\u524A\u9664\u306F\u3055\u308C\u307E\u305B\u3093\u3002
InterruptedText=\u4E2D\u65AD
isoFilesText=ISO\u30D5\u30A1\u30A4\u30EB
WelcomeText=\u3088\u3046\u3053\u305D\uFF01 Tihwin: PS2\u306E\u305F\u3081\u306Eul-utility\u3067\u3059\uFF01 GPLv3+, 2022-2023, Dmitry Isaenko
SelectBtn=\u9078\u629E
SelectDiskImageText=\u30C7\u30A3\u30B9\u30AF\u30A4\u30E1\u30FC\u30B8\u3092\u9078\u629E
SetDestinationDirectoryText=\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u8A2D\u5B9A
SizesDifferent=\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u306E\u30C1\u30A7\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 \u3053\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4F7F\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
SuccessText=\u6210\u529F\u3057\u307E\u3057\u305F\uFF01
TitleLbl=\u30BF\u30A4\u30C8\u30EB\uFF1A
ulDestinationLbl=\u6700\u7D42\u76EE\u7684\u5730\uFF1A
UnableCheckResultsText=\u7D50\u679C\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3002 \u305D\u308C\u306F\u4F55\u304B\u304C\u9593\u9055\u3063\u3066\u3044\u305F\u3053\u3068\u3092\u610F\u5473\u3057\u307E\u3059
ISO_NotSupportedCdDvd=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044 CD/DVD\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8
ISO_CantReadRootDescriptor=\u30EB\u30FC\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E CD/DVD \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30A8\u30F3\u30C8\u30EA\u3092\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093
ISO_NoSystemCnf=\u3053\u306E CD/DVD \u306BSYSTEM.CNF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 PS2\u306E\u30C7\u30A3\u30B9\u30AF\u3067\u3059\u304B\uFF1F
ISO_PublisherTitleNotFound=\u30BF\u30A4\u30C8\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002SYSTEM.CNF\u30D5\u30A1\u30A4\u30EB\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059\uFF1A
PleaseWaitText=\u4E0D\u8981\u306A\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u3066\u3044\u307E\u3059\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044...
editUlCfgBtn=ul.cfg\u3092\u7DE8\u96C6
ulManager=ul.cfg\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC
ulManagerWindow_ColumnNameNumber=#
ulManagerWindow_ColumnNameTitle=\u540D\u524D
ulManagerWindow_ColumnNamePublisherTitle=\u30D1\u30D6\u30EA\u30C3\u30B7\u30E3\u30FC\u540D
ulManagerWindow_ColumnNameChunksCount=\u30C1\u30E3\u30F3\u30AF\u6570
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
ulManagerWindow_Row_RemoveRowBtn=\u524A\u9664
ulManagerWindow_SaveBtn=\u5909\u66F4\u5185\u5BB9\u3092\u4FDD\u5B58
ulManagerWindow_SelectUlCfgBtn=ul.cfg\u3092\u9078\u629E
ulManagerWindow_EmptyOrIncorrectText=\u7A7A\u307E\u305F\u306F\u4E0D\u6B63\u306Aul.cfg\u306E\u30B5\u30A4\u30BA
ulManagerWindow_InconsistentFileText=\uFF11\u3064\u4EE5\u4E0A\u306E\u30C1\u30E3\u30F3\u30AF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u3053\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3059\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\u3002
Ok=Ok
CD=CD
DVD=DVD
ulManagerWindow_SaveChangesFailureText=\u5909\u66F4\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A

View File

@ -0,0 +1,40 @@
AbortText=\u4E2D\u6B62
ISO_CantReadISOInitialDescriptorText=CD/DVD\u306C\u30D7\u30E9\u30A4\u30DE\u30EA\u30DC\u30EA\u30E5\u30FC\u30E0\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF\u306C\u8AAD\u307F\u53D6\u308A\u3084\u3073\u3089\u3093
ConvertBtn=\u5909\u63DB/\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB
DiskImageLbl=\u30C7\u30A3\u30B9\u30AF\u30A4\u30E1\u30FC\u30B8\uFF1A
FailedText=\u3057\u30FC\u3084\u3093\u3058\u3083\u3073\u305F\u3093\uFF01
InProgressText=\u9032\u884C\u4E2D...
InterruptedAndFilesDeletedText=\u30BF\u30B9\u30AF\u306C\u4E2D\u65AD\u3055\u308C\u3044\u3001\u30D5\u30A1\u30A4\u30EB\u30C1\u30E3\u30F3\u30AF\u306C\u524A\u9664\u3055\u308A\u3084\u3073\u305F\u3093
InterruptedAndFilesNotDeletedText=\u30BF\u30B9\u30AF\u306C\u4E2D\u65AD\u3068\u3045\u30D5\u30A1\u30A4\u30EB\u30C1\u30E3\u30F3\u30AF\u306C\u524A\u9664\u30FC\u3055\u308A\u3084\u3073\u3089\u3093\u3002
InterruptedText=\u4E2D\u65AD
isoFilesText=ISO\u30D5\u30A1\u30A4\u30EB
WelcomeText=\u3081\u3093\u305D\u30FC\u308C\u30FC\uFF01 Tihwin: PS2\u306C\u305F\u307F\u306Cul-utility\u3084\u3044\u3073\u30FC\u3093\uFF01 GPLv3+, 2022-2023, Dmitry Isaenko
SelectBtn=\u9078\u629E
SelectDiskImageText=\u30C7\u30A3\u30B9\u30AF\u30A4\u30E1\u30FC\u30B8\u9078\u629E
SetDestinationDirectoryText=\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306C\u8A2D\u5B9A
SizesDifferent=\u30D5\u30A1\u30A4\u30EB\u30B5\u30A4\u30BA\u306C\u30C1\u30A7\u30C3\u30AF\u3093\u304B\u3044\u3057\u30FC\u3084\u3093\u3058\u3083\u3073\u305F\u3093\u3002 \u304F\u306C\u30D5\u30A1\u30A4\u30EB\u30FC\u4F7F\u7528\u3055\u3093\u3050\u30FC\u3068\u3045\u30FC\u304F\u3043\u307F\u305D\u30FC\u308C\u30FC\u3002
SuccessText=\u3067\u3043\u304B\u3055\u3073\u305F\u3093\uFF01
TitleLbl=\u30BF\u30A4\u30C8\u30EB\uFF1A
ulDestinationLbl=\u6700\u7D42\u76EE\u7684\u5730\uFF1A
UnableCheckResultsText=\u7D50\u679C\u78BA\u8A8D\u306A\u3084\u3073\u3089\u3093\u3002 \u3046\u308C\u30FC\u306C\u30FC\u304C\u304C\u3070\u3063\u307A\u30FC\u3068\u30FC\u305F\u308B\u304F\u3068\u3045\u3061\u3080\u3048\u30FC\u3055\u3073\u30FC\u3093
ISO_NotSupportedCdDvd=\u30B5\u30DD\u30FC\u30C8\u3055\u308A\u3066\u3043\u3046\u3045\u3089\u3093 CD/DVD\u306C\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8
ISO_CantReadRootDescriptor=\u30EB\u30FC\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306C CD/DVD \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30A8\u30F3\u30C8\u30EA\u8AAD\u307F\u53D6\u308A\u3084\u3073\u3089\u3093
ISO_NoSystemCnf=\u304F\u306C CD/DVD \u3093\u304B\u3044SYSTEM.CNF\u306C\u898B\u3061\u304B\u3084\u3073\u3089\u3093\u3002 PS2\u306C\u30C7\u30A3\u30B9\u30AF\u3084\u3044\u3073\u30FC\u304C\uFF1F
ISO_PublisherTitleNotFound=\u30BF\u30A4\u30C8\u30EB\u306C\u898B\u3061\u304B\u3084\u3073\u3089\u3093\u3002SYSTEM.CNF\u30D5\u30A1\u30A4\u30EB\u30FC\u6B21\u306C\u3068\u304A\u308A\u3084\u3044\u3073\u30FC\u3093\uFF1A
PleaseWaitText=\u4E0D\u8981\u3084\u308B\u30D5\u30A1\u30A4\u30EB\u524A\u9664\u305D\u30FC\u3044\u3073\u30FC\u3093\u3002\u3044\u3061\u3085\u305F\u5F85\u3063\u3061\u304F\u3043\u307F\u305D\u30FC\u308C\u30FC...
editUlCfgBtn=ul.cfg\u7DE8\u96C6
ulManager=ul.cfg\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC
ulManagerWindow_ColumnNameNumber=#
ulManagerWindow_ColumnNameTitle=\u306A\u3081\u30FC
ulManagerWindow_ColumnNamePublisherTitle=\u30D1\u30D6\u30EA\u30C3\u30B7\u30E3\u30FC\u540D
ulManagerWindow_ColumnNameChunksCount=\u30C1\u30E3\u30F3\u30AF\u6570
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
ulManagerWindow_Row_RemoveRowBtn=\u524A\u9664
ulManagerWindow_SaveBtn=\u5909\u66F4\u5185\u5BB9\u4FDD\u5B58
ulManagerWindow_SelectUlCfgBtn=ul.cfg\u9078\u629E
ulManagerWindow_EmptyOrIncorrectText=\u7A7A\u3042\u3089\u3093\u3067\u3043\u4E0D\u6B63\u3084\u308Bul.cfg\u306C\u30B5\u30A4\u30BA
ulManagerWindow_InconsistentFileText=\u3066\u3043\u30FC\u3061\u4EE5\u4E0A\u306C\u30C1\u30E3\u30F3\u30AF\u306C\u898B\u3061\u304B\u3084\u3073\u3089\u3093\u3002\u304F\u306C\u30A8\u30F3\u30C8\u30EA\u524A\u9664\u3059\u308B\u304F\u3068\u3045\u3046\u52E7\u3081\u3044\u3055\u3073\u30FC\u3093\u3002
Ok=Ok
CD=CD
DVD=DVD
ulManagerWindow_SaveChangesFailureText=\u5909\u66F4\u306C\u4FDD\u5B58\u3093\u304B\u3044\u3057\u30FC\u3084\u3093\u3058\u3083\u3073\u305F\u3093\uFF1A

View File

@ -0,0 +1,40 @@
AbortText=\uC815\uBCF4
ISO_CantReadISOInitialDescriptorText=CD/DVD \uAE30\uBCF8 \uBCFC\uB968 \uBB38\uAD6C\uB97C \uC77D\uC744 \uC218 \uC5C6\uC74C
ConvertBtn=\uBCC0\uD658/\uC124\uCE58
DiskImageLbl=\uB514\uC2A4\uD06C \uC774\uBBF8\uC9C0:
FailedText=\uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4!
InProgressText=\uC9C4\uD589 \uC911...
InterruptedAndFilesDeletedText=\uC791\uC5C5\uC774 \uC911\uB2E8\uB418\uACE0 \uD30C\uC77C \uCCAD\uD06C\uAC00 \uC0AD\uC81C\uB428
InterruptedAndFilesNotDeletedText=\uC791\uC5C5\uC774 \uC911\uB2E8\uB418\uACE0 \uD30C\uC77C \uCCAD\uD06C\uAC00 \uC0AD\uC81C\uB418\uC9C0 \uC54A\uC74C
InterruptedText=\uC911\uB2E8
isoFilesText=ISO \uD30C\uC77C
WelcomeText=\uD658\uC601\uD569\uB2C8\uB2E4! PS2\uC6A9 Tihwin: ul-\uC720\uD2F8\uB9AC\uD2F0\uC785\uB2C8\uB2E4! GPLv3+, 2022-2023, \uB4DC\uBBF8\uD2B8\uB9AC \uC774\uC0AC\uC5D4\uCF54
SelectBtn=\uC120\uD0DD
SelectDiskImageText=\uB514\uC2A4\uD06C \uC774\uBBF8\uC9C0 \uC120\uD0DD
SetDestinationDirectoryText=\uB300\uC0C1 \uB514\uB809\uD1A0\uB9AC \uC124\uC815
SizesDifferent=\uD30C\uC77C \uD06C\uAE30 \uD655\uC778\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uD30C\uC77C\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694!
SuccessText=\uC131\uACF5\uD588\uC2B5\uB2C8\uB2E4!
TitleLbl=\uD0C0\uC774\uD2C0:
ulDestinationLbl=\uBAA9\uC801 ul:
UnableCheckResultsText=\uACB0\uACFC\uB97C \uD655\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uBB54\uAC00 \uC798\uBABB\uB410\uB2E4\uB294 \uC758\uBBF8
ISO_NotSupportedCdDvd=\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 CD/DVD \uD615\uC2DD
ISO_CantReadRootDescriptor=\uB8E8\uD2B8 \uB514\uB809\uD1A0\uB9AC\uC5D0 \uB300\uD55C CD/DVD \uB514\uB809\uD1A0\uB9AC \uD56D\uBAA9\uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
ISO_NoSystemCnf=\uC774 CD/DVD\uC5D0\uC11C SYSTEM.CNF\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. PS2 \uB514\uC2A4\uD06C\uAC00 \uB9DE\uB098\uC694?
ISO_PublisherTitleNotFound=\uC81C\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. SYSTEM.CNF \uD30C\uC77C\uC740 \uB2E4\uC74C\uACFC \uAC19\uC2B5\uB2C8\uB2E4:
PleaseWaitText=\uC4F8\uBAA8\uC5C6\uB294 \uD30C\uC77C \uC870\uAC01\uC744 \uC81C\uAC70\uD558\uB294 \uB3D9\uC548 \uC7A0\uC2DC \uAE30\uB2E4\uB824 \uC8FC\uC138\uC694...
editUlCfgBtn=ul.cfg \uD3B8\uC9D1
ulManager=ul.cfg \uB9E4\uB2C8\uC800
ulManagerWindow_ColumnNameNumber=#
ulManagerWindow_ColumnNameTitle=\uC774\uB984
ulManagerWindow_ColumnNamePublisherTitle=\uCD9C\uC2DC \uD0C0\uC774\uD2C0
ulManagerWindow_ColumnNameChunksCount=\uCCAD\uD06C \uC218
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
ulManagerWindow_Row_RemoveRowBtn=\uC81C\uAC70
ulManagerWindow_SaveBtn=\uBCC0\uACBD \uC800\uC7A5
ulManagerWindow_SelectUlCfgBtn=\uC120\uD0DD ul.cfg
ulManagerWindow_EmptyOrIncorrectText=\uBE44\uC5B4 \uC788\uAC70\uB098 \uC798\uBABB\uB41C ul.cfg \uD06C\uAE30
ulManagerWindow_InconsistentFileText=\uD558\uB098 \uC774\uC0C1\uC758 \uCCAD\uD06C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uD56D\uBAA9\uC744 \uC0AD\uC81C\uD558\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4.
Ok=\uD655\uC778
CD=CD
DVD=DVD
ulManagerWindow_SaveChangesFailureText=\uBCC0\uACBD \uC0AC\uD56D \uC800\uC7A5 \uC2E4\uD328:

View File

@ -8,7 +8,7 @@ InterruptedAndFilesDeletedText=\u0417\u0430\u0434\u0430\u0447\u0430 \u043F\u0440
InterruptedAndFilesNotDeletedText=\u0417\u0430\u0434\u0430\u0447\u0430 \u043F\u0440\u0435\u0440\u0432\u0430\u043D\u0430 \u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u044B \u0444\u0430\u0439\u043B\u0430 \u041D\u0415 \u0443\u0434\u0430\u043B\u0435\u043D\u044B
InterruptedText=\u041F\u0440\u0435\u0440\u0432\u0430\u043D\u043E
isoFilesText=\u0424\u0430\u0439\u043B\u044B ISO
WelcomeText=\u041F\u0440\u0438\u0432\u0435\u0442! \u042D\u0442\u043E Tihwin - ul-\u0443\u0442\u0438\u043B\u0438\u0442\u0430 \u0434\u043B\u044F \u0432\u0430\u0448\u0435\u0439 PS2! GPLv3+, 2022, \u0414\u043C\u0438\u0442\u0440\u0438\u0439 \u0418\u0441\u0430\u0435\u043D\u043A\u043E
WelcomeText=\u041F\u0440\u0438\u0432\u0435\u0442! \u042D\u0442\u043E Tihwin \u2212 ul-\u0443\u0442\u0438\u043B\u0438\u0442\u0430 \u0434\u043B\u044F \u0432\u0430\u0448\u0435\u0439 PS2! GPLv3+, 2022-2023, \u0414\u043C\u0438\u0442\u0440\u0438\u0439 \u0418\u0441\u0430\u0435\u043D\u043A\u043E
SelectBtn=\u0412\u044B\u0431\u0440\u0430\u0442\u044C
SelectDiskImageText=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043E\u0431\u0440\u0430\u0437 \u0434\u0438\u0441\u043A\u0430
SetDestinationDirectoryText=\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F
@ -22,3 +22,19 @@ ISO_CantReadRootDescriptor=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043
ISO_NoSystemCnf=\u041D\u0430 \u044D\u0442\u043E\u043C CD/DVD \u043D\u0435\u0442 \u0444\u0430\u0439\u043B\u0430 SYSTEM.CNF. \u042D\u0442\u043E \u0442\u043E\u0447\u043D\u043E \u0434\u0438\u0441\u043A \u0434\u043B\u044F PS2?
ISO_PublisherTitleNotFound=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E. SYSTEM.CNF \u0432\u044B\u0433\u043B\u044F\u0434\u0438\u0442 \u0442\u0430\u043A:
PleaseWaitText=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435 \u043F\u043E\u043A\u0430 \u0443\u0434\u0430\u043B\u044F\u044E\u0442\u0441\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u044B\u0435 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u044B \u0444\u0430\u0439\u043B\u0430...
editUlCfgBtn=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 ul.cfg
ulManager=\u041C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 ul.cnf
ulManagerWindow_ColumnNameNumber=\u2116
ulManagerWindow_ColumnNameTitle=\u0418\u043C\u044F
ulManagerWindow_ColumnNamePublisherTitle=\u0418\u043C\u044F \u043E\u0442 \u0438\u0437\u0434\u0430\u0442\u0435\u043B\u044F
ulManagerWindow_ColumnNameChunksCount=\u0412\u0441\u0435\u0433\u043E \u0447\u0430\u0441\u0442\u0435\u0439
ulManagerWindow_ColumnCdDvdFlag=CD/DVD
ulManagerWindow_Row_RemoveRowBtn=\u0423\u0434\u0430\u043B\u0438\u0442\u044C
ulManagerWindow_SaveBtn=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F
ulManagerWindow_SelectUlCfgBtn=\u0412\u044B\u0431\u0440\u0430\u0442\u044C ul.cfg
ulManagerWindow_EmptyOrIncorrectText=\u041F\u0443\u0441\u0442\u043E\u0439 \u0438\u043B\u0438 \u043D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430 ul.cfg
ulManagerWindow_InconsistentFileText=\u041E\u0434\u043D\u0430 \u0438\u043B\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0447\u0430\u0441\u0442\u0435\u0439 \u0444\u0430\u0439\u043B\u0430 \u043D\u0430 \u043D\u0430\u0439\u0434\u0435\u043D\u044B. \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u0442\u0443 \u0437\u0430\u043F\u0438\u0441\u044C.
Ok=\u041E\u043A
CD=CD
DVD=DVD
ulManagerWindow_SaveChangesFailureText=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F:

BIN
tw_icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB