Traduction d'applications avec GetText et Poedit

Programmation d'applications complexes
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Traduction d'applications avec GetText et Poedit

Message par djes »

J'ai adapté et corrigé le code de JCV (voir http://purebasic.fr/english/viewtopic.php?f=12&t=26739) pour réaliser la traduction d'une application en utilisant l'outil GNU GetText et Poedit.
N'hésitez pas à tester et à corriger les bugs. :)

L'archive complète : https://docs.google.com/viewer?a=v&pid= ... NzFj&hl=fr

Mode d'emploi :
1 - Dans tous les sources entourez les chaînes avec t("") ou gettext("")

2 - Passez vos fichiers à la moulinette poedit ou gettext pour générer un catalogue à partir des chaînes
http://www.poedit.net/
http://www.gnu.org/s/gettext/

Poedit :
Ajoutez le language purebasic dans fichier>préférences>analyseurs (copiez celui pour le php et changez les extensions de listes de fichiers avec *.pb;*.pbi)
Créez un nouveau catalogue pour la langue souhaitée, ajoutez le chemin vers le dossier de votre projet, ajoutez t comme mot-clé
Cliquez sur "Mettre à jour à partir des fichiers sources"
Sauvez le catalogue avec un nom correspondant à la langue à traduire (comme fr_FR). Fichier original (texte) : .po , compilé pour le déploiement : .mo)
Sauvez autant de catalogue que de langues (et traduisez!)

3 - Ajoutez les lignes suivantes à votre code (comme dans sample.pb)
XIncludeFile "translator.pbi"
Translator_init("locale\", "fr_FR") ;laissez la 2ème vide pour autodétection

locale.pbi

Code : Tout sélectionner

; http://unicode.org/onlinedat/languages.html
; JCV @ PureBasic Forum
; http://www.JCVsite.com
; Corrected by djes@free.fr Jul 18th 2011


#LANG_AFRIKAANS = $36
#LANG_ALBANIAN = $1C
#LANG_ARABIC = $01
#LANG_ARMENIAN = $2B
#LANG_ASSAMESE = $4D
#LANG_AZERI = $2C
#LANG_BASQUE = $2D
#LANG_BELARUSIAN = $23
#LANG_BENGALI = $45
#LANG_BULGARIAN = $02
#LANG_BELARUSIAN = $23
#LANG_CATALAN = $03
#LANG_CHINESE = $04
#LANG_CROATIAN = $1A
#LANG_CZECH = $05
#LANG_DANISH = $06
#LANG_DIVEHI = $65
#LANG_DUTCH = $13
#LANG_ENGLISH = $09
#LANG_ESTONIAN = $25
#LANG_FAEROESE = $38
#LANG_FARSI = $29
#LANG_FINNISH = $0B
#LANG_FRENCH = $0C
#LANG_GALICIAN = $56
#LANG_GEORGIAN = $37
#LANG_GERMAN = $07
#LANG_GREEK = $08
#LANG_GUJARATI = $47
#LANG_HEBREW = $0D
#LANG_HINDI = $39
#LANG_HUNGARIAN = $0E
#LANG_ICELANDIC = $0F
#LANG_INDONESIAN = $21
#LANG_ITALIAN = $10
#LANG_JAPANESE = $11
#LANG_KANNADA = $4B
#LANG_KASHMIRI = $60
#LANG_KAZAK = $3F
#LANG_KONKANI = $57
#LANG_KYRGYZ = $40
#LANG_LATVIAN = $26
#LANG_LITHUANIAN = $27
#LANG_MACEDONIAN = $2F
#LANG_MALAY = $3E
#LANG_MALAYALAM = $4C
#LANG_MANIPURI = $58
#LANG_MARATHI = $4E
#LANG_MONGOLIAN = $50
#LANG_NEPALI = $61
#LANG_ORIYA = $48
#LANG_POLISH = $15
#LANG_PORTUGUESE = $16
#LANG_PUNJABI = $46
#LANG_ROMANIAN = $18
#LANG_RUSSIAN = $19
#LANG_SANSKRIT = $4F
#LANG_SERBIAN = $1A
#LANG_SINDHI = $59
#LANG_SLOVAK = $1B
#LANG_SLOVENIAN = $24
#LANG_SPANISH = $0A
#LANG_SWEDISH = $1D
#LANG_SORBIAN = $2E
#LANG_SWAHILI = $41
#LANG_SYRIAC = $5A
#LANG_TAMIL = $49
#LANG_TATAR = $44
#LANG_TELUGU = $4A
#LANG_THAI = $1E
#LANG_TURKISH = $1F
#LANG_UKRAINIAN = $22
#LANG_URDU = $20
#LANG_UZBEK = $43
#LANG_VIETNAMESE = $2A
#SUBLANG_NEUTRAL = $0
#SUBLANG_DEFAULT = $1
#SUBLANG_SYS_DEFAULT = $2
#SUBLANG_ARABIC_SAUDI_ARABIA = $01
#SUBLANG_ARABIC = $1
#SUBLANG_ARABIC_IRAQ = $2
#SUBLANG_ARABIC_EGYPT = $3
#SUBLANG_ARABIC_LIBYA = $4
#SUBLANG_ARABIC_ALGERIA = $5
#SUBLANG_ARABIC_MOROCCO = $6
#SUBLANG_ARABIC_TUNISIA = $7
#SUBLANG_ARABIC_OMAN = $8
#SUBLANG_ARABIC_YEMEN = $9
#SUBLANG_ARABIC_SYRIA = $A
#SUBLANG_ARABIC_JORDAN = $B
#SUBLANG_ARABIC_LEBANON = $C
#SUBLANG_ARABIC_KUWAIT = $D
#SUBLANG_ARABIC_UAE = $E
#SUBLANG_ARABIC_BAHRAIN = $F
#SUBLANG_AZERI_LATIN = $01
#SUBLANG_ARABIC_QATAR = $10
#SUBLANG_CHINESE_TRADITIONAL = $1
#SUBLANG_CHINESE_SIMPLIFIED = $2
#SUBLANG_CHINESE_HONGKONG = $3
#SUBLANG_CHINESE_SINGAPORE = $4
#SUBLANG_DUTCH = $1
#SUBLANG_DUTCH_BELGIAN = $2
#SUBLANG_ENGLISH_US = $1
#SUBLANG_ENGLISH_UK = $2
#SUBLANG_ENGLISH_AUS = $3
#SUBLANG_ENGLISH_CAN = $4
#SUBLANG_ENGLISH_NZ = $5
#SUBLANG_ENGLISH_EIRE = $6
#SUBLANG_ENGLISH_SAFRICA = $7
#SUBLANG_ENGLISH_JAMAICA = $8
#SUBLANG_ENGLISH_CARRIBEAN = $9
#SUBLANG_FRENCH = $1
#SUBLANG_FRENCH_BELGIAN = $2
#SUBLANG_FRENCH_CANADIAN = $3
#SUBLANG_FRENCH_SWISS = $4
#SUBLANG_FRENCH_LUXEMBOURG = $5
#SUBLANG_GERMAN = $1
#SUBLANG_GERMAN_SWISS = $2
#SUBLANG_GERMAN_AUSTRIAN = $3
#SUBLANG_GERMAN_LUXEMBOURG = $4
#SUBLANG_GERMAN_LIECHTENSTEIN = $5
#SUBLANG_ITALIAN = $1
#SUBLANG_ITALIAN_SWISS = $2
#SUBLANG_KOREAN = $1
#SUBLANG_KOREAN_JOHAB = $2
#SUBLANG_NORWEGIAN_BOKMAL = $1
#SUBLANG_NORWEGIAN_NYNORSK = $2
#SUBLANG_PORTUGUESE = $2
#SUBLANG_PORTUGUESE_BRAZILIAN = $1
#SUBLANG_SPANISH = $1
#SUBLANG_SPANISH_MEXICAN = $2
#SUBLANG_SPANISH_MODERN = $3
#SUBLANG_SPANISH_GUATEMALA = $4
#SUBLANG_SPANISH_COSTARICA = $5
#SUBLANG_SPANISH_PANAMA = $6
#SUBLANG_SPANISH_DOMINICAN = $7
#SUBLANG_SPANISH_VENEZUELA = $8
#SUBLANG_SPANISH_COLOMBIA = $9
#SUBLANG_SPANISH_PERU = $A
#SUBLANG_SPANISH_ARGENTINA = $B
#SUBLANG_SPANISH_ECUADOR = $C
#SUBLANG_SPANISH_CHILE = $D
#SUBLANG_SPANISH_URUGUAY = $E
#SUBLANG_SPANISH_PARAGUAY = $F
#SUBLANG_SPANISH_BOLIVIA = $10
#SUBLANG_ARABIC_SAUDI_ARABIA = $01
#SUBLANG_ARABIC_IRAQ = $02
#SUBLANG_ARABIC_EGYPT = $03
#SUBLANG_ARABIC_LIBYA = $04
#SUBLANG_ARABIC_ALGERIA = $05
#SUBLANG_ARABIC_MOROCCO = $06
#SUBLANG_ARABIC_TUNISIA = $07
#SUBLANG_ARABIC_OMAN = $08
#SUBLANG_ARABIC_YEMEN = $09
#SUBLANG_ARABIC_SYRIA = $0A
#SUBLANG_ARABIC_JORDAN = $0B
#SUBLANG_ARABIC_LEBANON = $0C
#SUBLANG_ARABIC_KUWAIT = $0D
#SUBLANG_ARABIC_UAE = $0E
#SUBLANG_ARABIC_BAHRAIN = $0F
#SUBLANG_ARABIC_QATAR = $10
#SUBLANG_AZERI_LATIN = $01
#SUBLANG_AZERI_CYRILLIC = $02
#SUBLANG_CHINESE_MACAU = $05
#SUBLANG_ENGLISH_SOUTH_AFRICA = $07
#SUBLANG_ENGLISH_JAMAICA = $08
#SUBLANG_ENGLISH_CARIBBEAN = $09
#SUBLANG_ENGLISH_BELIZE = $0A
#SUBLANG_ENGLISH_TRINIDAD = $0B
#SUBLANG_ENGLISH_ZIMBABWE = $0C
#SUBLANG_ENGLISH_PHILIPPINES = $0D
#SUBLANG_FRENCH_LUXEMBOURG = $05
#SUBLANG_FRENCH_MONACO = $06
#SUBLANG_GERMAN_LUXEMBOURG = $04
#SUBLANG_GERMAN_LIECHTENSTEIN = $05
#SUBLANG_KASHMIRI_INDIA = $02
#SUBLANG_MALAY_MALAYSIA = $01
#SUBLANG_MALAY_BRUNEI_DARUSSALAM = $02
#SUBLANG_NEPALI_INDIA = $02
#SUBLANG_SERBIAN_LATIN = $02
#SUBLANG_SERBIAN_CYRILLIC = $03
#SUBLANG_SPANISH_GUATEMALA = $04
#SUBLANG_SPANISH_COSTA_RICA = $05
#SUBLANG_SPANISH_PANAMA = $06
#SUBLANG_SPANISH_DOMINICAN_REPUBLIC = $07
#SUBLANG_SPANISH_VENEZUELA = $08
#SUBLANG_SPANISH_COLOMBIA = $09
#SUBLANG_SPANISH_PERU = $0A
#SUBLANG_SPANISH_ARGENTINA = $0B
#SUBLANG_SPANISH_ECUADOR = $0C
#SUBLANG_SPANISH_CHILE = $0D
#SUBLANG_SPANISH_URUGUAY = $0E
#SUBLANG_SPANISH_PARAGUAY = $0F
#SUBLANG_SPANISH_BOLIVIA = $10
#SUBLANG_SPANISH_EL_SALVADOR = $11
#SUBLANG_SPANISH_HONDURAS = $12
#SUBLANG_SPANISH_NICARAGUA = $13
#SUBLANG_SPANISH_PUERTO_RICO = $14
#SUBLANG_SWEDISH_FINLAND = $02
#SUBLANG_URDU_PAKISTAN = $01
#SUBLANG_URDU_INDIA = $02
#SUBLANG_UZBEK_LATIN = $01
#SUBLANG_UZBEK_CYRILLIC = $02
Macro SUBLANGID(lgid)
  ((lgid)>>10) 
EndMacro

Macro PRIMARYLANGID(lgid)
  ((lgid)&$3FF) 
EndMacro

Macro MAKELANGID(primary, sublang)
  (((sublang)<<10)|(primary))
EndMacro

Macro LANGIDFROMLCID(lgid)
  ((lgid)&255)
EndMacro

Procedure.s getLanguageName()
  Protected lcid, langid, primary, sub

  lcid = GetThreadLocale_()
  langid = LANGIDFROMLCID(lcid)
  primary = PRIMARYLANGID(langid)
	sub = SUBLANGID (lcid)
	
; 	Debug Hex(lcid)
; 	Debug Hex(langid)
; 	Debug Hex(primary)
; 	Debug Hex(sub)
	
  Select primary
    Case #LANG_AFRIKAANS: ProcedureReturn "af_ZA";
    Case #LANG_ALBANIAN: ProcedureReturn "sq_AL";
    Case $5E: ProcedureReturn "am_ET"; /* AMHARIC */ 
    Case #LANG_ARABIC:
      Select sub
        Case #SUBLANG_ARABIC_SAUDI_ARABIA: ProcedureReturn "ar_SA";
        Case #SUBLANG_ARABIC_IRAQ: ProcedureReturn "ar_IQ";
        Case #SUBLANG_ARABIC_EGYPT: ProcedureReturn "ar_EG";
        Case #SUBLANG_ARABIC_LIBYA: ProcedureReturn "ar_LY";
        Case #SUBLANG_ARABIC_ALGERIA: ProcedureReturn "ar_DZ";
        Case #SUBLANG_ARABIC_MOROCCO: ProcedureReturn "ar_MA";
        Case #SUBLANG_ARABIC_TUNISIA: ProcedureReturn "ar_TN";
        Case #SUBLANG_ARABIC_OMAN: ProcedureReturn "ar_OM";
        Case #SUBLANG_ARABIC_YEMEN: ProcedureReturn "ar_YE";
        Case #SUBLANG_ARABIC_SYRIA: ProcedureReturn "ar_SY";
        Case #SUBLANG_ARABIC_JORDAN: ProcedureReturn "ar_JO";
        Case #SUBLANG_ARABIC_LEBANON: ProcedureReturn "ar_LB";
        Case #SUBLANG_ARABIC_KUWAIT: ProcedureReturn "ar_KW";
        Case #SUBLANG_ARABIC_UAE: ProcedureReturn "ar_AE";
        Case #SUBLANG_ARABIC_BAHRAIN: ProcedureReturn "ar_BH";
        Case #SUBLANG_ARABIC_QATAR: ProcedureReturn "ar_QA";
        Default: ProcedureReturn "ar";
      EndSelect
    Case #LANG_ARMENIAN: ProcedureReturn "hy_AM";
    Case #LANG_ASSAMESE: ProcedureReturn "as_IN";
    Case #LANG_AZERI:
      Select sub
        ; /* FIXME: Adjust this when Azerbaijani locales appear on Unix.  */
        Case #SUBLANG_AZERI_LATIN: ProcedureReturn "az_AZ@latin";
        Case #SUBLANG_AZERI_CYRILLIC: ProcedureReturn "az_AZ@cyrillic";
        Default: ProcedureReturn "az";
      EndSelect
    Case #LANG_BASQUE: ProcedureReturn "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR".  */
    Case #LANG_BELARUSIAN: ProcedureReturn "be_BY";
    Case #LANG_BENGALI: ProcedureReturn "bn_IN";
    Case #LANG_BULGARIAN: ProcedureReturn "bg_BG";
    Case $55: ProcedureReturn "my_MM"; /* BURMESE */ 
    Case $53: ProcedureReturn "km_KH"; /* CAMBODIAN */ 
    Case #LANG_CATALAN: ProcedureReturn "ca_ES";
    Case $5C: ProcedureReturn "chr_US"; /* CHEROKEE */ 
    Case #LANG_CHINESE:
      Select sub
        Case #SUBLANG_CHINESE_TRADITIONAL: ProcedureReturn "zh_TW";
        Case #SUBLANG_CHINESE_SIMPLIFIED: ProcedureReturn "zh_CN";
        Case #SUBLANG_CHINESE_HONGKONG: ProcedureReturn "zh_HK";
        Case #SUBLANG_CHINESE_SINGAPORE: ProcedureReturn "zh_SG";
        Case #SUBLANG_CHINESE_MACAU: ProcedureReturn "zh_MO";
        Default: ProcedureReturn "zh";
      EndSelect
    Case #LANG_CROATIAN:	; /* #LANG_CROATIAN == #LANG_SERBIAN
      ; * What used To be called Serbo-Croatian
      ; * should really now be two separate
      ; * languages because of political reasons.
      ; * (Says tml, who knows nothing about Serbian
      ; * Or Croatian.)
      ; * (i can feel those flames coming already.)
      ; */
      Select sub
        Case #SUBLANG_DEFAULT: ProcedureReturn "hr_HR";
        Case #SUBLANG_SERBIAN_LATIN: ProcedureReturn "sr_YU";
        Case #SUBLANG_SERBIAN_CYRILLIC: ProcedureReturn "sr_YU@cyrillic";
        Default: ProcedureReturn "hr";
      EndSelect
    Case #LANG_CZECH: ProcedureReturn "cs_CZ";
    Case #LANG_DANISH: ProcedureReturn "da_DK";
    Case #LANG_DIVEHI: ProcedureReturn "div_MV";
    Case #LANG_DUTCH:
      Select sub
        Case #SUBLANG_DUTCH: ProcedureReturn "nl_NL";
        Case #SUBLANG_DUTCH_BELGIAN: ProcedureReturn "nl_BE"; /* FLEMISH, VLAAMS */ 
        Default: ProcedureReturn "nl";
      EndSelect
    Case $66: ProcedureReturn "bin_NG"; /* EDO */ 
    Case #LANG_ENGLISH:
      Select sub
        ; /* #SUBLANG_ENGLISH_US == #SUBLANG_DEFAULT. Heh. I thought
        ; * English was the language spoken in England.
        ; * Oh well.
        ; */
        Case #SUBLANG_ENGLISH_US: ProcedureReturn "en_US";
        Case #SUBLANG_ENGLISH_UK: ProcedureReturn "en_GB";
        Case #SUBLANG_ENGLISH_AUS: ProcedureReturn "en_AU";
        Case #SUBLANG_ENGLISH_CAN: ProcedureReturn "en_CA";
        Case #SUBLANG_ENGLISH_NZ: ProcedureReturn "en_NZ";
        Case #SUBLANG_ENGLISH_EIRE: ProcedureReturn "en_IE";
        Case #SUBLANG_ENGLISH_SOUTH_AFRICA: ProcedureReturn "en_ZA";
        Case #SUBLANG_ENGLISH_JAMAICA: ProcedureReturn "en_JM";
        Case #SUBLANG_ENGLISH_CARIBBEAN: ProcedureReturn "en_GD"; /* Grenada? */
        Case #SUBLANG_ENGLISH_BELIZE: ProcedureReturn "en_BZ";
        Case #SUBLANG_ENGLISH_TRINIDAD: ProcedureReturn "en_TT";
        Case #SUBLANG_ENGLISH_ZIMBABWE: ProcedureReturn "en_ZW";
        Case #SUBLANG_ENGLISH_PHILIPPINES: ProcedureReturn "en_PH";
        Default: ProcedureReturn "en";
      EndSelect
    Case #LANG_ESTONIAN: ProcedureReturn "et_EE";
    Case #LANG_FAEROESE: ProcedureReturn "fo_FO";
    Case #LANG_FARSI: ProcedureReturn "fa_IR";
    Case #LANG_FINNISH: ProcedureReturn "fi_FI";
    Case #LANG_FRENCH:
      Select sub
        Case #SUBLANG_FRENCH: ProcedureReturn "fr_FR";
        Case #SUBLANG_FRENCH_BELGIAN: ProcedureReturn "fr_BE";  /* WALLOON */
        Case #SUBLANG_FRENCH_CANADIAN: ProcedureReturn "fr_CA";
        Case #SUBLANG_FRENCH_SWISS: ProcedureReturn "fr_CH";
        Case #SUBLANG_FRENCH_LUXEMBOURG: ProcedureReturn "fr_LU";
        Case #SUBLANG_FRENCH_MONACO: ProcedureReturn "fr_MC";
        Default: ProcedureReturn "fr";
      EndSelect
    Case $62: ProcedureReturn "fy_NL"; /* FRISIAN */ 
    Case $67: ProcedureReturn "ful_NG"; /* FULFULDE */ 
    Case $3C: ; /* GAELIC */
      Select sub
        Case $01: ProcedureReturn "gd_GB"; /* SCOTTISH */ 
        Case $02: ProcedureReturn "ga_IE"; /* IRISH */ 
        Default: ProcedureReturn "C";
      EndSelect
    Case #LANG_GALICIAN: ProcedureReturn "gl_ES";
    Case #LANG_GEORGIAN: ProcedureReturn "ka_GE";
    Case #LANG_GERMAN:
      Select sub
        Case #SUBLANG_GERMAN: ProcedureReturn "de_DE";
        Case #SUBLANG_GERMAN_SWISS: ProcedureReturn "de_CH";
        Case #SUBLANG_GERMAN_AUSTRIAN: ProcedureReturn "de_AT";
        Case #SUBLANG_GERMAN_LUXEMBOURG: ProcedureReturn "de_LU";
        Case #SUBLANG_GERMAN_LIECHTENSTEIN: ProcedureReturn "de_LI";
        Default: ProcedureReturn "de";
      EndSelect
    Case #LANG_GREEK: ProcedureReturn "el_GR";
    Case $74: ProcedureReturn "gn_PY"; /* GUARANI */ 
    Case #LANG_GUJARATI: ProcedureReturn "gu_IN";
    Case $68: ProcedureReturn "ha_NG"; /* HAUSA */ 
    Case $75: ; /* HAWAIIAN */
      ; /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
      ; Or Hawaii Creole English ("cpe_US", 600000 speakers)?  */
      ProcedureReturn "cpe_US";
    Case #LANG_HEBREW: ProcedureReturn "he_IL";
    Case #LANG_HINDI: ProcedureReturn "hi_IN";
    Case #LANG_HUNGARIAN: ProcedureReturn "hu_HU";
    Case $69: ProcedureReturn "nic_NG"; /* IBIBIO */ 
    Case #LANG_ICELANDIC: ProcedureReturn "is_IS";
    Case $70: ProcedureReturn "ibo_NG"; /* IGBO */ 
    Case #LANG_INDONESIAN: ProcedureReturn "id_ID";
    Case $5D: ProcedureReturn "iu_CA"; /* INUKTITUT */ 
    Case #LANG_ITALIAN:
      Select sub
        Case #SUBLANG_ITALIAN: ProcedureReturn "it_IT";
        Case #SUBLANG_ITALIAN_SWISS: ProcedureReturn "it_CH";
        Default: ProcedureReturn "it";
      EndSelect
    Case #LANG_JAPANESE: ProcedureReturn "ja_JP";
    Case #LANG_KANNADA: ProcedureReturn "kn_IN";
    Case $71: ProcedureReturn "kau_NG"; /* KANURI */ 
    Case #LANG_KASHMIRI:
      Select sub
        Case #SUBLANG_DEFAULT: ProcedureReturn "ks_PK";
        Case #SUBLANG_KASHMIRI_INDIA: ProcedureReturn "ks_IN";
        Default: ProcedureReturn "ks";
      EndSelect
    Case #LANG_KAZAK: ProcedureReturn "kk_KZ";
    Case #LANG_KONKANI:
      ; /* FIXME: Adjust this when such locales appear on Unix.  */
      ProcedureReturn "kok_IN";
    Case #LANG_KOREAN: ProcedureReturn "ko_KR";
    Case #LANG_KYRGYZ: ProcedureReturn "ky_KG";
    Case $54: ProcedureReturn "lo_LA"; /* LAO */ 
    Case $76: ProcedureReturn "la_VA"; /* LATIN */ 
    Case #LANG_LATVIAN: ProcedureReturn "lv_LV";
    Case #LANG_LITHUANIAN: ProcedureReturn "lt_LT";
    Case #LANG_MACEDONIAN: ProcedureReturn "mk_MK";
    Case #LANG_MALAY:
      Select sub
        Case #SUBLANG_MALAY_MALAYSIA: ProcedureReturn "ms_MY";
        Case #SUBLANG_MALAY_BRUNEI_DARUSSALAM: ProcedureReturn "ms_BN";
        Default: ProcedureReturn "ms";
      EndSelect
    Case #LANG_MALAYALAM: ProcedureReturn "ml_IN";
    Case $3A: ProcedureReturn "mt_MT"; /* MALTESE */ 
    Case #LANG_MANIPURI:
      ; /* FIXME: Adjust this when such locales appear on Unix.  */
      ProcedureReturn "mni_IN";
    Case #LANG_MARATHI: ProcedureReturn "mr_IN";
    Case #LANG_MONGOLIAN:
      ProcedureReturn "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN".  */
    Case #LANG_NEPALI:
      Select sub
        Case #SUBLANG_DEFAULT: ProcedureReturn "ne_NP";
        Case #SUBLANG_NEPALI_INDIA: ProcedureReturn "ne_IN";
        Default: ProcedureReturn "ne";
      EndSelect
    Case #LANG_NORWEGIAN:
      Select sub
        Case #SUBLANG_NORWEGIAN_BOKMAL: ProcedureReturn "no_NO";
        Case #SUBLANG_NORWEGIAN_NYNORSK: ProcedureReturn "nn_NO";
        Default: ProcedureReturn "no";
      EndSelect
    Case #LANG_ORIYA: ProcedureReturn "or_IN";
    Case $72: ProcedureReturn "om_ET"; /* OROMO */ 
    Case $79: ProcedureReturn "pap_AN"; /* PAPIAMENTU */ 
    Case $63: ; /* PASHTO */
      ProcedureReturn "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF".  */
    Case #LANG_POLISH: ProcedureReturn "pl_PL";
    Case #LANG_PORTUGUESE:
      Select sub
        Case #SUBLANG_PORTUGUESE: ProcedureReturn "pt_PT";
          ; /* Hmm. #SUBLANG_PORTUGUESE_BRAZILIAN == #SUBLANG_DEFAULT.
          ; Same phenomenon As #SUBLANG_ENGLISH_US == #SUBLANG_DEFAULT. */
        Case #SUBLANG_PORTUGUESE_BRAZILIAN: ProcedureReturn "pt_BR";
        Default: ProcedureReturn "pt";
      EndSelect
    Case #LANG_PUNJABI: ProcedureReturn "pa_IN";
    Case $17: ProcedureReturn "rm_CH"; /* RHAETO-ROMANCE */ 
    Case #LANG_ROMANIAN: ProcedureReturn "ro_RO";
    Case #LANG_RUSSIAN:
      ProcedureReturn "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA".  */
    Case $3B: ProcedureReturn "se_NO"; /* SAMI */ 
    Case #LANG_SANSKRIT: ProcedureReturn "sa_IN";
    Case #LANG_SINDHI: ProcedureReturn "sd";
    Case $5B: ProcedureReturn "si_LK"; /* SINHALESE */ 
    Case #LANG_SLOVAK: ProcedureReturn "sk_SK";
    Case #LANG_SLOVENIAN: ProcedureReturn "sl_SI";
    Case $77: ProcedureReturn "so_SO"; /* SOMALI */ 
    Case #LANG_SORBIAN:
      ; /* FIXME: Adjust this when such locales appear on Unix.  */
      ProcedureReturn "wen_DE";
    Case #LANG_SPANISH:
      Select sub
        Case #SUBLANG_SPANISH: ProcedureReturn "es_ES";
        Case #SUBLANG_SPANISH_MEXICAN: ProcedureReturn "es_MX";
        Case #SUBLANG_SPANISH_MODERN:
          ProcedureReturn "es_ES@modern";	/* not seen on Unix */
        Case #SUBLANG_SPANISH_GUATEMALA: ProcedureReturn "es_GT";
        Case #SUBLANG_SPANISH_COSTA_RICA: ProcedureReturn "es_CR";
        Case #SUBLANG_SPANISH_PANAMA: ProcedureReturn "es_PA";
        Case #SUBLANG_SPANISH_DOMINICAN_REPUBLIC: ProcedureReturn "es_DO";
        Case #SUBLANG_SPANISH_VENEZUELA: ProcedureReturn "es_VE";
        Case #SUBLANG_SPANISH_COLOMBIA: ProcedureReturn "es_CO";
        Case #SUBLANG_SPANISH_PERU: ProcedureReturn "es_PE";
        Case #SUBLANG_SPANISH_ARGENTINA: ProcedureReturn "es_AR";
        Case #SUBLANG_SPANISH_ECUADOR: ProcedureReturn "es_EC";
        Case #SUBLANG_SPANISH_CHILE: ProcedureReturn "es_CL";
        Case #SUBLANG_SPANISH_URUGUAY: ProcedureReturn "es_UY";
        Case #SUBLANG_SPANISH_PARAGUAY: ProcedureReturn "es_PY";
        Case #SUBLANG_SPANISH_BOLIVIA: ProcedureReturn "es_BO";
        Case #SUBLANG_SPANISH_EL_SALVADOR: ProcedureReturn "es_SV";
        Case #SUBLANG_SPANISH_HONDURAS: ProcedureReturn "es_HN";
        Case #SUBLANG_SPANISH_NICARAGUA: ProcedureReturn "es_NI";
        Case #SUBLANG_SPANISH_PUERTO_RICO: ProcedureReturn "es_PR";
        Default: ProcedureReturn "es";
      EndSelect
    Case $30: ProcedureReturn "bnt_TZ"; /* SUTU */ 
    Case #LANG_SWAHILI: ProcedureReturn "sw_KE";
    Case #LANG_SWEDISH:
      Select sub
        Case #SUBLANG_DEFAULT: ProcedureReturn "sv_SE";
        Case #SUBLANG_SWEDISH_FINLAND: ProcedureReturn "sv_FI";
        Default: ProcedureReturn "sv";
      EndSelect
    Case #LANG_SYRIAC: ProcedureReturn "syr_TR"; /* An extinct language.  */
    Case $64: ProcedureReturn "tl_PH"; /* TAGALOG */ 
    Case $28: ProcedureReturn "tg_TJ"; /* TAJIK */ 
    Case $5F: ProcedureReturn "ber_MA"; /* TAMAZIGHT */ 
    Case #LANG_TAMIL:
      ProcedureReturn "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG".  */
    Case #LANG_TATAR: ProcedureReturn "tt_RU";
    Case #LANG_TELUGU: ProcedureReturn "te_IN";
    Case #LANG_THAI: ProcedureReturn "th_TH";
    Case $51: ProcedureReturn "bo_CN"; /* TIBETAN */ 
    Case $73: ProcedureReturn "ti_ET"; /* TIGRINYA */ 
    Case $31: ProcedureReturn "ts_ZA"; /* TSONGA */ 
    Case #LANG_TURKISH: ProcedureReturn "tr_TR";
    Case $42: ProcedureReturn "tk_TM"; /* TURKMEN */ 
    Case #LANG_UKRAINIAN: ProcedureReturn "uk_UA";
    Case #LANG_URDU:
      Select sub
        Case #SUBLANG_URDU_PAKISTAN: ProcedureReturn "ur_PK";
        Case #SUBLANG_URDU_INDIA: ProcedureReturn "ur_IN";
        Default: ProcedureReturn "ur";
      EndSelect
    Case #LANG_UZBEK:
      Select sub
        ; /* FIXME: Adjust this when Uzbek locales appear on Unix.  */
        Case #SUBLANG_UZBEK_LATIN: ProcedureReturn "uz_UZ@latin";
        Case #SUBLANG_UZBEK_CYRILLIC: ProcedureReturn "uz_UZ@cyrillic";
        Default: ProcedureReturn "uz";
      EndSelect
    Case $33: ProcedureReturn "ven_ZA"; /* VENDA */ 
    Case #LANG_VIETNAMESE: ProcedureReturn "vi_VN";
    Case $52: ProcedureReturn "cy_GB"; /* WELSH */ 
    Case $34: ProcedureReturn "xh_ZA"; /* XHOSA */ 
    Case $78: ProcedureReturn "sit_CN"; /* YI */ 
    Case $3D: ProcedureReturn "yi_IL"; /* YIDDISH */ 
    Case $6A: ProcedureReturn "yo_NG"; /* YORUBA */ 
    Case $35: ProcedureReturn "zu_ZA"; /* ZULU */ 
    Default: ProcedureReturn "C";
    EndSelect  
EndProcedure

translator.pbi

Code : Tout sélectionner

; Translator
; JCV @ PureBasic Forum
; http://www.JCVsite.com
; Corrected by djes@free.fr Jul 18th 2011

#COUNT_OFFSET = 8
#ORIG_TABLE_POINTER_OFFSET = 12
#TRANSLATION_TABLE_POINTER_OFFSET = 16

Global origTableOffset.l, translationTableOffset.l
Global *Translator_MemoryID, Translator_Filesize
Global NewMap TranslationTable.s()

;IncludeFile "filereader.pbi"
IncludeFile "locale.pbi"

Declare.s Translator_Autodetect(podir.s, requested_locale.s)
Declare   Translator(FileName.s)
Declare.s Translator_getOrigMessage(index.l)
Declare.s Translator_getTranslationMessage (index.l)
Declare.s Translator_translate(message.s)

Procedure Translator_init(podir.s, locale.s)
  ;Debug Translator_Autodetect(podir, locale)
  ProcedureReturn Translator(Translator_Autodetect(podir, locale))
EndProcedure

Procedure Translator_destroy()
  ClearMap(TranslationTable())
EndProcedure
  
Procedure.s Translator_Autodetect(podir.s, requested_locale.s)
  Protected locale.s, find_
   
  If requested_locale = ""
    locale = getLanguageName()    
    If locale = "C"
      ProcedureReturn ""
    EndIf
  Else
    locale = requested_locale
  EndIf
  
  If FileSize(podir + locale + ".mo") > 0
    ProcedureReturn podir + locale + ".mo"
  EndIf
    
  If FileSize(podir + locale + "_" + UCase(locale) + ".mo") > 0   
    ProcedureReturn podir + locale + "_" + UCase(locale) + ".mo"
  EndIf
  
  ; Give up
  ProcedureReturn ""
EndProcedure

Procedure.s Translator_getOrigMessage(index.l)
  Protected len.l, msgOffset.l
  len       = PeekL(*Translator_MemoryID + origTableOffset + index * 8)
  msgOffset = PeekL(*Translator_MemoryID + origTableOffset + index * 8 + 4)
  ProcedureReturn PeekS(*Translator_MemoryID + msgOffset, len, #PB_UTF8)
EndProcedure

Procedure.s Translator_getTranslationMessage(index.l)
  Protected len.l, msgOffset.l
  len       = PeekL(*Translator_MemoryID + translationTableOffset + index * 8)
  msgOffset = PeekL(*Translator_MemoryID + translationTableOffset + index * 8 + 4)
  ProcedureReturn PeekS(*Translator_MemoryID + msgOffset, len, #PB_UTF8)
EndProcedure

Procedure Translator(FileName.s)
  
  hFile = ReadFile(#PB_Any, FileName)
  If hFile
    Translator_Filesize = Lof(hFile)                            ; get the length of opened file
    *Translator_MemoryID = AllocateMemory(Translator_Filesize)         ; allocate the needed memory
    If *Translator_MemoryID
      addr = ReadData(hFile, *Translator_MemoryID, Translator_Filesize)   ; read all data into the memory block
      ;Debug "Number of bytes read: " + Str(Translator_Filesize)
    Else
      ProcedureReturn 1
    EndIf
    CloseFile(hFile)
  Else
    ProcedureReturn 2
  EndIf
  
  ; Sanity check file Size.
  If (Translator_Filesize < #TRANSLATION_TABLE_POINTER_OFFSET)
    ProcedureReturn 0
  EndIf
  
  ; Further sanity check file Size.
  If (Translator_Filesize < origTableOffset Or Translator_Filesize < translationTableOffset)
    ProcedureReturn 1
  EndIf

	count.l                  = PeekL(*Translator_MemoryID + #COUNT_OFFSET)
	origTableOffset.l        = PeekL(*Translator_MemoryID + #ORIG_TABLE_POINTER_OFFSET)
	translationTableOffset.l = PeekL(*Translator_MemoryID + #TRANSLATION_TABLE_POINTER_OFFSET)
	
	;Fill map table
	For i = 0 To count - 1
	  TranslationTable(Translator_getOrigMessage(i)) = Translator_getTranslationMessage(i)
	  ;Debug "'" + Translator_getOrigMessage(i) + "' : '" + Translator_getTranslationMessage(i) + "'"
  Next i
     
  FreeMemory(*Translator_MemoryID)
  
EndProcedure

Procedure.s t(msg.s)
  Protected len, out.s
  
  If msg = ""
    ProcedureReturn ""
  EndIf
  
  out = TranslationTable(msg)
  
  ; Use default text if no translation
  If out = ""
    out = msg
  EndIf
  
  ProcedureReturn out
EndProcedure

Macro GetText(msg)
  t(msg)
EndMacro
sample.pbi

Code : Tout sélectionner

; GetText PB implementation
; Primary code
; JCV @ PureBasic Forum
; http://www.JCVsite.com
; Corrected by djes@free.fr Jul 18th 2011

XIncludeFile "translator.pbi"

Translator_init("locale\", "fr_FR") ;let blank for autodetect

Debug t("Search")
Debug t("Please wait")

Translator_destroy()
locale\fr_FR.po

Code : Tout sélectionner

msgid ""
msgstr ""
"Project-Id-Version: Translator test\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-07-18 14:15+0100\n"
"PO-Revision-Date: 2011-07-18 14:15+0100\n"
"Last-Translator: djes <djes@free.fr>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-KeywordsList: gettext;gettext_noop;t\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Language: French\n"
"X-Poedit-Country: FRANCE\n"
"X-Poedit-SearchPath-0: PureBasic_GetText\n"

#: PureBasic_GetText/sample.pb:11
msgid "Search"
msgstr "Rechercher"

#: PureBasic_GetText/sample.pb:12
msgid "Please wait"
msgstr "Veuillez patienter"
 
Dernière modification par djes le mer. 20/juil./2011 22:18, modifié 1 fois.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Traduction d'applications avec GetText et Poedit

Message par Thyphoon »

ça marche super !! :mrgreen: Merci Djes !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Traduction d'applications avec GetText et Poedit

Message par Kwai chang caine »

Bon..je vais encore me ridiculiser en public :mrgreen:
N'ayant pas compris a quoi servait ce code....

J'ai chargé tes codes, nommé et tout le toutim, et une fois fini, j'ai vu que dans ta gentillesse tu avais tout mis dans un "caddy" :?
J'ai donc tout balancé ce que j'avais fait, et chargé le caddy dans la voiture, et démarré le moteur :D
J'ai vu le debugger ecrire "Rechercher"' et "Veuiller patienter"

Alors comme je suis assez discipliné comme gars...c'est ce que j'ai fait......en me disant y va se passer "queque" chose 8O
1 minute c'est long....quand on attend "queque" chose "qu'on sait pas ce que c'est qu'on attend" !!! :roll:

Rien ne s'est passé alors j'ai relancé et fait la même manoeuvres plusieurs fois ...

Apres 5 minutes..et m'appercevant enfin que PB avait marqué "Execution terminée" un doute s'est installé dans mon esprit

Le grand DJES y donne un code modifié, TYPHOON y dit que c'est de la balle....et le "perspicace" KCC il attend toujours devant l'IDE jaune :roll:
Ne mettant en doute aucune de vos compétences..ce n'est qu'apres un laps de temps assez relatif...que j'ai compris :idea:

Super ton traducteur 8)
Et merci pour le partage :wink:

PS: Merci aussi bien sur a Jean Claude Van damme pour le code d'origine 8)
Dernière modification par Kwai chang caine le mar. 19/juil./2011 9:24, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Traduction d'applications avec GetText et Poedit

Message par Kwai chang caine »

Par application, tu entends quoi ??
Y'a quand même pas toute la langue anglaise dans ce traducteur ??? :roll:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traduction d'applications avec GetText et Poedit

Message par djes »

(désolé pour le post rapide, je n'avais pas vu que tu étais encore dessus)
Non, y'a pas toute la langue, seulement les textes utilisés par notre application (ou programme si tu préfères ce terme)

Le gros problème, quand on développe une application multilingue, c'est que la traduction est une étape particulièrement longue et rébarbative ! Alors il faut autant que possible que ce soit l'ordi qui fasse le boulot. Imaginons par exemple une application très simple :

Code : Tout sélectionner

MessageRequester("Alerte", "Bonjour le monde")
On adapte un peu le code (minimum de boulot!) :

Code : Tout sélectionner

MessageRequester(t("Alerte"), t("Bonjour le monde"))
On passe ça à poedit (ou GetText) qui va nous générer un catalogue avec les chaines à traduire. On fait un catalogue par langue (par exemple en_EN.po pour l'anglais, de_DE pour l'allemand, etc).
Et c'est tout. L'application va s'adapter en fonction de la langue de l'utilisateur et des catalogues disponibles :)

Le plus gros avantage est pour le programmeur, qui n'a pas à reprendre tout son source, remplacer les chaînes par des constantes, etc. Là, GetText repère les chaînes qui sont contenues dans des t(""), et y'a plus qu'à traduire les catalogues avec un éditeur (poedit) qui existe déjà :)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Traduction d'applications avec GetText et Poedit

Message par Ar-S »

qui n'a pas à reprendre tout son source, remplacer les chaînes par des constantes
Va falloir que je regarde ça de près, car j'en suis exactement là avec resize, toutes les constantes sont maintenant créées mais poue mes prochains softs ça pourrait être fort utile.
Merci.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Traduction d'applications avec GetText et Poedit

Message par Kwai chang caine »

Merci beaucoup DJES de cette explication claire et détaillée 8)
J'avais pas cerné la puissance du truc :oops:

C'est une super idée 8)
Pour ma part les français regrettent assez que j'essaie de programmer, alors je crois pas qu'un jour, mes programmes depassent la france ...
Ils ont deja du mal a dépasser ma ville..voir mon bureau ... :mrgreen:

Et dans mes bureaux tout le monde parle la meme langue...la langue de bois :lol:
Cherche pas ...y'a pas encore de traducteur pour cette langue...et pourtant elle est de plus en plus usitée de nos jours :?

Mais ça reste une super idée, pour des gens comme vous, qui font des applis de la "rome" .."polyglottales" :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traduction d'applications avec GetText et Poedit

Message par djes »

Tu sais, un petit utilitaire ou un jeu diffusé sur le net rencontre parfois de manière fortuite un énorme succès, ça ne m'étonnerait pas que tu nous pondes quelque chose comme ça un de ces 4 ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Traduction d'applications avec GetText et Poedit

Message par blendman »

ça a l'air fort sympathique ce code :).

C'est marrant, car j'utilise à peu près la même chose dans mon soft de dessins. J'ai crée une map (global) et au lieu de mettre :

Code : Tout sélectionner

messagerequester("Erreur","Impossible de dessiner sur un calque invisible").
Je fais :

Code : Tout sélectionner

messagerequester(dico("Error"),dico("layer_invisible")).
Et ça me remplace pour les langues présentes chaque texte :).
Idem dans mes menus, etc..

Ca ressemble à la même méthode on dirait (enfin, dans l'esprit).
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traduction d'applications avec GetText et Poedit

Message par djes »

Oui, c'est le même principe (et le bon serais-je tenté de dire!)
La chaîne "layer_invisible" est-elle un identifiant ou ton texte par défaut?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Traduction d'applications avec GetText et Poedit

Message par Progi1984 »

Pas mal... Bon boulot.

Quelle est la différence entre .po et .mo ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traduction d'applications avec GetText et Poedit

Message par djes »

L'un est le fichier source d'origine (texte), et l'autre est la version "compilée" en binaire, plus rapide et plus légère.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Traduction d'applications avec GetText et Poedit

Message par Progi1984 »

Laquelle utilises-tu ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Traduction d'applications avec GetText et Poedit

Message par djes »

Seule la version compilée sert pour le programme (.mo) ; l'autre sert de fichier de travail pour gettext/poedit. D'ailleurs rien n'empêche de recréer ces programmes, même s'ils ont d'autres fonctions dont pour l'instant je ne me sers pas (traduction de date, inversion de chaînes selon les pays, etc.)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Traduction d'applications avec GetText et Poedit

Message par blendman »

djes a écrit :Oui, c'est le même principe (et le bon serais-je tenté de dire!)
La chaîne "layer_invisible" est-elle un identifiant ou ton texte par défaut?
decor() est une map
donc dico("layer_invisible") est la key.

ça ressemble à ça : j'ouvre un fichier .ini et je vais chercher chaque key de cette façon :

Code : Tout sélectionner

dico("Newlayer")=ReadPreferenceString("1","Add a new layer")
et le fichier eng.ini :

Code : Tout sélectionner

[5]
; layers
1 = Add a new layer
2 = Delete the active layer
3 = Add a layer Mask
4 = Add a layer Adjustement
....
au lieux de [5], ça pourrait être [layers], c'est le 5ème item de mon menu (file/edit/image/view/layers...)

Voiloutch.
Répondre