From 92df6a0bab7be6081b42a0e9c09f62779aa193ec Mon Sep 17 00:00:00 2001 From: Matt Pharoah Date: Wed, 9 Jul 2025 14:55:41 -0400 Subject: [PATCH] Fixed incorrect font when using the Arabic or Japanese translations on Windows or MacOS --- README.md | 1 + lang/parallel-launcher_ar.ts | 12 ++++++------ lang/parallel-launcher_de.ts | 12 ++++++------ lang/parallel-launcher_en_gb.ts | 12 ++++++------ lang/parallel-launcher_en_us.ts | 12 ++++++------ lang/parallel-launcher_es.ts | 12 ++++++------ lang/parallel-launcher_fr.ts | 12 ++++++------ lang/parallel-launcher_fr_ca.ts | 12 ++++++------ lang/parallel-launcher_it.ts | 12 ++++++------ lang/parallel-launcher_ja.ts | 12 ++++++------ lang/parallel-launcher_pt.ts | 12 ++++++------ osx-bundle.sh | 1 + src/main.cpp | 7 +++---- src/ui/ui-fixes.cpp | 22 +++++++++++++++++++--- win-installer-common.iss | 5 +++++ 15 files changed, 89 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 4b0468e..c44fe4a 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ Note: if you plan on building both 64-bit and 32-bit builds, I recommend that yo - Create a `winfonts` folder in your checkout directory - Download (or copy from a Linux install) the Noto Sans font family and the NotoMono font, and store the ttf font files in the `winfonts` folder - The font files should be: `NotoSans-Regular.ttf`, `NotoSans-Bold.ttf`, `NotoSans-Italic.ttf`, `NotoSans-BoldItalic.ttf`, and `NotoMono-Regular.ttf` + - You will also want to add the Arabic and CJK fonts: `NotoSansArabic-Regular.ttf`, `NotoSansArabic-Bold.ttf`, `NotoSansCJK-Regular.ttc` and `NotoSansCJK-Bold.ttc` - Download the discord-rpc library from https://github.com/discord/discord-rpc/releases - Copy the lib into your `win64/lib` (or `win32/lib`) folder - Copy the dll into your `release` folder diff --git a/lang/parallel-launcher_ar.ts b/lang/parallel-launcher_ar.ts index aecc13c..050a056 100644 --- a/lang/parallel-launcher_ar.ts +++ b/lang/parallel-launcher_ar.ts @@ -795,13 +795,13 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. What is IS viewer? خطأ: تم قطع اتصال IS Viewer بالمحاكي. - + Error: Failed to connect IS Viewer to the emulator. خطأ: فشل في توصيل IS Viewer بالمحاكي. @@ -1110,22 +1110,22 @@ Main - + Installing RetroArch يجري تثبيت ريتروارش - + Parallel Launcher will now install RetroArch. ستقوم Parallel Launcher الآن بتثبيت ريتروأرش. - + Fatal Error خطأ فادح - + Failed to install RetroArch. فشل تثبيت ريتروارش. diff --git a/lang/parallel-launcher_de.ts b/lang/parallel-launcher_de.ts index dde9b29..44e53de 100644 --- a/lang/parallel-launcher_de.ts +++ b/lang/parallel-launcher_de.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. Fehler: IS-Viewer wurde vom Emulator getrennt. - + Error: Failed to connect IS Viewer to the emulator. Fehler: IS-Viewer konnte nicht mit dem Emulator verbunden werden. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch RetroArch wird installert - + Parallel Launcher will now install RetroArch. Parallel Launcher wird jetzt RetroArch installieren. - + Fatal Error Fataler Fehler - + Failed to install RetroArch. Fehler beim Installieren von RetroArch. diff --git a/lang/parallel-launcher_en_gb.ts b/lang/parallel-launcher_en_gb.ts index c061e68..6a91886 100644 --- a/lang/parallel-launcher_en_gb.ts +++ b/lang/parallel-launcher_en_gb.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. - + Error: Failed to connect IS Viewer to the emulator. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch - + Parallel Launcher will now install RetroArch. - + Fatal Error - + Failed to install RetroArch. diff --git a/lang/parallel-launcher_en_us.ts b/lang/parallel-launcher_en_us.ts index f958fbb..6233eb5 100644 --- a/lang/parallel-launcher_en_us.ts +++ b/lang/parallel-launcher_en_us.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. - + Error: Failed to connect IS Viewer to the emulator. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch - + Parallel Launcher will now install RetroArch. - + Fatal Error - + Failed to install RetroArch. diff --git a/lang/parallel-launcher_es.ts b/lang/parallel-launcher_es.ts index 234fed1..5f42693 100644 --- a/lang/parallel-launcher_es.ts +++ b/lang/parallel-launcher_es.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. Error: IS viewer se ha desconectado del emulador. - + Error: Failed to connect IS Viewer to the emulator. Error: No se ha podido conectar IS Viewer al emulador. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch Instalando RetroArch - + Parallel Launcher will now install RetroArch. Parallel Launcher va a instalar RetroArch. - + Fatal Error Error irrecuperable - + Failed to install RetroArch. No se ha podido instalar RetroArch. diff --git a/lang/parallel-launcher_fr.ts b/lang/parallel-launcher_fr.ts index 6c73833..d15d8ad 100644 --- a/lang/parallel-launcher_fr.ts +++ b/lang/parallel-launcher_fr.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. Erreur : IS-Viewer a été déconnecté de l'émulateur. - + Error: Failed to connect IS Viewer to the emulator. Erreur : Échec de la connexion d’IS Viewer à l’émulateur. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch Installation de RetroArch - + Parallel Launcher will now install RetroArch. Parallel Launcher va maintenant installer RetroArch. - + Fatal Error Erreur Fatale - + Failed to install RetroArch. Écher de l'installation de RetroArch. diff --git a/lang/parallel-launcher_fr_ca.ts b/lang/parallel-launcher_fr_ca.ts index f3f3fac..64708fe 100644 --- a/lang/parallel-launcher_fr_ca.ts +++ b/lang/parallel-launcher_fr_ca.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. Erreur : IS-Viewer a été déconnecté de l'émulateur. - + Error: Failed to connect IS Viewer to the emulator. Erreur : Impossible de connecter IS-Viewer à l'émulateur. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch Installation de RetroArch - + Parallel Launcher will now install RetroArch. Parallel Launcher va maintenant installer RetroArch. - + Fatal Error Erreur Fatale - + Failed to install RetroArch. Écher de l'installation de RetroArch. diff --git a/lang/parallel-launcher_it.ts b/lang/parallel-launcher_it.ts index 818bb3a..9add1d7 100644 --- a/lang/parallel-launcher_it.ts +++ b/lang/parallel-launcher_it.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. Errore: Is Viewer è stato disconnesso dall'emulatore. - + Error: Failed to connect IS Viewer to the emulator. Errore: Connessione dell' 'IS Viewer all'emulatore non riuscita. @@ -1091,22 +1091,22 @@ Main - + Installing RetroArch Installando RetroArch - + Parallel Launcher will now install RetroArch. Parallel Launcher adesso installerà RetroArch. - + Fatal Error Errore Fatale - + Failed to install RetroArch. Installazione di RetroArch non riuscita. diff --git a/lang/parallel-launcher_ja.ts b/lang/parallel-launcher_ja.ts index 9537f12..6647b34 100644 --- a/lang/parallel-launcher_ja.ts +++ b/lang/parallel-launcher_ja.ts @@ -777,12 +777,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. エラー: IS Viewerがエミュレータから切断されました。 - + Error: Failed to connect IS Viewer to the emulator. エラー: IS Viewerとエミュレータの接続に失敗しました。 @@ -1091,22 +1091,22 @@ Main - + Installing RetroArch RetroArchをインストール中 - + Parallel Launcher will now install RetroArch. Paralle LancherがRetroArchをインストールします。 - + Fatal Error 致命的なエラー - + Failed to install RetroArch. RetroArchのインストールに失敗しました。 diff --git a/lang/parallel-launcher_pt.ts b/lang/parallel-launcher_pt.ts index f547901..123bfaf 100644 --- a/lang/parallel-launcher_pt.ts +++ b/lang/parallel-launcher_pt.ts @@ -776,12 +776,12 @@ IsViewerWindow - + Error: IS Viewer was disconnected from the emulator. Erro: O IS Viewer foi desconectado do emulador. - + Error: Failed to connect IS Viewer to the emulator. Erro: Falha ao conectar o IS Viewer ao emulador. @@ -1090,22 +1090,22 @@ Main - + Installing RetroArch A instalar RetroArch - + Parallel Launcher will now install RetroArch. Parallel Launcher vai agora instalar RetroArch. - + Fatal Error Erro Fatal - + Failed to install RetroArch. Falha ao instalar RetroArch. diff --git a/osx-bundle.sh b/osx-bundle.sh index c286756..a002799 100755 --- a/osx-bundle.sh +++ b/osx-bundle.sh @@ -8,6 +8,7 @@ cp ./lang/*.qm ./parallel-launcher.app/Contents/Resources/translations cp ./styles/*.dylib ./parallel-launcher.app/Contents/PlugIns/styles mkdir ./parallel-launcher.app/Contents/Resources/fonts cp ./macfonts/*.ttf ./parallel-launcher.app/Contents/Resources/fonts +cp ./macfonts/*.ttc ./parallel-launcher.app/Contents/Resources/fonts rm ./parallel-launcher.app/Contents/PlugIns/styles/libqmacstyle.dylib cp ./mac-extra/mkfs.fat ./parallel-launcher.app/Contents/Resources/mkfs.fat cp ./parallel-launcher-lsjs ./parallel-launcher.app/Contents/Resources/parallel-launcher-lsjs diff --git a/src/main.cpp b/src/main.cpp index 3ca39b2..17df741 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -174,12 +174,9 @@ int main( int argc, char **argv ) { #endif Migration::updateDatabaseSchema(); - applyUiFixes( app ); qInstallMessageHandler( onQtMessage ); - - Migration::run(); + AppSettings settings = FileController::loadAppSettings(); - if( settings.locale.empty() ) { #ifdef _WIN32 QLocale::setDefault( QLocale( WindowsLocale::getUserLocale().c_str() ) ); @@ -189,6 +186,8 @@ int main( int argc, char **argv ) { } initExtraAppContext(); + applyUiFixes( app ); + Migration::run(); QTranslator translations; loadTranslations( translations, { diff --git a/src/ui/ui-fixes.cpp b/src/ui/ui-fixes.cpp index ce8f3b0..5d21b56 100644 --- a/src/ui/ui-fixes.cpp +++ b/src/ui/ui-fixes.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -168,16 +169,31 @@ static inline void applyWindowsFixes( QApplication &app ) { app.setStyleSheet( cssTweaks.c_str() ); QIcon::setThemeName( "breeze-fallback" ); + QFont defaultFont( "Noto Sans" ); #ifdef __APPLE__ const fs::path fontDir = BaseDir::program().parent_path() / "Resources" / "fonts"; - const int fontId = QFontDatabase::addApplicationFont( (fontDir / "NotoSans-Regular.ttf").c_str() ); + const int baseFontId = QFontDatabase::addApplicationFont( (fontDir / "NotoSans-Regular.ttf").c_str() ); QFontDatabase::addApplicationFont( (fontDir / "NotoSans-Bold.ttf").c_str() ); QFontDatabase::addApplicationFont( (fontDir / "NotoSans-Italic.ttf").c_str() ); QFontDatabase::addApplicationFont( (fontDir / "NotoSans-BoldItalic.ttf").c_str() ); QFontDatabase::addApplicationFont( (fontDir / "NotoMono-Regular.ttf").c_str() ); - QFont defaultFont = (fontId >= 0) ? QFont( QFontDatabase::applicationFontFamilies( fontId ).at( 0 ) ) : QFont( "Noto Sans" ); + const int arabicFontId = QFontDatabase::addApplicationFont( (fontDir / "NotoSansArabic-Regular.ttf").c_str() ); + QFontDatabase::addApplicationFont( (fontDir / "NotoSansArabic-Bold.ttf").c_str() ); + const int japaneseFontId = QFontDatabase::addApplicationFont( (fontDir / "NotoSansCJK-Regular.ttc").c_str() ); + QFontDatabase::addApplicationFont( (fontDir / "NotoSansCJK-Bold.ttc").c_str() ); + if( QLocale().language() == QLocale::Arabic && arabicFontId >= 0 ) { + defaultFont = QFont( QFontDatabase::applicationFontFamilies( arabicFontId ).at( 0 ) ); + } else if( QLocale().language() == QLocale::Japanese && japaneseFontId >= 0 ) { + defaultFont = QFont( QFontDatabase::applicationFontFamilies( japaneseFontId ).at( 0 ) ); + } else if( baseFontId >= 0 ) { + defaultFont = QFont( QFontDatabase::applicationFontFamilies( baseFontId ).at( 0 ) ); + } #else - QFont defaultFont( "Noto Sans" ); + if( QLocale().language() == QLocale::Arabic ) { + defaultFont = QFont( "Noto Sans Arabic" ); + } else if( QLocale().language() == QLocale::Japanese ) { + defaultFont = QFont( "Noto Sans CJK JP" ); + } #endif defaultFont.setStyleHint( QFont::SansSerif ); diff --git a/win-installer-common.iss b/win-installer-common.iss index c7cc461..dcf45a4 100755 --- a/win-installer-common.iss +++ b/win-installer-common.iss @@ -41,6 +41,7 @@ Compression=lzma SolidCompression=yes WizardStyle=modern ChangesAssociations=yes +UninstallDisplayIcon={app}\{#MyAppExeName} [Registry] Root: HKCR; Subkey: ".z64"; ValueName: ""; ValueType: string; ValueData: "{#RegistryId}"; Flags: uninsdeletevalue @@ -73,6 +74,10 @@ Source: "{#SourcePath}\winfonts\NotoSans-Bold.ttf"; DestDir: "{fonts}"; FontInst Source: "{#SourcePath}\winfonts\NotoSans-Italic.ttf"; DestDir: "{fonts}"; FontInstall: "Noto Sans Italic"; Flags: uninsneveruninstall onlyifdoesntexist Source: "{#SourcePath}\winfonts\NotoSans-BoldItalic.ttf"; DestDir: "{fonts}"; FontInstall: "Noto Sans Bold Italic"; Flags: uninsneveruninstall onlyifdoesntexist Source: "{#SourcePath}\winfonts\NotoMono-Regular.ttf"; DestDir: "{fonts}"; FontInstall: "Noto Mono"; Flags: uninsneveruninstall onlyifdoesntexist +Source: "{#SourcePath}\winfonts\NotoSansArabic-Regular.ttf"; DestDir: "{fonts}"; FontInstall: "Noto Sans Arabic"; Flags: uninsneveruninstall onlyifdoesntexist +Source: "{#SourcePath}\winfonts\NotoSansArabic-Bold.ttf"; DestDir: "{fonts}"; FontInstall: "Noto Sans Arabic Bold"; Flags: uninsneveruninstall onlyifdoesntexist +Source: "{#SourcePath}\winfonts\NotoSansCJK-Regular.ttc"; DestDir: "{fonts}"; FontInstall: "Noto Sans CJK JP & Noto Sans CJK KR & Noto Sans CJK SC & Noto Sans CJK TC & Noto Sans CJK HK & Noto Sans Mono CJK JP & Noto Sans Mono CJK KR & Noto Sans Mono CJK SC & Noto Sans Mono CJK TC & Noto Sans Mono CJK HK"; Flags: uninsneveruninstall onlyifdoesntexist +Source: "{#SourcePath}\winfonts\NotoSansCJK-Bold.ttc"; DestDir: "{fonts}"; FontInstall: "Noto Sans CJK JP Bold & Noto Sans CJK KR Bold & Noto Sans CJK SC Bold & Noto Sans CJK TC Bold & Noto Sans CJK HK Bold & Noto Sans Mono CJK JP Bold & Noto Sans Mono CJK KR Bold & Noto Sans Mono CJK SC Bold & Noto Sans Mono CJK TC Bold & Noto Sans Mono CJK HK Bold"; Flags: uninsneveruninstall onlyifdoesntexist [Icons] Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"