Localizarea in Visual C++: Diferență între versiuni
(→Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche!) |
Admin (Discuție | contribuții) m (→Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche!) |
||
(Nu s-au afișat 9 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 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! == | == Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche! == | ||
Linia 13: | Linia 13: | ||
<pre> | <pre> | ||
− | char | + | char _TCHAR |
LPSTR LPTSTR | LPSTR LPTSTR | ||
LPCSTR LPCTSTR | LPCSTR LPCTSTR | ||
− | strcpy | + | strlen _tcslen |
+ | strcpy _tcscpy | ||
strcmp _tcscmp | strcmp _tcscmp | ||
− | strncmp _tcsmcmp | + | strncmp _tcsmcmp |
stricmp _tcsicmp | stricmp _tcsicmp | ||
strchr _tcschr | strchr _tcschr | ||
Linia 25: | Linia 26: | ||
sprintf _tsprintf /* Vezi mai jos */ | sprintf _tsprintf /* Vezi mai jos */ | ||
strstr _tcsstr | strstr _tcsstr | ||
+ | sscanf _stscanf | ||
wsprintf _tcs | wsprintf _tcs | ||
− | atoi | + | atoi _tstoi |
− | sscanf | + | itoa itot |
+ | sscanf _stscanf | ||
vsprintf _vstprintf | vsprintf _vstprintf | ||
− | fopen | + | fopen _tfopen |
fputs _fputs | fputs _fputs | ||
− | fclose | + | fclose _tfclose |
</pre> | </pre> | ||
Linia 38: | Linia 41: | ||
#ifdef UNICODE | #ifdef UNICODE | ||
#define _tsprintf wsprintf | #define _tsprintf wsprintf | ||
+ | #define tstring wstring | ||
#else | #else | ||
#define _tsprintf sprintf | #define _tsprintf sprintf | ||
+ | #define tstring string | ||
#endif | #endif | ||
</source> | </source> | ||
Linia 49: | Linia 54: | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
sprintf "%s" LPWSTR LPSTR normal | sprintf "%s" LPWSTR LPSTR normal | ||
− | sprintf "%S" LPSTR | + | sprintf "%S" LPSTR LPWSTR inverse |
sprintf "%hs" LPSTR LPSTR single-byte | sprintf "%hs" LPSTR LPSTR single-byte | ||
sprintf "&ls" LPWSTR LPWSTR double-byte | sprintf "&ls" LPWSTR LPWSTR double-byte | ||
Linia 69: | Linia 74: | ||
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 82: | ||
// later | // later | ||
AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0); | AfxMessageBox(_("Hello World!"), (UINT)MB_OK, (UINT)0); | ||
− | + | </source> | |
− | |||
− | </ | ||
== Extragerea textelor == | == 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 | 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. | 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. | ||
Linia 93: | Linia 99: | ||
* 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 | * 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