Localizarea in Visual C++: Diferență între versiuni
Admin (Discuție | contribuții) m (→Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche!) |
|||
(Nu s-au afișat 15 versiuni intermediare efectuate de alți 2 utilizatori) | |||
Linia 1: | Linia 1: | ||
== Introducere == | == Introducere == | ||
− | Dupa 7 ani de zile am putut | + | 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 | + | 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ă |
− | * poate fi | + | * 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. | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | <source lang="c"> | ||
+ | /* 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 | ||
+ | </source> | ||
+ | |||
+ | === 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 | ||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | == Cum convertesc dintr-un string in altul == | ||
+ | Puteti folosi niste macrocomenzi gen: | ||
+ | <pre> | ||
+ | W2A | ||
+ | CA2T - const ANSI to TCHAR | ||
+ | </pre> | ||
+ | Nu uitati ca întorc un buffer static deci trebuie să copiaţi valoarea dacă nu o folosiţi imediat. | ||
== Gettext == | == Gettext == | ||
− | + | Descarcati: | |
+ | * <tt>gettext-runtime</tt> (ex: ftp://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.gnu.org/gettext) | ||
+ | * <tt>libiconv</tt> (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). |
+ | |||
+ | <source lang="cpp"> | ||
#include "../contrib/gettext-runtime/include/libintl.h" | #include "../contrib/gettext-runtime/include/libintl.h" | ||
Linia 17: | Linia 82: | ||
// later | // later | ||
AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0); | AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0); | ||
+ | </source> | ||
+ | |||
+ | == Extragerea textelor == | ||
+ | Extragerea textelor din fisierele .C si .CPP este extrem de usoara folosing <tt>xgettext</tt>, dar cand veti ajunge la fisierele <tt>.RC</tt> o sa descoperiti ca nu sunt suportate. Din fericire dupa multe incercari nereusite am gasit singur o solutie simpla | ||
+ | <source lang="bash">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 | ||
+ | </source> | ||
− | + | 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. | |
[[Category:Tutorial]] | [[Category:Tutorial]] | ||
Linia 25: | Linia 98: | ||
== Legături == | == Legături == | ||
* http://www.gnu.org/software/gettext/ - de citit cu atenţie | * 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 |
+ | |||
+ | --[[User:Admin|sorin]] |
Versiunea curentă din 11 decembrie 2007 21:18
Cuprins
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:
- 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
--sorin