Pentru a putea vota, modifica pagini sau abona la modificările unei pagini trebuie să fiți autentificați. Cu această ocazie scăpați și de acest mesaj deranjant.

Localizarea în Visual C: Diferență între versiuni

De la l10n.ro
Salt la: navigare, căutare
m (New page: == Introducere == Dupa 7 ani de zile am putut să renunţ la suportul pentru Win9x şi am început portarea aplicaţiei, scrisă în MFC, pe Unicode. Acum pot sa recomand oricui vrea sa ...)
(Nicio diferență)

Versiunea de la data 12 decembrie 2007 17:06

Introducere

Dupa 7 ani de zile am putut să renunţ la suportul pentru Win9x şi am început portarea aplicaţiei, scrisă în MFC, pe Unicode.

Acum pot sa recomand oricui vrea sa internationalizeze/localizeze să folosească libraria gettext din urmatoarele motive:

  • mentenanţa fişierelor de localizare este incomparabil mai uşoară
  • există orice fel de unelte de localizare pentru fişiere gettext (.PO)
  • poate fi folosită şi în aplicaţii 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

strlen      _tcslen
strcpy      _tcscpy 
strcmp      _tcscmp
strncmp     _tcsmcmp
stricmp     _tcsicmp
strchr      _tcschr
strncmp     _tcsncmp
sprintf     _tsprintf /* Vezi mai jos */
strstr      _tcsstr
sscanf      _stscanf
wsprintf    _tcs
atoi    _tstoi
itoa    itot
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
#define tstring wstring
#else
#define _tsprintf sprintf
#define tstring string
#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:

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

--sorin