From fd323a5e230f2b08227b307ff900698fb85d5519 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 13 Jan 1999 19:01:43 +0000 Subject: [PATCH] updated i18n sample, french translations are now in the "fr" subdirectory. Added some documentation in readme.txt. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1399 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/intl.h | 13 ++- samples/internat/fr/internat.mo | Bin 0 -> 1066 bytes samples/internat/fr/internat.po | 77 +++++++++++++++ samples/internat/{ => fr}/wxstd.mo | Bin 1868 -> 1923 bytes samples/internat/fr/wxstd.po | 131 +++++++++++++++++++++++++ samples/internat/internat.cpp | 50 +++++++--- samples/internat/internat.mo | Bin 403 -> 0 bytes samples/internat/internat.po | 74 --------------- samples/internat/readme.txt | 82 ++++++++++++++++ samples/internat/wxstd.po | 47 +++++---- src/common/intl.cpp | 148 ++++++++++++++++++++--------- 11 files changed, 471 insertions(+), 151 deletions(-) create mode 100644 samples/internat/fr/internat.mo create mode 100644 samples/internat/fr/internat.po rename samples/internat/{ => fr}/wxstd.mo (53%) create mode 100644 samples/internat/fr/wxstd.po delete mode 100644 samples/internat/internat.mo delete mode 100644 samples/internat/internat.po create mode 100644 samples/internat/readme.txt diff --git a/include/wx/intl.h b/include/wx/intl.h index 8b7acb076b..15aecb9391 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -78,9 +78,18 @@ public: // returns locale name const char *GetLocale() const { return m_strLocale; } + // add a prefix to the catalog lookup path: the message catalog files will be + // looked up under prefix//LC_MESSAGES, prefix/LC_MESSAGES and prefix + // (in this order). + // + // This only applies to subsequent invocations of AddCatalog()! + static void AddCatalogLookupPathPrefix(const wxString& prefix); + // add a catalog: it's searched for in standard places (current directory - // first, system one after). It will be used for message lookup by - // GetString(). + // first, system one after), but the you may prepend additional directories to + // the search path with AddCatalogLookupPathPrefix(). + // + // The loaded catalog will be used for message lookup by GetString(). // // Returns 'true' if it was successfully loaded bool AddCatalog(const char *szDomain); diff --git a/samples/internat/fr/internat.mo b/samples/internat/fr/internat.mo new file mode 100644 index 0000000000000000000000000000000000000000..2632931826d88374f584ab7f253af1ab6f3c955f GIT binary patch literal 1066 zcmaKqyKWOf6ov-~w-7E02#O$dEFnii$RZ8I=>l>@(hwjD0*PY0J6Vs|ompmQHgRRh9ez+p6mI~zw={$=CweaMP5d}LS9179TMUs zH~^1=4m<}A!8!0{oPPtJ!T2qB5quBc1V6|118^SW-{389{;&`W;0AaM+yS{>0bT=N zfPDW)@C5h?9sXgi$*pq){1tm>Cj!}6zPimKv5wxolrS&vQjIe*B)vwdVD#baAZQ!S8heDFD)CY zWKrg7_8l#CyUW-4w@ceH)df9K+UMGkG%0O_TuVa_3+cR=>VycH)9&z*HmTjMXtgZG z1676Gi!JE(ma?F#ii%Mz*%FT@ic4qvvY(Ggu_~3K25D2vT&Hm>+*>7VD{U36Oa@vx zxEX4v9R&k3EwOF!@|t#{?W%z7Y`q(^kH!{# LemfKYRY&{*aa|5| literal 0 HcmV?d00001 diff --git a/samples/internat/fr/internat.po b/samples/internat/fr/internat.po new file mode 100644 index 0000000000..7ab0bd7048 --- /dev/null +++ b/samples/internat/fr/internat.po @@ -0,0 +1,77 @@ +# Message catalog file template for the wxWindows i18n sample +# Copyright (C) 1999 wxWindows development team +# Vadim Zeitlin +# +#: internat.cpp:146 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: wxWindows 2.0 i18n sample\n" +"POT-Creation-Date: 1999-01-13 18:19+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Vadim Zeitlin \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#: internat.cpp:98 +msgid "International wxWindows App" +msgstr "Application wxWindows internationale" + +#: internat.cpp:105 +msgid "&About..." +msgstr "&A propos..." + +#: internat.cpp:107 +msgid "E&xit" +msgstr "&Quitter" + +#: internat.cpp:110 +msgid "&Open bogus file" +msgstr "&Ouvrir un fichier" + +#: internat.cpp:111 +msgid "&Play a game" +msgstr "&Jouer" + +#: internat.cpp:114 +msgid "&File" +msgstr "&Fichier" + +#: internat.cpp:115 +msgid "&Test" +msgstr "&Test" + +#: internat.cpp:138 +msgid "I18n sample\n" +"© 1998, 1999 Vadim Zeitlin and Julian Smart" +msgstr "Exemple d'i18n\n" +"© 1998, 1999 Vadim Zeitlin et Julian Smart" + +#: internat.cpp:139 +msgid "About Internat" +msgstr "A propos d'Internat" + +#: internat.cpp:144 +msgid "Enter your number:" +msgstr "Entrez votre numéro:" + +#: internat.cpp:145 +msgid "Try to guess my number!" +msgstr "Essayez de déviner mon numéro!" + +#: internat.cpp:150 +msgid "You've probably entered an invalid number." +msgstr "Vous avez probablement entré un nombre invalide." + +#: internat.cpp:154 +msgid "Bad luck! try again..." +msgstr "Pas de chance! essayez encore..." + +#: internat.cpp:158 +msgid "Congratulations! you've won. Here is the magic phrase:" +msgstr "Félicitations! vouz avez gagné. Voilà la phrase magique:" + +#: internat.cpp:162 +msgid "Result" +msgstr "Resultat" diff --git a/samples/internat/wxstd.mo b/samples/internat/fr/wxstd.mo similarity index 53% rename from samples/internat/wxstd.mo rename to samples/internat/fr/wxstd.mo index a03f3d877f509d79160ccd7cb8542e8b6d5a446d..89c03eaf60c2a04d6e91f40b88bc0ef505afd383 100644 GIT binary patch delta 589 zcmXxhzb^w}7{KwT*VEFX)UUy>(`u^{6$udxjUa-An8aA^ZI?E#F-RmGDn^MkCbO6< ztVUyvHpC(rB>n&q->0o7_uS{6_uk}v?zw7vIaGQHo99CGk^^Lw93+oCA|3dRqv$b2 zq8LXXuA?8f8}4Eobq2Ylz^xNqY{6q3!c&~Y>v~<1XC5Y4_`z-*_liU?jTY|V2$nH{ zm)MUFID?-U!(p?2;0mUwcTnG-pf-Bf@E)6~s~D1!$RiJ&EpOO^9~i`6jANilWEH1S z8$HA{USSm98|y*FGD|&&N!-U}yg=Reifd@n%`|SJm-B@Q*A8q)4ffSWrsLO!bgUZM zWPsGK`49bV8sR!Z&q6=7FAQNTslTC%)ahziW47xSTr1|}<||L0P2W-`pS7Jz(ik?j xHf~pq4a2{f&mTCpTRAf$x^`nO7#_Rwe-V3fT-KV#P#C{s4s4J}&?O delta 514 zcmYk(ze~eF6u|M<^KAXuYPBL%OKPk^p%oNSir`YPii@MtC0Lz`LOVKi=zm~vaqZ}4 zR>8$Z5EMa2!A<`FHwV8j6!F2!CwG_R-o12EkID9X+FlAVNzRbBiHzYh&f^EV z7&jsbT*<9!*k4H7uWC( z3;2z?Vb+S2u!y=|LoM(E2k;70*u@NnIE)Xtp!>gav(3a0YGsvvku7YZi#MqAZ@7*& zF0zQ5Siuw2=dQ7ePq>QHR6&hG +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: wxWindows 2.0 i18n sample\n" +"POT-Creation-Date: 1999-01-13 18:19+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Vadim Zeitlin \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#: file.cpp:182 hello.cpp:38 +#, fuzzy, c-format +msgid "can't create file '%s'" +msgstr "impossible de créer le fichier '%s'" + +#: file.cpp:213 +#, c-format +msgid "can't open file '%s'" +msgstr "impossible d'ouvrir le fichier '%s'" + +#: file.cpp:227 +#, c-format +msgid "can't close file descriptor %d" +msgstr "impossible de fermer le descripteur %d" + +#: file.cpp:244 +#, c-format +msgid "can't read from file descriptor %d" +msgstr "impossible de lire à partir de descripteur %d" + +#: file.cpp:258 +#, c-format +msgid "can't write to file descriptor %d" +msgstr "impossible d'écrire sur le descripteur %d" + +#: file.cpp:271 +#, c-format +msgid "can't flush file descriptor %d" +msgstr "impossible de mettre à jour le descripteur %d" + +#: file.cpp:308 +#, c-format +msgid "can't seek on file descriptor %d" +msgstr "impossible de changer la position sur le descripteur %d" + +#: file.cpp:322 +#, c-format +msgid "can't get seek position on file descriptor %d" +msgstr "impossible d'obtenir la position courante sur le descripteur %d" + +#: file.cpp:355 +#, c-format +msgid "can't find length of file on file descriptor %d" +msgstr "impossible de trouver la taille du fichier ouvert sur le descripteur %d" + +#: intl.cpp:139 +#, c-format +msgid "catalog file for domain '%s' not found." +msgstr "impossible de trouver le catalogue de messages pour le domaine '%s'." + +#: intl.cpp:177 +#, c-format +msgid "'%s' is not a valid message catalog." +msgstr "'%s' n'est pas un catalogue de messages valid." + +#: intl.cpp:330 intl.cpp:334 +#, c-format +msgid "locale '%s' can not be set." +msgstr "impossible de passer à locale '%s'." + +#: intl.cpp:431 intl.cpp:435 +#, c-format +msgid "string '%s' not found in domain '%s' for locale '%s'." +msgstr "chaîne '%s' n'a pas été trouvée dans le domaine '%s' pour le locale '%s'." + +#: intl.cpp:434 intl.cpp:438 +#, c-format +msgid "string '%s' not found in locale '%s'." +msgstr "chaîne '%s' n'a pas été trouvée dans le locale '%s'." + +#: log.cpp:104 +#, c-format +msgid " (error %ld: %s)" +msgstr " (erreur %ld: %s)" + +#: log.cpp:165 +msgid "Debug: " +msgstr "Debug: " + +#: log.cpp:171 +msgid "Fatal error: " +msgstr "Erreur fatale: " + +#: log.cpp:172 +msgid "Program aborted.\n" +msgstr "Programme abandonné.\n" + +#: log.cpp:177 +msgid "Error: " +msgstr "Erreur: " + +#: log.cpp:181 +msgid "Warning: " +msgstr "Attention: " + +#: log.cpp:268 +#, c-format +msgid "Assert failed in file %s at line %d" +msgstr "Assertion est fausse dans le fichier %s à la ligne %d" + +#: file.cpp:303 +msgid "unknown seek origin" +msgstr "" + +msgid "looking for catalog '%s' in path '%s'." +msgstr "" + +#: intl.cpp:378 +msgid "no message catalog list" +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Cancel" +msgstr "Annuler" diff --git a/samples/internat/internat.cpp b/samples/internat/internat.cpp index 40d065e674..6f2826b1c2 100644 --- a/samples/internat/internat.cpp +++ b/samples/internat/internat.cpp @@ -54,7 +54,7 @@ public: void OnAbout(wxCommandEvent& event); void OnPlay(wxCommandEvent& event); void OnOpen(wxCommandEvent& event); - bool OnClose(void) { return TRUE; } + bool OnClose() { return TRUE; } DECLARE_EVENT_TABLE() }; @@ -80,11 +80,34 @@ IMPLEMENT_APP(MyApp) // `Main program' equivalent, creating windows and returning main app frame -bool MyApp::OnInit(void) +bool MyApp::OnInit() { - // Initialize the catalogs we'll be using - m_locale.Init("french", "fr", "C"); + // set the language to use + const char *language = NULL; + const char *langid = NULL; + switch ( argc ) + { + default: + // ignore the other args, fall through + + case 3: + language = argv[1]; + langid = argv[2]; + break; + + case 2: + language = argv[1]; + break; + + case 1: + language = "french"; + langid = "fr"; + }; + + // there are very few systems right now which support locales other than "C" + m_locale.Init(language, langid, "C"); + // Initialize the catalogs we'll be using /* not needed any more, done in wxLocale ctor m_locale.AddCatalog("wxstd"); // 1) for library messages */ @@ -95,14 +118,15 @@ bool MyApp::OnInit(void) m_locale.AddCatalog("fileutils"); // 3) and another just for testing // Create the main frame window - MyFrame *frame = new MyFrame((wxFrame *) NULL, _("International wxWindows App"), 50, 50, 150, 40); + MyFrame *frame = new MyFrame((wxFrame *) NULL, _("International wxWindows App"), + 50, 50, 250, 40); // Give it an icon frame->SetIcon(wxICON(mondrian)); // Make a menubar wxMenu *file_menu = new wxMenu; - file_menu->Append(MINIMAL_ABOUT, _("&About")); + file_menu->Append(MINIMAL_ABOUT, _("&About...")); file_menu->AppendSeparator(); file_menu->Append(MINIMAL_QUIT, _("E&xit")); @@ -135,7 +159,8 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageDialog(this, _("I18n sample\n© Vadim Zeitlin & Julian Smart"), + wxMessageDialog(this, _("I18n sample\n" + "© 1998, 1999 Vadim Zeitlin and Julian Smart"), _("About Internat"), wxOK | wxICON_INFORMATION).ShowModal(); } @@ -144,18 +169,21 @@ void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event)) wxString str = wxGetTextFromUser(_("Enter your number:"), _("Try to guess my number!"), "", this); + if ( str.IsEmpty() ) + return; + int num; sscanf(str, "%d", &num); if ( num == 0 ) - str = _("you've probably entered an invalid number."); + str = _("You've probably entered an invalid number."); else if ( num == 9 ) // this message is not translated (not in catalog) - str = _("you've found a bug in this program!"); + str = "You've found a bug in this program!"; else if ( num != 17 ) // a more implicit way to write _() - str = wxGetTranslation("bad luck! try again..."); + str = wxGetTranslation("Bad luck! try again..."); else { str.Empty(); // string must be split in two -- otherwise the translation won't be found - str << _("congratulations! you've won. Here is the magic phrase:") + str << _("Congratulations! you've won. Here is the magic phrase:") << _("cannot create fifo `%s'"); } diff --git a/samples/internat/internat.mo b/samples/internat/internat.mo deleted file mode 100644 index a710101f4b57cc4ba90b17afef42e538df862ae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmYMuJx&8L5CvcZ;Q|q&0%=m9NE9v+ilWqST4W`xDI#V0-S_` zmyn2&KfS^p>wQlr9|kjlD_FugJi;aPa0l-&g-^JJFCh4Vd$>L^<^s7!&XF4=&i>z1 z|k&xvXw*Rnd9k)*_ diff --git a/samples/internat/internat.po b/samples/internat/internat.po deleted file mode 100644 index cc285481e7..0000000000 --- a/samples/internat/internat.po +++ /dev/null @@ -1,74 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR , YEAR. -# -#: hello.cpp:44 -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 1997-12-19 17:46+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: ENCODING\n" - -#: hello.cpp:31 hello.cpp:38 -msgid "bad luck! try again..." -msgstr "pas de chance! essayez encore..." - -#: hello.cpp:23 hello.cpp:24 -#, c-format -msgid "usage: %s " -msgstr "syntaxe: %s " - -#: hello.cpp:29 hello.cpp:34 -msgid "you've probably entered an invalid number." -msgstr "vous avez du entrer un nombre invalide." - -#: hello.cpp:33 hello.cpp:40 -msgid "congratulations! you've won. Here is the magic phrase:" -msgstr "felicitations! vous avez gagne. Voici la phrase magique:" - -#: hello.cpp:17 -msgid "wxstd" -msgstr "" - -#: hello.cpp:18 -msgid "hello" -msgstr "" - -#: hello.cpp:19 -msgid "fileutils" -msgstr "" - -#: hello.cpp:20 -msgid "french" -msgstr "" - -#: hello.cpp:20 -msgid "fr" -msgstr "" - -#: hello.cpp:20 -msgid "C" -msgstr "" - -#: hello.cpp:27 -msgid "nosuchfi.le" -msgstr "" - -#: hello.cpp:36 -msgid "You've found a bug in this program!" -msgstr "" - -#: hello.cpp:43 -#, c-format -msgid "cannot create fifo `%s'" -msgstr "" - -#: hello.cpp:43 -msgid "foo" -msgstr "" diff --git a/samples/internat/readme.txt b/samples/internat/readme.txt new file mode 100644 index 0000000000..11eb77f465 --- /dev/null +++ b/samples/internat/readme.txt @@ -0,0 +1,82 @@ +This is the README file for the internationalization sample for wxWindows 2.0. + +Q. What does this stupid program do? +A. It demonstrates how to translate all program messages to a foreign language. + In any program using wxWindows there is going to be 3 kinds of messages: the + messages from the program itself, the messages from the wxWindows library and + the messages from the system (e.g. system error messages). This program + translates the first 2 kinds of messages but the system messages will be only + translated if your system supports it. + + Brief usage summary: "Test|File" tries to open a non existing file (provoking + system error message), "Test|Play" shows a message box asking for a number. + Hint: try some special values like 9 and 17. + +Q. Why the error message when I try to open a non existing file is only partly + translated? +A. Your system doesn't have the translation in the language you use, sorry. + +Q. Why the message when I enter '9' is not translated? +A. This is on purpose: the corresponding string wasn't enclosed in _() macro and + so didn't get into the message catalog when it was created using xgettext. + +Q. Why the message when I enter '17' is only partly translated? +A. This will only work under some versions of Linux, don't worry if the second + half of the sentence is not translated. + +Q. I don't speak french, what about translations to ? +A. Please write them - see the next question. French is chosen by default + because it's the only translation which is currently available. To test + translations to the other languages please run the sample with 2 command line + arguments: the full language name and the name of the directory where the + message catalogs for this language are (will be taken as 2 first letters of + the language name if only 1 argument is given). + +Q. How to do translations to other language? +A. First of all, you will need the GNU gettext tools (see the next question). + After you've probably installed them, type the following (example is for Unix + and you should do exactly the same under Windows). + + # all translations forgiven language should be in a separate directory. + # Please use the standard abbreviation for the language names! + mkdir + cd + + # generate the .po file for the program itself + # see `xgettext --help' for options, "-C" is important! + xgettext -C -o internat.po ../internat.cpp + + # .po file for wxWindows might be generated in the same way, but for now just + # take this one... + cp ../wxstd.po . + + # now edit the files and do translate strings (this isn't done by gettext) + # you can use another editor if you wish :-) + vi internat.po wxstd.po + + # create the message catalog files + msgfmt -o internat.mo internat.po + msgfmt -o wxstd.mo wxstd.po + + # run the sample to test it + cd .. + ./$OSTYPE/internat + +Q. How to get the gettext tools? +A. For Unix, you should be able to get the source distribution of any GNU mirror + (see www.gnu.org for a start). gettext() version 0.10 is buggy, try to get at + least version strictly greater than 0.10. gettext RPMs can be downloaded from + the standard locations for Linux. For Windows, you can get the precompiled + binaries from wxWindows web page. + +Q. What's i18n? +A. Count the number of letters in the word "internationalization". + +Q. Where to send comments, + additional translations, + flames, + money? +A. To Vadim Zeitlin , + wxWindows list , + /dev/null (platform-dependent), + wxWindows dev team Suiss banc account. diff --git a/samples/internat/wxstd.po b/samples/internat/wxstd.po index 100109b3b7..d0cb7bcfc6 100644 --- a/samples/internat/wxstd.po +++ b/samples/internat/wxstd.po @@ -21,103 +21,102 @@ msgstr "" #: file.cpp:182 hello.cpp:38 #, fuzzy, c-format msgid "can't create file '%s'" -msgstr "impossible de créer le fichier '%s'" +msgstr "" #: file.cpp:213 #, c-format msgid "can't open file '%s'" -msgstr "impossible d'ouvrir le fichier '%s'" +msgstr "" #: file.cpp:227 #, c-format msgid "can't close file descriptor %d" -msgstr "impossible de fermer le descripteur %d" +msgstr "" #: file.cpp:244 #, c-format msgid "can't read from file descriptor %d" -msgstr "impossible de lire à partir de descripteur %d" +msgstr "" #: file.cpp:258 #, c-format msgid "can't write to file descriptor %d" -msgstr "impossible d'écrire sur le descripteur %d" +msgstr "" #: file.cpp:271 #, c-format msgid "can't flush file descriptor %d" -msgstr "impossible de mettre à jour le descripteur %d" +msgstr "" #: file.cpp:308 #, c-format msgid "can't seek on file descriptor %d" -msgstr "impossible de changer la position sur le descripteur %d" +msgstr "" #: file.cpp:322 #, c-format msgid "can't get seek position on file descriptor %d" -msgstr "impossible d'obtenir la position courante sur le descripteur %d" +msgstr "" #: file.cpp:355 #, c-format msgid "can't find length of file on file descriptor %d" msgstr "" -"impossible de trouver la taille du fichier ouvert sur le descripteur %d" #: intl.cpp:139 #, c-format msgid "catalog file for domain '%s' not found." -msgstr "impossible de trouver le catalogue de messages pour le domaine '%s'." +msgstr "" #: intl.cpp:177 #, c-format msgid "'%s' is not a valid message catalog." -msgstr "'%s' n'est pas un catalogue de messages valid." +msgstr "" #: intl.cpp:330 intl.cpp:334 #, c-format msgid "locale '%s' can not be set." -msgstr "impossible de passer à locale '%s'." +msgstr "" #: intl.cpp:431 intl.cpp:435 #, c-format msgid "string '%s' not found in domain '%s' for locale '%s'." -msgstr "chaîne '%s' n'a pas été trouvé dans le domaine '%s' pour le locale '%s'." +msgstr "" #: intl.cpp:434 intl.cpp:438 #, c-format msgid "string '%s' not found in locale '%s'." -msgstr "chaîne '%s' n'a pas été trouvé dans le locale '%s'." +msgstr "" #: log.cpp:104 #, c-format msgid " (error %ld: %s)" -msgstr " (erreur %ld: %s)" +msgstr "" #: log.cpp:165 msgid "Debug: " -msgstr "Debug: " +msgstr "" #: log.cpp:171 msgid "Fatal error: " -msgstr "Erreur fatale: " +msgstr "" #: log.cpp:172 msgid "Program aborted.\n" -msgstr "Programme abandonné.\n" +msgstr "" #: log.cpp:177 msgid "Error: " -msgstr "Erreur: " +msgstr "" #: log.cpp:181 msgid "Warning: " -msgstr "Attention: " +msgstr "" #: log.cpp:268 #, c-format msgid "Assert failed in file %s at line %d" -msgstr "Assertion est fausse dans le fichier %s à la ligne %d" +msgstr "" #: file.cpp:303 msgid "unknown seek origin" @@ -129,3 +128,9 @@ msgstr "" #: intl.cpp:378 msgid "no message catalog list" msgstr "" + +msgid "OK" +msgstr "" + +msgid "Cancel" +msgstr "" diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 0a35449929..9f6ef15ac4 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -148,6 +148,13 @@ private: char *m_pszName; // name of the domain }; +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +// the list of the directories to search for message catalog files +static wxArrayString s_searchPrefixes; + // ============================================================================ // implementation // ============================================================================ @@ -197,42 +204,77 @@ wxMsgCatalog::~wxMsgCatalog() wxDELETEA(m_pszName); } +// small class to suppress the translation erros until exit from current scope class NoTransErr { - public: +public: NoTransErr() { wxSuppressTransErrors(); } ~NoTransErr() { wxRestoreTransErrors(); } }; +// return all directories to search for given prefix +static wxString GetAllMsgCatalogSubdirs(const char *prefix, + const char *lang) +{ + wxString searchPath; + + // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in + // prefix (assuming the language is 'fr') + searchPath << prefix << FILE_SEP_PATH << lang << FILE_SEP_PATH + << "LC_MESSAGES" << PATH_SEP + << prefix << FILE_SEP_PATH << lang << PATH_SEP + << prefix << PATH_SEP; + + return searchPath; +} + +// construct the search path for the given language +static wxString GetFullSearchPath(const char *lang) +{ + wxString searchPath; + + // first take the entries explicitly added by the program + size_t count = s_searchPrefixes.Count(); + for ( size_t n = 0; n < count; n++ ) + { + searchPath << GetAllMsgCatalogSubdirs(s_searchPrefixes[n], lang) + << PATH_SEP; + } + + // then take the current directory + // FIXME it should be the directory of the executable + searchPath << GetAllMsgCatalogSubdirs(".", lang) << PATH_SEP; + + // and finally add some standard ones + searchPath + << GetAllMsgCatalogSubdirs("/usr/share/locale", lang) << PATH_SEP + << GetAllMsgCatalogSubdirs("/usr/lib/locale", lang) << PATH_SEP + << GetAllMsgCatalogSubdirs("/usr/local/share/locale", lang); + + return searchPath; +} + // open disk file and read in it's contents bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) { - // search order (assume language 'foo') is - // 1) $LC_PATH/foo/LC_MESSAGES (if LC_PATH set) - // 2) ./foo/LC_MESSAGES - // 3) ./foo - // 4) . (Added by JACS) - // - // under UNIX we search also in: - // 5) /usr/share/locale/foo/LC_MESSAGES (Linux) - // 6) /usr/lib/locale/foo/LC_MESSAGES (Solaris) - #define MSG_PATH FILE_SEP_PATH + "LC_MESSAGES" PATH_SEP - - wxString strPath(""); + // FIXME VZ: I forgot the exact meaning of LC_PATH - anyone to remind me? +#if 0 const char *pszLcPath = getenv("LC_PATH"); if ( pszLcPath != NULL ) - strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH; // (1) + strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH; +#endif // 0 - // NB: '<<' is unneeded between too literal strings: - // they are concatenated at compile time - strPath += "./" + wxString(szDirPrefix) + MSG_PATH // (2) - + "./" + szDirPrefix + FILE_SEP_PATH + PATH_SEP // (3) - + "." + PATH_SEP - #ifdef __UNIX__ - "/usr/share/locale/" + szDirPrefix + MSG_PATH // (5) - "/usr/lib/locale/" + szDirPrefix + MSG_PATH // (6) - #endif //UNIX - ; + wxString searchPath = GetFullSearchPath(szDirPrefix); + const char *sublocale = strchr(szDirPrefix, '_'); + if ( sublocale ) + { + // also add just base locale name: for things like "fr_BE" (belgium + // french) we should use "fr" if no belgium specific message catalogs + // exist + searchPath << GetFullSearchPath(wxString(szDirPrefix). + Left((size_t)(sublocale - szDirPrefix))) + << PATH_SEP; + } wxString strFile = szName; strFile += MSGCATALOG_EXTENSION; @@ -244,10 +286,10 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName) NoTransErr noTransErr; wxLogVerbose(_("looking for catalog '%s' in path '%s'."), - szName, strPath.c_str()); + szName, searchPath.c_str()); wxString strFullName; - if ( !wxFindFileInPath(&strFullName, strPath, strFile) ) { + if ( !wxFindFileInPath(&strFullName, searchPath, strFile) ) { wxLogWarning(_("catalog file for domain '%s' not found."), szName); return FALSE; } @@ -384,8 +426,8 @@ bool wxLocale::Init(const char *szName, // the short name will be used to look for catalog files as well, // so we need something here if ( m_strShort.IsEmpty() ) { - // #### I don't know how these 2 letter abbreviations are formed, - // this wild guess is almost surely wrong + // FIXME I don't know how these 2 letter abbreviations are formed, + // this wild guess is surely wrong m_strShort = wxToLower(szLocale[0]) + wxToLower(szLocale[1]); } @@ -401,20 +443,29 @@ bool wxLocale::Init(const char *szName, return bOk; } +void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix) +{ + if ( s_searchPrefixes.Index(prefix) == NOT_FOUND ) + { + s_searchPrefixes.Add(prefix); + } + //else: already have it +} + // clean up wxLocale::~wxLocale() { - // free memory - wxMsgCatalog *pTmpCat; - while ( m_pMsgCat != NULL ) { - pTmpCat = m_pMsgCat; - m_pMsgCat = m_pMsgCat->m_pNext; - delete pTmpCat; - } - - // restore old locale - wxSetLocale(m_pOldLocale); - setlocale(LC_ALL, m_pszOldLocale); + // free memory + wxMsgCatalog *pTmpCat; + while ( m_pMsgCat != NULL ) { + pTmpCat = m_pMsgCat; + m_pMsgCat = m_pMsgCat->m_pNext; + delete pTmpCat; + } + + // restore old locale + wxSetLocale(m_pOldLocale); + setlocale(LC_ALL, m_pszOldLocale); } // get the translation of given string in current locale @@ -444,16 +495,27 @@ const char *wxLocale::GetString(const char *szOrigString, if ( pszTrans == NULL ) { if ( wxIsLoggingTransErrors() ) { - // suppress further error messages - // (do it before LogWarning to prevent infinite recursion!) + // suppress further error messages if we're not debugging: this avoids + // flooding the user with messages about each and every missing string if, + // for example, a whole catalog file is missing. + + // do it before calling LogWarning to prevent infinite recursion! +#ifdef __WXDEBUG__ + NoTransErr noTransErr; +#else // !debug wxSuppressTransErrors(); +#endif // debug/!debug if ( szDomain != NULL ) + { wxLogWarning(_("string '%s' not found in domain '%s' for locale '%s'."), - szOrigString, szDomain, m_strLocale.c_str()); + szOrigString, szDomain, m_strLocale.c_str()); + } else + { wxLogWarning(_("string '%s' not found in locale '%s'."), - szOrigString, m_strLocale.c_str()); + szOrigString, m_strLocale.c_str()); + } } return szOrigString; -- 2.45.2