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 in Visual C++: Diferență între versiuni

De la l10n.ro
Salt la: navigare, căutare
(Gettext)
m (Faza 1 - trecerea la unicode... fără a renuţa la versiunea veche!)
 
(Nu s-au afișat 14 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 1: Linia 1:
 
== Introducere ==
 
== Introducere ==
Dupa 7 ani de zile am putut sa renuntam la suportul pentru Win9x si am inceput portarea aplicatiei, scrisa in MFC, pe unicode.  
+
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 oricum vrea sa internationalizeze/localizeze sa foloseasca libraria gettext din urmatoarele motive:
+
Acum pot sa recomand oricui vrea sa internationalizeze/localizeze să folosească libraria gettext din urmatoarele motive:
* mentenanta fisierelor de localizare este net superioara
+
* mentenanţa fişierelor de localizare este incomparabil mai uşoară
* poate fi folosita si in aplicatii comerciale (este LGPL)
+
* 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 ==
Linia 13: 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).
  
<pre>
+
<source lang="cpp">
 
#include "../contrib/gettext-runtime/include/libintl.h"
 
#include "../contrib/gettext-runtime/include/libintl.h"
  
Linia 21: 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>
  
</pre>
+
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 29: 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

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