2011-08-31 34 views
5

Đối với bản dịch trong ứng dụng của chúng tôi, chúng tôi đang sử dụng Zend Translate với bộ điều hợp gettext. Trong mỗi mô-đun là một thư mục translations, chứa các tệp .mo cho tất cả các ngôn ngữ;ghi đè các tập tin gettext .mo

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

nào được quét và bổ sung thông qua các phương pháp addTranslation():

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

Các chuỗi trong đơn của tôi là được dịch bằng phương pháp _(), chuyển ngôn ngữ hiện tại làm tham số (được lưu trữ trong lớp Ngôn ngữ của khung của tôi):

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

Bây giờ tôi cần tùy chỉnh các chuỗi ngôn ngữ tiếng Hà Lan (nl) cho một khách hàng cụ thể. Tôi không muốn sửa đổi tệp nl.mo, vì điều đó sẽ ảnh hưởng đến các khách hàng khác. Vì vậy, tôi đã tạo một tệp có tên là nl_kpn.mo (kpn là tên khách hàng) và đã chuyển đổi $this->language thành 'nl_kpn'. Tôi đã hy vọng Zend Transate sẽ lấy nl.mo làm tệp cơ sở, ghi đè các chuỗi tùy chỉnh được tìm thấy trong nl_kpn.mo. Nhưng tiếc là tôi đã trải qua, như manual states:

fr_CH sẽ được hạ cấp xuống fr

Vì vậy, tất cả các chuỗi vẫn còn từ tập tin nl.mo, mặc dù $this->language được thiết lập để 'nl_kpn'. Vậy làm thế nào tôi có thể tạo ra một phiên bản cụ thể hơn của một ngôn ngữ, ghi đè các chuỗi từ một ngôn ngữ chung? Nó phải là có thể, phải không? Bởi vì cũng có en_UK và en_, các ngôn ngữ khác nhau có cùng ngôn ngữ.

+0

Hmm, phương thức 'addTranslation()' thuộc lớp nào? Tôi chỉ tìm thấy 'phương thức công cộng addTranslation ($ options = array())' trong lớp 'Zend_Translate_Adapter', nhưng nó có một chữ ký khác như bạn có thể thấy. – Zyava

Trả lời

0

Như Rijk đã nói, Zend_Translate sẽ cố gắng gọi một Zend_Locale, mà chỉ đơn giản là không tồn tại. Thật không may, danh sách đã được đặt thành riêng tư, vì vậy chúng tôi không thể sử dụng thừa kế để chỉ đơn giản là lấy được thực hiện của chính chúng tôi.

Tuy nhiên, bạn có hai tùy chọn. Tùy thuộc vào thiết lập của bạn, bạn chỉ có thể đặt nl.mo-tệp riêng cho khách hàng cụ thể này bằng cách cung cấp một thư mục khác trong cấu hình. Bằng cách đó, bạn có thể liên kết tất cả các tệp ngôn ngữ khác và có một tệp riêng biệt cho máy khách kpn-client.

Tùy chọn thứ hai bạn có là loại bỏ Zend_Translate và sử dụng php mặc định gettext. Vì bạn đang sử dụng các tệp gettext và dường như sử dụng hàm translate(), bạn sẽ không còn công việc nào khác ngoài việc cấu trúc lại $ ZendTranslate thành lớp gettext của bạn. Nếu bạn sử dụng Zend_Translate tự động trong các lớp khác (ví dụ: trong Zend_Navigation), bạn chỉ có thể để nguyên những thứ đó.

Trong khi tùy chọn thứ 2 không hoạt động, có một chút lộn xộn - tuy nhiên, lựa chọn thứ ba và sạch sẽ là kế thừa Zend_Locale và viết lại tất cả các phương thức truy cập danh sách ngôn ngữ riêng. Bằng cách đó, bạn có thể thêm của riêng bạn. Hoặc bạn thậm chí còn đi lenghts viết lại các phần của Zend_Locale để hỗ trợ thêm ngôn ngữ động và gửi một tập tin vá lỗi - theo cách đó, chúng tôi cũng có thể hưởng lợi từ công việc của bạn. ;)

+1

Cảm ơn, ý tưởng hay! Cả hai tùy chọn đều tốt, tôi thậm chí còn không xem xét việc loại bỏ 'Zend_Translate'. Trong ứng dụng thực tế, chúng tôi sử dụng khung làm việc riêng của mình, điều này chỉ thích nghi với lớp Zend, vì vậy nó sẽ yêu cầu ít thay đổi mã để thay đổi điều đó. :) – Rijk

0

bạn có thể thử để ghi đè phương pháp _() từ Zend_Translate_Adapter và kiểm tra tên file:

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

Tôi không hiểu làm thế nào điều này có thể giúp đỡ? Tôi muốn lớp trả về các chuỗi từ 'nl_kpn', không phải 'hạ cấp' thành' nl' (điều này đã xảy ra). – Rijk

0

Tôi nghĩ rằng cách tốt nhất để làm điều này là sử dụng phương pháp isTranslated. Bạn có thể làm

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, $ ban đầu = false, $ locale = null)
mất văn bản mà bạn muốn kiểm tra như tham số đầu tiên của nó, và tham số thứ ba là không bắt buộc các ngôn ngữ mà bạn muốn thực hiện kiểm tra. Tham số thứ hai tùy chọn tuyên bố liệu bản dịch có được sửa sang ngôn ngữ được khai báo hay không, hoặc có thể sử dụng một bộ bản dịch thấp hơn. Nếu bạn có một văn bản có thể được trả lại cho 'en' nhưng không phải cho 'en_' bạn thường sẽ nhận được bản dịch được trả về, nhưng bằng cách đặt $ original thành true, isTranslated() sẽ trả về false.
Tính năng này có phù hợp với bạn không?

+1

Tôi không chắc bạn hiểu câu hỏi của mình .. Tôi muốn thêm các ngôn ngữ 'tùy chỉnh' như 'nl_ [CUSTOMER] .po', và sau đó ghi đè một số chuỗi của tệp' nl.po' ban đầu và 'kế thừa' các tệp khác . – Rijk

1

Tôi nghĩ câu trả lời chỉ là điều này là không thể. Nơi đặt phải là một ngôn ngữ hiện có/phương ngữ, và được xác nhận với danh sách trong 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 

Tôi đoán tôi sẽ chỉ phải nghĩ ra một cách khác nhau để ghi đè lên các tập tin.Có thể chỉ tải trong một tệp khác nhau .po từ PHP.

Các vấn đề liên quan