3

请为我提供 zend_translate 和 zend_locale 的简单小型应用程序的文件夹结构和代码。

这样我就会有一些想法。我提到了 framework.zend,但不明白我应该在控制器、索引、boorstrap 甚至视图中提到什么。使用 zend_translate 和 zend_locale 对我来说似乎很忙。请帮我。

4

4 回答 4

1

举个例子,对于简单的翻译,我在 application.ini 中定义了以下内容:

resources.translate.data = APPLICATION_PATH "/translations/nl/"
resources.translate.locale = "nl"

在 /translations/nl/ 目录中,我有一个或多个翻译文件(.php、.ini、...)。

这就是你所需要的,基本上。

于 2012-01-06T20:07:19.667 回答
1

这是我正在使用的解决方案:

Plugin.php的代码

    // BEGIN: Translate
    $validLang = $this->getRequest()->getParam('lang');
    $translate = new Zend_Translate('csv', 'data/lang/en.csv', 'en');
    $translate->addTranslation('data/lang/ro.csv', 'ro');
    if($validLang)
    {
        Zend_Registry::set('lang', $validLang);
        $translate->setLocale($validLang);  
    }
    else
    {
        Zend_Registry::set('lang', 'en');
        $translate->setLocale('en');
    }
    Zend_Registry::set('translate', $translate);
    // END: Translate

en.csv的代码

front_user_menu-wall;Wall

ro.csv的代码

front_user_menu-wall;Perete

任何Zend View 文件的代码

echo Zend_Registry::get('translate')->_('front_user_menu-wall');

以及一些解释:

在文件夹 data/lang 我有 2 个 .csv 翻译文件。该结构是不言自明的,分号 (;) 将变量名称 (front_user_menu-wall) 与变量值 (Wall) 分开。每个变量都必须放在一个新行上,并且您可以在其中包含行注释(例如:#this is a comment)。ro.csv 文件是罗马尼亚语翻译文件,它具有相同的结构,但变量的值明显不同。

在 Plugin.php 里面你有

$validLang = $this->getRequest()->getParam('lang);

Zend 等价于

$validLang = $_GET['lang'];

在接下来的 2 行代码中,我们使用 2 个翻译 .csv 文件实例化一个新的 Zend_Translate 类。接下来我们检查 $validLang 是否不为空,如果不是,我们在翻译文件中设置 Zend_Registry 语言变量(Zend_Registry 与 $_SESSION 类似)。如果 $validLang 为空,那么我们默认翻译为英语。

如果您完成了上述所有步骤,您现在可以回显

Zend_Registry::get('translate')->_('front_user_menu-wall');

获得英语或罗马尼亚语翻译。

于 2012-09-03T12:18:52.480 回答
1

我就是这样做的,

引导程序.php

protected function _initTranslate()
{
    $translate = new Zend_Translate(array(
        'adapter' => 'gettext',
        'content' => APPLICATION_PATH . '/locale/en-US.mo',
        'locale'  => 'en'
    ));

    Zend_Registry::set('translate', $translate);
    Zend_Form::setDefaultTranslator($translate);

    $this->bootstrap('view');
    $view = $this->getResource('view');
    $view->translate = $translate;
}

如果我必须从控制器发送消息。. 我愿意

AuthController.php

$this->view->message = 'success';

然后在视图中

登录.phtml

if (isset($this->message)) {
    echo $this->translate->_($this->message);
}

以上将从“en-US.mo”文件中输出“成功”的翻译值。

希望有帮助!

于 2012-08-27T22:27:25.820 回答
0

这是我的解决方案:

protected function _initTranslate()
{
    //set gettext adapter
    $translate = new Zend_Translate('Gettext', APPLICATION_PATH . '/languages',
        null, array('scan' => Zend_Translate::LOCALE_FILENAME));                
    // get locale from url
    if (preg_match("/^\/([a-zA-Z]{2})($|\/)/", $_SERVER['REQUEST_URI'], $matches)) {
        $lang = $matches[1];
    } else {
        //if locale not exsist in url - get browser locale
        $locale = new Zend_Locale(Zend_Locale::BROWSER);
        $lang = $locale->getLanguage();    
    }
    if (!$translate->isAvailable($lang)) {             
         $lang = 'en';
    }            
    $translate->setLocale($lang);       
    $front = $this->getResource('FrontController');
    $front->setBaseUrl('/' . $lang . '/');        
    Zend_Registry::set('Zend_Translate', $translate); 
    $locale = $translate->getLocale();        

    $source = APPLICATION_PATH . '/languages/'.$locale.'.mo';        

    $translate->addTranslation($source, $locale);        
}
于 2012-08-15T17:42:39.153 回答