From 810b35ae90059b9a3d79e98bcef9cf15b891a62c Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Fri, 27 Aug 2021 11:15:54 +0200 Subject: [PATCH] Include translations in macOS and Windows builds --- release/makemacapp.in | 6 ++++ release/tigervnc.iss.in | 8 ++++++ vncviewer/vncviewer.cxx | 63 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/release/makemacapp.in b/release/makemacapp.in index 2bfd869e..0c3f9626 100644 --- a/release/makemacapp.in +++ b/release/makemacapp.in @@ -67,6 +67,12 @@ fi install -m 644 $SRCDIR/release/tigervnc.icns "$APPROOT/Contents/Resources/" install -m 644 release/Info.plist "$APPROOT/Contents/" +for lang in `cat "$SRCDIR/po/LINGUAS"`; do + mkdir -p "$APPROOT/Contents/Resources/locale/$lang/LC_MESSAGES" + install -m 644 po/$lang.mo \ + "$APPROOT/Contents/Resources/locale/$lang/LC_MESSAGES/tigervnc.mo" +done + install -m 644 $SRCDIR/LICENCE.TXT $TMPDIR/dmg/ install -m 644 $SRCDIR/README.rst $TMPDIR/dmg/ diff --git a/release/tigervnc.iss.in b/release/tigervnc.iss.in index a7b9b701..bad0290b 100644 --- a/release/tigervnc.iss.in +++ b/release/tigervnc.iss.in @@ -23,6 +23,14 @@ Source: "@CMAKE_BINARY_DIR@\vncviewer\vncviewer.exe"; DestDir: "{app}"; Flags: i Source: "@CMAKE_SOURCE_DIR@\README.rst"; DestDir: "{app}"; Flags: ignoreversion Source: "@CMAKE_SOURCE_DIR@\LICENCE.TXT"; DestDir: "{app}"; Flags: ignoreversion +#define LINGUAS +#define Lang +#sub AddLanguage + #define Lang = FileRead(LINGUAS) + Source: "@CMAKE_BINARY_DIR@\po\{#Lang}.mo"; DestDir: "{app}\locale\{#Lang}\LC_MESSAGES"; DestName: "tigervnc.mo"; Flags: ignoreversion +#endsub +#for {LINGUAS = FileOpen("@CMAKE_SOURCE_DIR@\po\LINGUAS"); !FileEof(LINGUAS); ""} AddLanguage + [Icons] Name: "{group}\TigerVNC Viewer"; FileName: "{app}\vncviewer.exe"; Name: "{group}\Listening TigerVNC Viewer"; FileName: "{app}\vncviewer.exe"; Parameters: "-listen"; diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx index 1092f1f4..2a81ffd3 100644 --- a/vncviewer/vncviewer.cxx +++ b/vncviewer/vncviewer.cxx @@ -40,6 +40,10 @@ #define mkdir(path, mode) _mkdir(path) #endif +#ifdef __APPLE__ +#include +#endif + #if !defined(WIN32) && !defined(__APPLE__) #include #include @@ -261,6 +265,57 @@ static void CleanupSignalHandler(int sig) exit(1); } +static const char* getlocaledir() +{ +#if defined(WIN32) + static char localebuf[PATH_MAX]; + char *slash; + + GetModuleFileName(NULL, localebuf, sizeof(localebuf)); + + slash = strrchr(localebuf, '\\'); + if (slash == NULL) + return NULL; + + *slash = '\0'; + + if ((strlen(localebuf) + strlen("\\locale")) >= sizeof(localebuf)) + return NULL; + + strcat(localebuf, "\\locale"); + + return localebuf; +#elif defined(__APPLE__) + CFBundleRef bundle; + CFURLRef localeurl; + CFStringRef localestr; + Boolean ret; + + static char localebuf[PATH_MAX]; + + bundle = CFBundleGetMainBundle(); + if (bundle == NULL) + return NULL; + + localeurl = CFBundleCopyResourceURL(bundle, CFSTR("locale"), + NULL, NULL); + if (localeurl == NULL) + return NULL; + + localestr = CFURLCopyFileSystemPath(localeurl, kCFURLPOSIXPathStyle); + + CFRelease(localeurl); + + ret = CFStringGetCString(localestr, localebuf, sizeof(localebuf), + kCFStringEncodingUTF8); + if (!ret) + return NULL; + + return localebuf; +#else + return CMAKE_INSTALL_FULL_LOCALEDIR; +#endif +} static void init_fltk() { // Basic text size (10pt @ 96 dpi => 13px) @@ -588,12 +643,18 @@ static int mktunnel() int main(int argc, char** argv) { + const char *localedir; UserDialog dlg; argv0 = argv[0]; setlocale(LC_ALL, ""); - bindtextdomain(PACKAGE_NAME, CMAKE_INSTALL_FULL_LOCALEDIR); + + localedir = getlocaledir(); + if (localedir == NULL) + fprintf(stderr, "Failed to determine locale directory\n"); + else + bindtextdomain(PACKAGE_NAME, localedir); textdomain(PACKAGE_NAME); // Write about text to console, still using normal locale codeset -- 2.39.5