// ---------------------------------------------------------------------------- // nls.cxx // // Copyright (C) 2008 // Stéphane Fillod, F8CFE // // Copyright (C) 2011 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi 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. // // Fldigi 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 fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "nls.h" #include "gettext.h" using namespace std; #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifdef __WOE32__ # include # include // TODO: figure out the percentage automatically; hopefully not in a horribly kludgy way struct lang_def_t ui_langs[] = { { "en", "en_US", "English", 100 }, { "de", "de_DE", "Deutsch", 99 }, { "fr", "fr_FR", "Fran\347ais", 38 }, { "it", "it_IT", "Italiano", 99 }, { "es", "es_ES", "Espa\361ol", 99 }, { "pl", "pl_PL", "Polish", 90}, { NULL, NULL, NULL, 0 } }; static string get_win32_lang_dir(const char* homedir = NULL) { string lang_fn; if (!homedir) { if (!(homedir = getenv("USERPROFILE"))) return lang_fn; lang_fn.assign(homedir).append("\\fldigi.files\\"); } return lang_fn.append("lang.txt"); } int get_ui_lang(const char* homedir) { string lang = get_win32_lang_dir(homedir); ifstream in(lang.c_str()); if (!in) return 0; string::size_type u = string::npos; while (in >> lang) { if ( (lang[0] != '\n') & (lang[0] != '#') && ( (u = lang.find('_')) != string::npos) ) break; } in.close(); if (u != string::npos) for (lang_def_t* p = ui_langs; p->lang; p++) if (lang == p->lang_region) return (int)(p - ui_langs); return 0; } void set_ui_lang(int lang, const char* homedir) { if ((size_t)lang >= sizeof(ui_langs)/sizeof(*ui_langs) - 1) return; string langfn = get_win32_lang_dir(homedir); ofstream f(langfn.c_str()); if (f) { f << "# Autogenerated file, do not edit\r\n" << ui_langs[lang].lang_region << "\r\n"; f.close(); } } #endif int setup_nls(void) { static int nls_set_up = 0; if (nls_set_up) return nls_set_up; setlocale (LC_MESSAGES, ""); setlocale (LC_CTYPE, "C"); setlocale (LC_TIME, ""); // setting LC_NUMERIC might break the config read/write routines const char* ldir; char buf[PATH_MAX]; if (!(ldir = getenv("FLDIGI_LOCALE_DIR"))) { if (getcwd(buf, sizeof(buf) - strlen("/locale") - 1)) { #ifdef __WOE32__ int lang = get_ui_lang(); setenv("LANGUAGE", ui_langs[lang].lang_region, 1); #endif strcpy(buf + strlen(buf), "/locale"); struct stat s; if (stat(buf, &s) != -1 && S_ISDIR(s.st_mode)) ldir = buf; else ldir = LOCALEDIR; } } bindtextdomain(PACKAGE, ldir); /* fltk-1.1.x only knows about Latin-1 */ bind_textdomain_codeset(PACKAGE, "ISO-8859-1"); textdomain(PACKAGE); return nls_set_up = 1; }