2011-08-31 25 views
5

Para las traducciones en nuestra aplicación, estamos usando Zend Translate con el adaptador gettext. En cada módulo hay una carpeta translations, que contiene archivos .mo para todos los idiomas;anula los archivos gettext .mo

  • da.mo
  • nl.mo
  • en.mo

Qué se escanea y se añadió a través de la addTranslation() método:

if (is_dir($translations_dir)) { 
    foreach (new DirectoryIterator($translations_dir) as $file) { 
     if (substr($file, -3) == '.mo') { 
      $ZendTranslate->addTranslation($file->getPathname(), $file->getBasename('.mo')); 
     } 
    } 
} 

Las cadenas en mi solicitud son traducido usando el método _(), pasando el idioma actual como parámetro (se almacena en Clases de idiomas de mi marco):

$ZendTranslate->_($string, $this->language); 

ahora tengo que personalizar las cadenas de idioma holandés (nl) para un cliente específico. No quiero modificar el archivo nl.mo, ya que eso afectaría a otros clientes. Así que creé un archivo llamado nl_kpn.mo (kpn es el nombre del cliente), y cambié el $this->language a 'nl_kpn'. Esperaba que Zend Transate tomara nl.mo como el archivo base, anulando las cadenas personalizadas que se encuentran en nl_kpn.mo. Pero, por desgracia he experimentado, como el manual states:

fr_CH se reducirá a fr

Así que todas las cuerdas estaban todavía desde el archivo nl.mo, a pesar de que se estableció en $this->language 'nl_kpn'. Entonces, ¿cómo puedo crear una versión más específica de un idioma, anulando las cadenas del general? Debe ser posible, ¿verdad? Porque también hay en_UK y en_US, que son diferentes 'dialectos' del mismo idioma.

+0

Hmm, ¿a qué clase pertenece su método 'addTranslation()'? Solo encontré 'public function addTranslation ($ options = array())' en la clase 'Zend_Translate_Adapter', pero tiene otra firma como puede ver. – Zyava

Respuesta

0

Como dijo Rijk, Zend_Translate intentará invocar un Zend_Locale, que simplemente no existe. Desafortunadamente, el listado se ha establecido en privado, por lo que no podemos usar la herencia para derivar nuestra propia implementación.

Sin embargo, tiene dos opciones. Dependiendo de su configuración, puede establecer su propio archivo nl.mo para este cliente específico proporcionando un directorio diferente en la configuración. De esta forma, puede vincular todos los demás archivos de idioma y tener uno separado para el cliente kpn.

La segunda opción que tiene es deshacerse de Zend_Translate y usar el php predeterminado gettext. Como ya está usando los archivos gettext y parece que usa la función translate(), no tendría más trabajo que refactorizar $ ZendTranslate a su gettext-class. Si utiliza Zend_Translate automáticamente en otras clases (por ejemplo, en Zend_Navigation), puede dejar intactos.

Si bien la segunda opción funciona, es un poco complicada; sin embargo, la tercera alternativa es heredar Zend_Locale y reescribir todos los métodos que acceden a la lista de idiomas privados. De esta forma, puede agregar el suyo. O incluso puede repasar las partes de Zend_Locale para admitir la adición dinámica de idiomas y enviar un archivo de parche, de esa manera, también podemos beneficiarnos de su trabajo. ;)

+1

¡Gracias, buena idea! Ambas opciones suenan bien, ni siquiera había considerado deshacerme de 'Zend_Translate'. En la aplicación real, utilizamos nuestro propio marco que simplemente adapta la clase Zend, por lo que requeriría pocos cambios en el código para cambiar eso. :) – Rijk

0

se puede tratar de reemplazar el método _() desde Zend_Translate_Adapter y comprobar nombre de archivo:

public function _($messageId, $locale = null) 
{ 
    if ($locale !== null && strpos($locale, "_") !== false && $this->translate($messageId, $locale) === $messageId) 
    { 
      $languages = explode("_", $locale); 
      $locale = $languages[0]; 
    } 

    return $this->translate($messageId, $locale); 
} 
+0

No entiendo cómo esto podría ayudar? Quiero que la clase devuelva las cadenas desde 'nl_kpn', no 'downgrade' a' nl' (esto ya está sucediendo). – Rijk

0

creo que la mejor manera de hacerlo es usando el método isTranslated. Usted puede hacer

if ($translate->isTranslated('message1')) { 
    print "'message1' can be translated"; 
} 

if (!($translate->isTranslated('message1', true, 'de'))) { 
    print "'message1' can not be translated to 'de'" 
    . " as it's available only in 'de_AT'"; 
} 

if ($translate->isTranslated('message1', false, 'de')) { 
    print "'message1' can be translated in 'de_AT' as it falls back to 'de'"; 
} 


isTranslated($ messageId, $ originales = false, $ locale = null)
toma el texto que desea comprobar como primer parámetro, y el tercer parámetro como optativa la la configuración regional para la que desea hacer el control. El segundo parámetro opcional declara si la traducción se fija al idioma declarado o se puede usar un conjunto inferior de traducciones. Si tiene un texto que puede devolverse para 'en' pero no para 'en_US' normalmente obtendrá la traducción devuelta, pero al establecer $ original en verdadero, isTranslated() devolverá falso.
¿Esto funciona para usted?

+1

No estoy seguro de que entiendas mi pregunta. Quiero agregar lenguajes 'personalizados' como 'nl_ [CLIENTE] .po', y luego anular algunas cadenas del archivo' nl.po' original y 'heredar' los otros . – Rijk

1

Creo que la respuesta es que esto no es posible. El local tiene que ser una lengua/dialecto existente, y se valida con la lista de Zend_Locale:

'root' => true, 'aa_DJ' => true, 'aa_ER' => true, 'aa_ET' => true, 'aa' => true, 
'af_NA' => true, 'af_ZA' => true, 'af' => true, 'ak_GH' => true, 'ak' => true, 
'am_ET' => true, 'am' => true, 'ar_AE' => true, 'ar_BH' => true, 'ar_DZ' => true, 
'ar_EG' => true, 'ar_IQ' => true, 'ar_JO' => true, 'ar_KW' => true, 'ar_LB' => true, 
'ar_LY' => true, 'ar_MA' => true, 'ar_OM' => true, 'ar_QA' => true, 'ar_SA' => true, 
'ar_SD' => true, 'ar_SY' => true, 'ar_TN' => true, 'ar_YE' => true, 'ar' => true, 
'as_IN' => true, 'as' => true, 'az_AZ' => true, 'az' => true, 'be_BY' => true, 
'be' => true, 'bg_BG' => true, 'bg' => true, 'bn_BD' => true, 'bn_IN' => true, 
'bn' => true, 'bo_CN' => true, 'bo_IN' => true, 'bo' => true, 'bs_BA' => true, 
'bs' => true, 'byn_ER'=> true, 'byn' => true, 'ca_ES' => true, 'ca' => true, 
'cch_NG'=> true, 'cch' => true, 'cop' => true, 'cs_CZ' => true, 'cs' => true, 
'cy_GB' => true, 'cy' => true, 'da_DK' => true, 'da' => true, 'de_AT' => true, 
'de_BE' => true, 'de_CH' => true, 'de_DE' => true, 'de_LI' => true, 'de_LU' => true, 
'de' => true, 'dv_MV' => true, 'dv' => true, 'dz_BT' => true, 'dz' => true, 
'ee_GH' => true, 'ee_TG' => true, 'ee' => true, 'el_CY' => true, 'el_GR' => true, 
'el' => true, 'en_AS' => true, 'en_AU' => true, 'en_BE' => true, 'en_BW' => true, 
'en_BZ' => true, 'en_CA' => true, 'en_GB' => true, 'en_GU' => true, 'en_HK' => true, 
'en_IE' => true, 'en_IN' => true, 'en_JM' => true, 'en_MH' => true, 'en_MP' => true, 
'en_MT' => true, 'en_NA' => true, 'en_NZ' => true, 'en_PH' => true, 'en_PK' => true, 
'en_SG' => true, 'en_TT' => true, 'en_UM' => true, 'en_US' => true, 'en_VI' => true, 
'en_ZA' => true, 'en_ZW' => true, 'en' => true, 'eo' => true, 'es_AR' => true, 
'es_BO' => true, 'es_CL' => true, 'es_CO' => true, 'es_CR' => true, 'es_DO' => true, 
'es_EC' => true, 'es_ES' => true, 'es_GT' => true, 'es_HN' => true, 'es_MX' => true, 
'es_NI' => true, 'es_PA' => true, 'es_PE' => true, 'es_PR' => true, 'es_PY' => true, 
'es_SV' => true, 'es_US' => true, 'es_UY' => true, 'es_VE' => true, 'es' => true, 
'et_EE' => true, 'et' => true, 'eu_ES' => true, 'eu' => true, 'fa_AF' => true, 
'fa_IR' => true, 'fa' => true, 'fi_FI' => true, 'fi' => true, 'fil_PH'=> true, 
'fil' => true, 'fo_FO' => true, 'fo' => true, 'fr_BE' => true, 'fr_CA' => true, 
'fr_CH' => true, 'fr_FR' => true, 'fr_LU' => true, 'fr_MC' => true, 'fr_SN' => true, 
'fr' => true, 'fur_IT'=> true, 'fur' => true, 'ga_IE' => true, 'ga' => true, 
'gaa_GH'=> true, 'gaa' => true, 'gez_ER'=> true, 'gez_ET'=> true, 'gez' => true, 
'gl_ES' => true, 'gl' => true, 'gsw_CH'=> true, 'gsw' => true, 'gu_IN' => true, 
'gu' => true, 'gv_GB' => true, 'gv' => true, 'ha_GH' => true, 'ha_NE' => true, 
'ha_NG' => true, 'ha_SD' => true, 'ha' => true, 'haw_US'=> true, 'haw' => true, 
'he_IL' => true, 'he' => true, 'hi_IN' => true, 'hi' => true, 'hr_HR' => true, 
'hr' => true, 'hu_HU' => true, 'hu' => true, 'hy_AM' => true, 'hy' => true, 
'ia' => true, 'id_ID' => true, 'id' => true, 'ig_NG' => true, 'ig' => true, 
'ii_CN' => true, 'ii' => true, 'in' => true, 'is_IS' => true, 'is' => true, 
'it_CH' => true, 'it_IT' => true, 'it' => true, 'iu' => true, 'iw' => true, 
'ja_JP' => true, 'ja' => true, 'ka_GE' => true, 'ka' => true, 'kaj_NG'=> true, 
'kaj' => true, 'kam_KE'=> true, 'kam' => true, 'kcg_NG'=> true, 'kcg' => true, 
'kfo_CI'=> true, 'kfo' => true, 'kk_KZ' => true, 'kk' => true, 'kl_GL' => true, 
'kl' => true, 'km_KH' => true, 'km' => true, 'kn_IN' => true, 'kn' => true, 
'ko_KR' => true, 'ko' => true, 'kok_IN'=> true, 'kok' => true, 'kpe_GN'=> true, 
'kpe_LR'=> true, 'kpe' => true, 'ku_IQ' => true, 'ku_IR' => true, 'ku_SY' => true, 
'ku_TR' => true, 'ku' => true, 'kw_GB' => true, 'kw' => true, 'ky_KG' => true, 
'ky' => true, 'ln_CD' => true, 'ln_CG' => true, 'ln' => true, 'lo_LA' => true, 
'lo' => true, 'lt_LT' => true, 'lt' => true, 'lv_LV' => true, 'lv' => true, 
'mk_MK' => true, 'mk' => true, 'ml_IN' => true, 'ml' => true, 'mn_CN' => true, 
'mn_MN' => true, 'mn' => true, 'mo' => true, 'mr_IN' => true, 'mr' => true, 
'ms_BN' => true, 'ms_MY' => true, 'ms' => true, 'mt_MT' => true, 'mt' => true, 
'my_MM' => true, 'my' => true, 'nb_NO' => true, 'nb' => true, 'nds_DE'=> true, 
'nds' => true, 'ne_IN' => true, 'ne_NP' => true, 'ne' => true, 'nl_BE' => true, 
'nl_NL' => true, 'nl' => true, 'nn_NO' => true, 'nn' => true, 'no' => true, 
'nr_ZA' => true, 'nr' => true, 'nso_ZA'=> true, 'nso' => true, 'ny_MW' => true, 
'ny' => true, 'oc_FR' => true, 'oc' => true, 'om_ET' => true, 'om_KE' => true, 
'om' => true, 'or_IN' => true, 'or' => true, 'pa_IN' => true, 'pa_PK' => true, 
'pa' => true, 'pl_PL' => true, 'pl' => true, 'ps_AF' => true, 'ps' => true, 
'pt_BR' => true, 'pt_PT' => true, 'pt' => true, 'ro_MD' => true, 'ro_RO' => true, 
'ro' => true, 'ru_RU' => true, 'ru_UA' => true, 'ru' => true, 'rw_RW' => true, 
'rw' => true, 'sa_IN' => true, 'sa' => true, 'se_FI' => true, 'se_NO' => true, 
'se' => true, 'sh_BA' => true, 'sh_CS' => true, 'sh_YU' => true, 'sh' => true, 
'si_LK' => true, 'si' => true, 'sid_ET'=> true, 'sid' => true, 'sk_SK' => true, 
'sk' => true, 'sl_SI' => true, 'sl' => true, 'so_DJ' => true, 'so_ET' => true, 
'so_KE' => true, 'so_SO' => true, 'so' => true, 'sq_AL' => true, 'sq' => true, 
'sr_BA' => true, 'sr_CS' => true, 'sr_ME' => true, 'sr_RS' => true, 'sr_YU' => true, 
'sr' => true, 'ss_SZ' => true, 'ss_ZA' => true, 'ss' => true, 'st_LS' => true, 
'st_ZA' => true, 'st' => true, 'sv_FI' => true, 'sv_SE' => true, 'sv' => true, 
'sw_KE' => true, 'sw_TZ' => true, 'sw' => true, 'syr_SY'=> true, 'syr' => true, 
'ta_IN' => true, 'ta' => true, 'te_IN' => true, 'te' => true, 'tg_TJ' => true, 
'tg' => true, 'th_TH' => true, 'th' => true, 'ti_ER' => true, 'ti_ET' => true, 
'ti' => true, 'tig_ER'=> true, 'tig' => true, 'tl' => true, 'tn_ZA' => true, 
'tn' => true, 'to_TO' => true, 'to' => true, 'tr_TR' => true, 'tr' => true, 
'trv_TW'=> true, 'trv' => true, 'ts_ZA' => true, 'ts' => true, 'tt_RU' => true, 
'tt' => true, 'ug_CN' => true, 'ug' => true, 'uk_UA' => true, 'uk' => true, 
'ur_IN' => true, 'ur_PK' => true, 'ur' => true, 'uz_AF' => true, 'uz_UZ' => true, 
'uz' => true, 've_ZA' => true, 've' => true, 'vi_VN' => true, 'vi' => true, 
'wal_ET'=> true, 'wal' => true, 'wo_SN' => true, 'wo' => true, 'xh_ZA' => true, 
'xh' => true, 'yo_NG' => true, 'yo' => true, 'zh_CN' => true, 'zh_HK' => true, 
'zh_MO' => true, 'zh_SG' => true, 'zh_TW' => true, 'zh' => true, 'zu_ZA' => true, 
'zu' => true 

supongo que voy a tener que idear una manera diferente para anular los archivos.Tal vez simplemente cargando en un archivo diferente .po de PHP.

Cuestiones relacionadas