1\section{Writing non-English applications}\label{nonenglishoverview} 2 3This article describes how to write applications that communicate with 4the user in a language other than English. Unfortunately many languages use 5different charsets under Unix and Windows (and other platforms, to make 6the situation even more complicated). These charsets usually differ in so 7many characters that it is impossible to use the same texts under all 8platforms. 9 10The wxWidgets library provides a mechanism that helps you avoid distributing many 11identical, only differently encoded, packages with your application 12(e.g. help files and menu items in iso8859-13 and windows-1257). Thanks 13to this mechanism you can, for example, distribute only iso8859-13 data 14and it will be handled transparently under all systems. 15 16Please read \helpref{Internationalization}{internationalization} which 17describes the locales concept. 18 19In the following text, wherever {\it iso8859-2} and {\it windows-1250} are 20used, any encodings are meant and any encodings may be substituted there. 21 22\wxheading{Locales} 23 24The best way to ensure correctly displayed texts in a GUI across platforms 25is to use locales. Write your in-code messages in English or without 26diacritics and put real messages into the message catalog (see 27\helpref{Internationalization}{internationalization}). 28 29A standard .po file begins with a header like this: 30 31\begin{verbatim} 32# SOME DESCRIPTIVE TITLE. 33# Copyright (C) YEAR Free Software Foundation, Inc. 34# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. 35# 36msgid "" 37msgstr "" 38"Project-Id-Version: PACKAGE VERSION\n" 39"POT-Creation-Date: 1999-02-19 16:03+0100\n" 40"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 41"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 42"Language-Team: LANGUAGE <LL@li.org>\n" 43"MIME-Version: 1.0\n" 44"Content-Type: text/plain; charset=CHARSET\n" 45"Content-Transfer-Encoding: ENCODING\n" 46\end{verbatim} 47 48Note this particular line: 49 50\begin{verbatim} 51"Content-Type: text/plain; charset=CHARSET\n" 52\end{verbatim} 53 54It specifies the charset used by the catalog. All strings in the catalog 55are encoded using this charset. 56 57You have to fill in proper charset information. Your .po file may look like this 58after doing so: 59 60\begin{verbatim} 61# SOME DESCRIPTIVE TITLE. 62# Copyright (C) YEAR Free Software Foundation, Inc. 63# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. 64# 65msgid "" 66msgstr "" 67"Project-Id-Version: PACKAGE VERSION\n" 68"POT-Creation-Date: 1999-02-19 16:03+0100\n" 69"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 70"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 71"Language-Team: LANGUAGE <LL@li.org>\n" 72"MIME-Version: 1.0\n" 73"Content-Type: text/plain; charset=iso8859-2\n" 74"Content-Transfer-Encoding: 8bit\n" 75\end{verbatim} 76 77(Make sure that the header is {\bf not} marked as {\it fuzzy}.) 78 79wxWidgets is able to use this catalog under any supported platform 80(although iso8859-2 is a Unix encoding and is normally not understood by 81Windows). 82 83How is this done? When you tell the wxLocale class to load a message catalog that 84contains a correct header, it checks the charset. The catalog is then converted 85to the charset used (see 86\helpref{wxLocale::GetSystemEncoding}{wxlocalegetsystemencoding} and 87\helpref{wxLocale::GetSystemEncodingName}{wxlocalegetsystemencodingname}) by 88the user's operating system. This is the default behaviour of the 89\helpref{wxLocale}{wxlocale} class; you can disable it by {\bf not} passing 90{\tt wxLOCALE\_CONV\_ENCODING} to \helpref{wxLocale::Init}{wxlocaleinit}. 91 92\wxheading{Non-English strings or 8-bit characters in the source code} 93 94By convention, you should only use characters without diacritics (i.e. 7-bit 95ASCII strings) for msgids in the source code and write them in English. 96 97If you port software to wxWindows, you may be confronted with legacy source 98code containing non-English string literals. Instead of translating the strings 99in the source code to English and putting the original strings into message 100catalog, you may configure wxWidgets to use non-English msgids and translate to 101English using message catalogs: 102 103\begin{enumerate} 104\item{If you use the program {\tt xgettext} to extract the strings from 105the source code, specify the option {\tt --from-code=<source code charset>}.} 106\item{Specify the source code language and charset as arguments to 107\helpref{wxLocale::AddCatalog}{wxlocaleaddcatalog}. For example: 108\begin{verbatim} 109locale.AddCatalog(_T("myapp"), 110 wxLANGUAGE_GERMAN, _T("iso-8859-1")); 111\end{verbatim} 112} 113\end{enumerate} 114 115\wxheading{Font mapping} 116 117You can use \helpref{wxMBConv classes}{mbconvclasses} and 118\helpref{wxFontMapper}{wxfontmapper} to display text: 119 120\begin{verbatim} 121if (!wxFontMapper::Get()->IsEncodingAvailable(enc, facename)) 122{ 123 wxFontEncoding alternative; 124 if (wxFontMapper::Get()->GetAltForEncoding(enc, &alternative, 125 facename, false)) 126 { 127 wxCSConv convFrom(wxFontMapper::Get()->GetEncodingName(enc)); 128 wxCSConv convTo(wxFontMapper::Get()->GetEncodingName(alternative)); 129 text = wxString(text.mb_str(convFrom), convTo); 130 } 131 else 132 ...failure (or we may try iso8859-1/7bit ASCII)... 133} 134...display text... 135\end{verbatim} 136 137\wxheading{Converting data} 138 139You may want to store all program data (created documents etc.) in 140the same encoding, let's say {\tt utf-8}. You can use 141\helpref{wxCSConv}{wxcsconv} class to convert data to the encoding used by the 142system your application is running on (see 143\helpref{wxLocale::GetSystemEncoding}{wxlocalegetsystemencoding}). 144 145\wxheading{Help files} 146 147If you're using \helpref{wxHtmlHelpController}{wxhtmlhelpcontroller} there is 148no problem at all. You only need to make sure that all the HTML files contain 149the META tag, e.g. 150 151\begin{verbatim} 152<meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 153\end{verbatim} 154 155and that the hhp project file contains one additional line in the {\tt OPTIONS} 156section: 157 158\begin{verbatim} 159Charset=iso8859-2 160\end{verbatim} 161 162This additional entry tells the HTML help controller what encoding is used 163in contents and index tables. 164 165