Localizarea in Visual C++: Diferență între versiuni
(→Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche!) |
(→Gettext) |
||
Linia 69: | Linia 69: | ||
Ar trebui sa stiti ca implicit gettext intoarce textele in UTF-8 ceea ce este foarte bine, mai putin pentru Windows care foloseste in modul Unicode (UTF16-LE), asa ca trebuie sa le convertiti la runtime (oricum e suficient de rapida conversia). | Ar trebui sa stiti ca implicit gettext intoarce textele in UTF-8 ceea ce este foarte bine, mai putin pentru Windows care foloseste in modul Unicode (UTF16-LE), asa ca trebuie sa le convertiti la runtime (oricum e suficient de rapida conversia). | ||
− | < | + | <source lang="cpp"> |
#include "../contrib/gettext-runtime/include/libintl.h" | #include "../contrib/gettext-runtime/include/libintl.h" | ||
Linia 77: | Linia 77: | ||
// later | // later | ||
AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0); | AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0); | ||
− | + | </source> | |
− | |||
− | </ | ||
== Extragerea textelor == | == Extragerea textelor == |
Versiunea de la data 7 decembrie 2007 18:12
Cuprins
Introducere
Dupa 7 ani de zile am putut sa renuntam la suportul pentru Win9x si am inceput portarea aplicatiei, scrisa in MFC, pe unicode.
Acum pot sa recomand oricum vrea sa internationalizeze/localizeze sa foloseasca libraria gettext din urmatoarele motive:
- mentenanta fisierelor de localizare este net superioara
- poate fi folosita si in aplicatii comerciale (este LGPL)
Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche!
Unii o pot considera inutila dar experienta mea spune ca merita sa renunti la Win9x si sa treci la unicode.
Incepeti prin a inlocui tipurile de date si accesele la functii cu urmatoarele. Aceasta faza nu vă va 'strica' aplicaţia şi veţi putea să faceţi build-uri separate.
char _TCHAR LPSTR LPTSTR LPCSTR LPCTSTR strcpy _tcscpy strcmp _tcscmp strncmp _tcsmcmp stricmp _tcsicmp strchr _tcschr strncmp _tcsncmp sprintf _tsprintf /* Vezi mai jos */ strstr _tcsstr wsprintf _tcs atoi _tstoi sscanf _stscanf vsprintf _vstprintf fopen _tfopen fputs _fputs fclose _tfclose
/* Cum Bill cam uită să ducă treaba la bun sfârşit a uitat de (w)sprintf aşa că adăugaţi şi asta într-un H*/
#ifdef UNICODE
#define _tsprintf wsprintf
#else
#define _tsprintf sprintf
#endif
Ceva mai puţin evident despre ..prinf(...)
funcţiile din gama printf pot primi ca parametrii atât char, w_char cât şi t_char aşa că **trebuie** ajutate să-şi dea sema ce primesc
Apel build unicode build ne-unicode alias -------------------------------------------------------------------------------- sprintf "%s" LPWSTR LPSTR normal sprintf "%S" LPSTR LPWSTR inverse sprintf "%hs" LPSTR LPSTR single-byte sprintf "&ls" LPWSTR LPWSTR double-byte
Cum convertesc dintr-un string in altul
Puteti folosi niste macrocomenzi gen:
W2A CA2T - const ANSI to TCHAR
Nu uitati ca întorc un buffer static deci trebuie să copiaţi valoarea dacă nu o folosiţi imediat.
Gettext
Descarcati:
- gettext-runtime (ex: ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.gnu.org/gettext)
- libiconv (ex: ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.gnu.org/libiconv)
Ar trebui sa stiti ca implicit gettext intoarce textele in UTF-8 ceea ce este foarte bine, mai putin pentru Windows care foloseste in modul Unicode (UTF16-LE), asa ca trebuie sa le convertiti la runtime (oricum e suficient de rapida conversia).
#include "../contrib/gettext-runtime/include/libintl.h"
CString strDomain=CString(textdomain("myproject")); // if you put "" will default to "messages"
CString strBinded = CString(bindtextdomain("myproject","d:\\dev\\pbxtools\\src\\debug\\locale\\")); // put you path here
// later
AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0);
Extragerea textelor
Extragerea textelor din fisierele .C si .CPP este extrem de usoara folosing xgettext, dar cand veti ajunge la fisierele .RC o sa descoperiti ca nu sunt suportate. Din fericire dupa multe incercari nereusite am gasit singur o solutie simpla
xgettext --from-code=UTF-8 --add-comments --omit-header --no-location --keyword=MENUITEM --keyword=LTEXT --keyword=DEFPUSHBUTTON --keyword=PUSHBUTTON --keyword=CAPTION --language=Tcl -o resources.po project.rc
Sau pe scurt: intrucat sintaxa Tcl e destul de compatibila cu cea din .RC, folosind keyword-urile respective obtinei un parser de .RC in xgettext. Cool?... o sa trimit si un mail ca sa modifice sa recunoasca fisierele rc direct.
Legături
- http://www.gnu.org/software/gettext/ - de citit cu atenţie
- http://taossa.com/index.php/2007/01/09/string-theory-for-windows/ - cum se lucreaza cu siruri in windows