如何使用db和fallback执行Zend_Locale?

时间:2011-01-10 08:02:24

标签: php zend-framework localization zend-translate

所以,我已经google'd并找到了一种方法,使我的应用程序可以使用数据库适配器进行本地化(这非常有用),现在下一个上升的问题是后备。这是场景:

  • 申请表包含英语,德语,法语和韩语的翻译。
  • 英语是100%,其他人没有。
  • 如果字符串未以德语本地化,法语或韩语需要回退到英语
  • 适配器使用和ID不是本地化字符串

示例:

<?php

    // This is init'd in the bootstrap
    try {
        $locale = new Zend_Locale(Zend_Locale::BROWSER); /* Q1!!! */
    } catch (Zend_Locale_Exception $e) {
        $locale = new Zend_Locale('en_US');
    }

    $translate = new Zend_Translate(
        'XYZ_Translate_Adapter_Db', // My adapter
        $data,                      // Populated variable
        $locale->getLanguage(),     // Returns en, de, fr or ko
        array()                     // Options to pass to the adapter, none.
    );

    // This is called from the view
    echo $translate->_(123); /* Q2!!! */

?>

echo'd输出将是 ID 123 的相应文本。现在在 Q1!评论 ,如何验证en / de / fr / ko语言环境?对于 Q2!评论 ,如果找不到其他语言的 ID 123 ,我该如何回退到英语。

此外,我将处理日期和货币,因此我想验证fr_FR,de_DE,ko_KO而不是像fr_CA或de_AT这样的变体。因此,对于第一部分,我需要验证语言环境是否来自我需要的国家/地区,或者它们是否至少是一个有效的语言(并强制它们到正确的国家);对于最后一部分,我需要验证如果翻译不在db上,则回归到英语。

1 个答案:

答案 0 :(得分:1)

Zend_Translate支持后退功能。 这里是从de到en

的回退示例
$translate = new Zend_Translate(
array(
    'adapter' => Zend_Translate::AN_XLIFF,
    'content' => APPLICATION_PATH . '/../data/locales/',
    'locale'  => $locale->getLanguage(),
    'scan'  => Zend_Translate::LOCALE_FILENAME,
    'useId'   => true,
    'route'   => array('de' => 'en')
    )
);

注意“route”参数,它允许您设置回退规则。 您无需担心区域代码会自动处理。 阅读Zend_Translate路由部分中的更多内容 http://framework.zend.com/manual/en/zend.translate.additional.html#zend.translate.additional.rerouting