Fixed incorrect font when using the Arabic or Japanese translations on Windows or MacOS

This commit is contained in:
Matt Pharoah
2025-07-09 14:55:41 -04:00
parent 1218033a37
commit 92df6a0bab
15 changed files with 89 additions and 67 deletions

View File

@@ -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

View File

@@ -795,13 +795,13 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translatorcomment>What is IS viewer?</translatorcomment>
<translation>خطأ: تم قطع اتصال IS Viewer بالمحاكي.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>خطأ: فشل في توصيل IS Viewer بالمحاكي.</translation>
</message>
@@ -1110,22 +1110,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>يجري تثبيت ريتروارش</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>ستقوم Parallel Launcher الآن بتثبيت ريتروأرش.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>خطأ فادح</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>فشل تثبيت ريتروارش.</translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>Fehler: IS-Viewer wurde vom Emulator getrennt.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>Fehler: IS-Viewer konnte nicht mit dem Emulator verbunden werden.</translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>RetroArch wird installert</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Parallel Launcher wird jetzt RetroArch installieren.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>Fataler Fehler</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>Fehler beim Installieren von RetroArch.</translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation></translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation></translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation></translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation></translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation></translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>Error: IS viewer se ha desconectado del emulador.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>Error: No se ha podido conectar IS Viewer al emulador.</translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>Instalando RetroArch</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Parallel Launcher va a instalar RetroArch.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>Error irrecuperable</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>No se ha podido instalar RetroArch.</translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>Erreur : IS-Viewer a é déconnecté de l&apos;émulateur.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>Erreur : Échec de la connexion dIS Viewer à lémulateur.</translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>Installation de RetroArch</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Parallel Launcher va maintenant installer RetroArch.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>Erreur Fatale</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>Écher de l&apos;installation de RetroArch.</translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>Erreur : IS-Viewer a é déconnecté de l&apos;émulateur.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>Erreur : Impossible de connecter IS-Viewer à l&apos;émulateur.</translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>Installation de RetroArch</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Parallel Launcher va maintenant installer RetroArch.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>Erreur Fatale</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>Écher de l&apos;installation de RetroArch.</translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>Errore: Is Viewer è stato disconnesso dall&apos;emulatore.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>Errore: Connessione dell&apos; &apos;IS Viewer all&apos;emulatore non riuscita.</translation>
</message>
@@ -1091,22 +1091,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>Installando RetroArch</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Parallel Launcher adesso installerà RetroArch.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>Errore Fatale</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>Installazione di RetroArch non riuscita.</translation>
</message>

View File

@@ -777,12 +777,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>エラー: IS Viewerがエミュレータから切断されました</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>エラー: IS Viewerとエミュレータの接続に失敗しました</translation>
</message>
@@ -1091,22 +1091,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>RetroArchをインストール中</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Paralle LancherがRetroArchをインストールします</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation></translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>RetroArchのインストールに失敗しました</translation>
</message>

View File

@@ -776,12 +776,12 @@
<context>
<name>IsViewerWindow</name>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<location filename="../src/ui/is-viewer-window.cpp" line="97"/>
<source>Error: IS Viewer was disconnected from the emulator.</source>
<translation>Erro: O IS Viewer foi desconectado do emulador.</translation>
</message>
<message>
<location filename="../src/ui/is-viewer-window.cpp" line="99"/>
<location filename="../src/ui/is-viewer-window.cpp" line="98"/>
<source>Error: Failed to connect IS Viewer to the emulator.</source>
<translation>Erro: Falha ao conectar o IS Viewer ao emulador.</translation>
</message>
@@ -1090,22 +1090,22 @@
<context>
<name>Main</name>
<message>
<location filename="../src/main.cpp" line="226"/>
<location filename="../src/main.cpp" line="225"/>
<source>Installing RetroArch</source>
<translation>A instalar RetroArch</translation>
</message>
<message>
<location filename="../src/main.cpp" line="227"/>
<location filename="../src/main.cpp" line="226"/>
<source>Parallel Launcher will now install RetroArch.</source>
<translation>Parallel Launcher vai agora instalar RetroArch.</translation>
</message>
<message>
<location filename="../src/main.cpp" line="236"/>
<location filename="../src/main.cpp" line="235"/>
<source>Fatal Error</source>
<translation>Erro Fatal</translation>
</message>
<message>
<location filename="../src/main.cpp" line="237"/>
<location filename="../src/main.cpp" line="236"/>
<source>Failed to install RetroArch.</source>
<translation>Falha ao instalar RetroArch.</translation>
</message>

View File

@@ -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

View File

@@ -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, {

View File

@@ -15,6 +15,7 @@
#include <QAbstractButton>
#include <QDesktopWidget>
#include <QApplication>
#include <QLocale>
#include <QIcon>
#include <QFont>
#include <QPalette>
@@ -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 );

View File

@@ -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}"