Zend Translate 找不到语言

发布于 2024-12-21 02:26:24 字数 1180 浏览 1 评论 0原文

我遇到了 Zend Translate 问题。我已经在引导程序中配置了 zend 翻译,如下所示

public function _initTranslate() {
    $locale = new Zend_Locale();
    Zend_Registry::set('Zend_Locale', $locale);

    $translate = new Zend_Translate(array(
                'adapter' => 'ini'
                    )
    );

    $translate->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/pt.ini',
                'locale' => 'pt'
            )
    );
    $translate->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/en.ini',
                'locale' => 'en'
            )
    );

    $translate->setLocale($locale);
    Zend_Registry::set('Zend_Translate', $translate);
}

,我添加了语言,在我看来,我使用了翻译助手,但它显示了我

Notice: The language 'en' has to be added before it can be used. 
in C:\xampp\ZendFramework-1.11.10\library\Zend\Translate\Adapter.php 
on line 443
Notice: No translation for the language 'en' available. 
in C:\xampp\ZendFramework-1.11.10\library\Zend\Translate\Adapter.php 
on line 456

遵循 zendframework 参考指南的以下错误。我做错了什么?

I've got a Zend Translate Issue. I have configure the zend translate in the bootstrap like below

public function _initTranslate() {
    $locale = new Zend_Locale();
    Zend_Registry::set('Zend_Locale', $locale);

    $translate = new Zend_Translate(array(
                'adapter' => 'ini'
                    )
    );

    $translate->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/pt.ini',
                'locale' => 'pt'
            )
    );
    $translate->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/en.ini',
                'locale' => 'en'
            )
    );

    $translate->setLocale($locale);
    Zend_Registry::set('Zend_Translate', $translate);
}

I've added the languages and in my views I used translate helper but it shows me the following erros

Notice: The language 'en' has to be added before it can be used. 
in C:\xampp\ZendFramework-1.11.10\library\Zend\Translate\Adapter.php 
on line 443
Notice: No translation for the language 'en' available. 
in C:\xampp\ZendFramework-1.11.10\library\Zend\Translate\Adapter.php 
on line 456

I've followed zendframework reference guide. What I am doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

滥情稳全场 2024-12-28 02:26:24

您是否尝试将语言传递给 Zend_Locale

$locale = new Zend_Locale('en_US');

此外,我找到了解决方法:

$locale = new Zend_Locale(Zend_Locale::BROWSER);

$translate = new Zend_Translate(
    'ini',
    $yourPath,
    null,
    array('scan' => Zend_Translate::LOCALE_DIRECTORY));

// setting the right locale
if ($translate->isAvailable($locale->getLanguage())) {
    $translate->setLocale($locale);
} else {
    $translate->setLocale('en_US');
}

请参阅 http://framework.zend.com/issues/浏览/ZF-6612了解更多详情。注意:这是 1.8 的错误,我看到您正在使用 1.10,但解决方法可能仍然有效。

这也是一个很好的帖子: http:// zend-framework-community.634137.n4.nabble.com/how-handle-Locale-td659923.html

另外, Zend_Translate 提供了一个专门针对该类禁用通知的选项。如果内容正在被翻译,那么这(根据Zend)不是“错误”并且应该禁用通知。

// as a fourth parameter to Zend_Translate pass it:
array('disableNotices' => true);

Did you try passing a language to Zend_Locale?

$locale = new Zend_Locale('en_US');

Additionally, I found a work around:

$locale = new Zend_Locale(Zend_Locale::BROWSER);

$translate = new Zend_Translate(
    'ini',
    $yourPath,
    null,
    array('scan' => Zend_Translate::LOCALE_DIRECTORY));

// setting the right locale
if ($translate->isAvailable($locale->getLanguage())) {
    $translate->setLocale($locale);
} else {
    $translate->setLocale('en_US');
}

See http://framework.zend.com/issues/browse/ZF-6612 for more details. Note: this is a bug for 1.8, I see you're using 1.10 but the work-around might still work.

This is also a good thread: http://zend-framework-community.634137.n4.nabble.com/how-handle-Locale-td659923.html

Also, Zend_Translate offers an option to disable notices specifically for that class. If the content is being translated, then this (according to Zend) is not an "error" and notices should be disabled.

// as a fourth parameter to Zend_Translate pass it:
array('disableNotices' => true);
末骤雨初歇 2024-12-28 02:26:24

我用下面的代码解决了这个问题:

public function _initTranslate() {
    $this->bootstrap('locale');
    if($this->hasResource('locale')){
        $locale = $this->getResource('locale');
    }

    $translate = new Zend_Translate(array(
                'adapter' => 'ini',
                'disableNotices' => true,
                )
    );

    $translate->getAdapter()->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/pt.ini',
                'locale' => 'pt'
            )
    );
    $translate->getAdapter()->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/en.ini',
                'locale' => 'en'
            )
    );
    if($translate->getAdapter()->isAvailable($locale->getLanguage())){
        $translate->getAdapter()->setLocale($locale->getLanguage());
    }else{
        $translate->getAdapter()->setLocale('en');
    }
    Zend_Registry::set('Zend_Locale', $locale);
    Zend_Registry::set('Zend_Translate', $translate);
}

我编写了一个插件,通过传递 GET 变量来在运行时更改语言 例如:&lang=en

class Sistema_Plugin_Translate extends Zend_Controller_Plugin_Abstract {

    public function preDispatch(Zend_Controller_Request_Abstract $request) {

        $translate = Zend_Registry::get('Zend_Translate');
        $locale = Zend_Registry::get('Zend_Locale');
        $session = new Zend_Session_Namespace('language');

        //verifica se existe GET e valida
        if ($request->isGet()) {
            $filter = new Zend_Filter_Alpha();
            $param = $filter->filter($request->getParam('lang'));
            if (!empty($param) && $locale->isLocale($param) && $translate->getAdapter()->isAvailable($param)) {
                $translate->getAdapter()->setLocale($param);
                $session->language = $param;
            }
        }

        //verifica se o idioma do browser está disponivel se não coloca um idioma padrão
        if (!$translate->getAdapter()->isAvailable($locale->getLanguage())) {
            //linguagem não disponivel,seta idioma en
            $translate->getAdapter()->setLocale('en');
        }

        //verifica se há sessão com idioma definido
        if (isset($session->language)) {
            if ($translate->getAdapter()->isAvailable($session->language)) {
                $translate->getAdapter()->setLocale($session->language);

            }
        }


    }

}

I solved ths issue with the code below:

public function _initTranslate() {
    $this->bootstrap('locale');
    if($this->hasResource('locale')){
        $locale = $this->getResource('locale');
    }

    $translate = new Zend_Translate(array(
                'adapter' => 'ini',
                'disableNotices' => true,
                )
    );

    $translate->getAdapter()->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/pt.ini',
                'locale' => 'pt'
            )
    );
    $translate->getAdapter()->addTranslation(
            array(
                'content' => APPLICATION_PATH . '/configs/languages/en.ini',
                'locale' => 'en'
            )
    );
    if($translate->getAdapter()->isAvailable($locale->getLanguage())){
        $translate->getAdapter()->setLocale($locale->getLanguage());
    }else{
        $translate->getAdapter()->setLocale('en');
    }
    Zend_Registry::set('Zend_Locale', $locale);
    Zend_Registry::set('Zend_Translate', $translate);
}

And I coded a plugin to change language at runtime by just passing a GET variable Ex.: &lang=en

class Sistema_Plugin_Translate extends Zend_Controller_Plugin_Abstract {

    public function preDispatch(Zend_Controller_Request_Abstract $request) {

        $translate = Zend_Registry::get('Zend_Translate');
        $locale = Zend_Registry::get('Zend_Locale');
        $session = new Zend_Session_Namespace('language');

        //verifica se existe GET e valida
        if ($request->isGet()) {
            $filter = new Zend_Filter_Alpha();
            $param = $filter->filter($request->getParam('lang'));
            if (!empty($param) && $locale->isLocale($param) && $translate->getAdapter()->isAvailable($param)) {
                $translate->getAdapter()->setLocale($param);
                $session->language = $param;
            }
        }

        //verifica se o idioma do browser está disponivel se não coloca um idioma padrão
        if (!$translate->getAdapter()->isAvailable($locale->getLanguage())) {
            //linguagem não disponivel,seta idioma en
            $translate->getAdapter()->setLocale('en');
        }

        //verifica se há sessão com idioma definido
        if (isset($session->language)) {
            if ($translate->getAdapter()->isAvailable($session->language)) {
                $translate->getAdapter()->setLocale($session->language);

            }
        }


    }

}
把梦留给海 2024-12-28 02:26:24

逐步说明

为什么不尝试使用 Poedit 进行本地化..顺便说一句,它是一个很棒的工具..这是您引导程序中的

    protected function _initLanguage() {

            // initialising translator
            $translator = new Zend_Translate(
                            array(
                                'adapter' => 'gettext',
                                'content' => APPLICATION_PATH . '/languages/en/default.mo',
                                'locale' => 'en'
                            )
            );

            Zend_Registry::set('Zend_Translate', $translator);

            $frontController = Zend_Controller_Front::getInstance();
            $frontController->registerPlugin(new Application_Plugin_Translate());
        }

... /***结束引导程序代码*/
/插件文件*保存在你的插件目录中*/

        class Application_Plugin_Translate extends Zend_Controller_Action_Helper_Abstract
        {
    /**
     * Translation object
     *
     * @var Zend_Translate_Adapter
     */
    protected $_translator;

    /**
     * Constructor for manually handling
     *
     * @param Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate
     */
    public function __construct($translate = null)
    {
        if ($translate !== null) {
            $this->setTranslator($translate);
        }
    }

    /**
     * Translate a message
     * You can give multiple params or an array of params.
     * If you want to output another locale just set it as last single parameter
     * Example 1: translate('%1\$s + %2\$s', $value1, $value2, $locale);
     * Example 2: translate('%1\$s + %2\$s', array($value1, $value2), $locale);
     *
     * @param  string $messageid Id of the message to be translated
     * @return string|Zend_View_Helper_Translate Translated message
     */
    public function translate($messageid = null)
    {
        if ($messageid === null) {
            return $this;
        }

        $translate = $this->getTranslator();
        $options   = func_get_args();

        array_shift($options);
        $count  = count($options);
        $locale = null;
        if ($count > 0) {
            if (Zend_Locale::isLocale($options[($count - 1)], null, false) !== false) {
                $locale = array_pop($options);
            }
        }

        if ((count($options) === 1) and (is_array($options[0]) === true)) {
            $options = $options[0];
        }

        if ($translate !== null) {
            $messageid = $translate->translate($messageid, $locale);
        }

        if (count($options) === 0) {
            return $messageid;
        }

        return vsprintf($messageid, $options);
    }

    /**
     * Sets a translation Adapter for translation
     *
     * @param  Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate
     * @throws Zend_View_Exception When no or a false instance was set
     * @return Zend_View_Helper_Translate
     */
    public function setTranslator($translate)
    {
        if ($translate instanceof Zend_Translate_Adapter) {
            $this->_translator = $translate;
        } else if ($translate instanceof Zend_Translate) {
            $this->_translator = $translate->getAdapter();
        } else {
            require_once 'Zend/View/Exception.php';
            $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter');
            $e->setView($this->view);
            throw $e;
        }

        return $this;
    }

    /**
     * Retrieve translation object
     *
     * @return Zend_Translate_Adapter|null
     */
    public function getTranslator()
    {
        if ($this->_translator === null) {
            require_once 'Zend/Registry.php';
            if (Zend_Registry::isRegistered('Zend_Translate')) {
                $this->setTranslator(Zend_Registry::get('Zend_Translate'));
            }
        }

        return $this->_translator;
    }

    /**
     * Set's an new locale for all further translations
     *
     * @param  string|Zend_Locale $locale New locale to set
     * @throws Zend_View_Exception When no Zend_Translate instance was set
     * @return Zend_View_Helper_Translate
     */
    public function setLocale($locale = null)
    {
        $translate = $this->getTranslator();
        if ($translate === null) {
            require_once 'Zend/View/Exception.php';
            $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter');
            $e->setView($this->view);
            throw $e;
        }

        $translate->setLocale($locale);
        return $this;
    }

    /**
     * Returns the set locale for translations
     *
     * @throws Zend_View_Exception When no Zend_Translate instance was set
     * @return string|Zend_Locale
     */
    public function getLocale()
    {
        $translate = $this->getTranslator();
        if ($translate === null) {
            require_once 'Zend/View/Exception.php';
            $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter');
            $e->setView($this->view);
            throw $e;
        }

        return $translate->getLocale();
    }

    public function direct($messageid = null)
    {
        return $this->translate($messageid);
    }
}

/*****用于翻译的库文件****< /em>**/

<?php

class Application_Locale {  



protected $_locale = 'en'; //default language 
function __construct($locale = null) {     

    $session->locale = $this->_locale; //Change this accordingly to your suit ir when you change the lang drop down box..change this..etc
}

/* get locale */

public function getLocale() {
    return $this->_locale;
}
public static function translate($string){ //a custom function for translation

    $translate = Zend_Registry::get('Zend_Translate');
    return $translate->translate($string);

    }

}

最后在你的应用程序中你可以调用 Application_Locale::translate('your string') 进行翻译
最重要的是,请阅读本文来为您的应用程序设置 poedit
http://techie.ayyappadas.com/how-do-use-poeditor

Why dont you try Poedit for Localization ..BTW its a great tool..here's the step by step way

IN your bootstrap...

    protected function _initLanguage() {

            // initialising translator
            $translator = new Zend_Translate(
                            array(
                                'adapter' => 'gettext',
                                'content' => APPLICATION_PATH . '/languages/en/default.mo',
                                'locale' => 'en'
                            )
            );

            Zend_Registry::set('Zend_Translate', $translator);

            $frontController = Zend_Controller_Front::getInstance();
            $frontController->registerPlugin(new Application_Plugin_Translate());
        }

/***End of code for bootstrap*/
/Plugin file* save in your plugins directory*/

        class Application_Plugin_Translate extends Zend_Controller_Action_Helper_Abstract
        {
    /**
     * Translation object
     *
     * @var Zend_Translate_Adapter
     */
    protected $_translator;

    /**
     * Constructor for manually handling
     *
     * @param Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate
     */
    public function __construct($translate = null)
    {
        if ($translate !== null) {
            $this->setTranslator($translate);
        }
    }

    /**
     * Translate a message
     * You can give multiple params or an array of params.
     * If you want to output another locale just set it as last single parameter
     * Example 1: translate('%1\$s + %2\$s', $value1, $value2, $locale);
     * Example 2: translate('%1\$s + %2\$s', array($value1, $value2), $locale);
     *
     * @param  string $messageid Id of the message to be translated
     * @return string|Zend_View_Helper_Translate Translated message
     */
    public function translate($messageid = null)
    {
        if ($messageid === null) {
            return $this;
        }

        $translate = $this->getTranslator();
        $options   = func_get_args();

        array_shift($options);
        $count  = count($options);
        $locale = null;
        if ($count > 0) {
            if (Zend_Locale::isLocale($options[($count - 1)], null, false) !== false) {
                $locale = array_pop($options);
            }
        }

        if ((count($options) === 1) and (is_array($options[0]) === true)) {
            $options = $options[0];
        }

        if ($translate !== null) {
            $messageid = $translate->translate($messageid, $locale);
        }

        if (count($options) === 0) {
            return $messageid;
        }

        return vsprintf($messageid, $options);
    }

    /**
     * Sets a translation Adapter for translation
     *
     * @param  Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate
     * @throws Zend_View_Exception When no or a false instance was set
     * @return Zend_View_Helper_Translate
     */
    public function setTranslator($translate)
    {
        if ($translate instanceof Zend_Translate_Adapter) {
            $this->_translator = $translate;
        } else if ($translate instanceof Zend_Translate) {
            $this->_translator = $translate->getAdapter();
        } else {
            require_once 'Zend/View/Exception.php';
            $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter');
            $e->setView($this->view);
            throw $e;
        }

        return $this;
    }

    /**
     * Retrieve translation object
     *
     * @return Zend_Translate_Adapter|null
     */
    public function getTranslator()
    {
        if ($this->_translator === null) {
            require_once 'Zend/Registry.php';
            if (Zend_Registry::isRegistered('Zend_Translate')) {
                $this->setTranslator(Zend_Registry::get('Zend_Translate'));
            }
        }

        return $this->_translator;
    }

    /**
     * Set's an new locale for all further translations
     *
     * @param  string|Zend_Locale $locale New locale to set
     * @throws Zend_View_Exception When no Zend_Translate instance was set
     * @return Zend_View_Helper_Translate
     */
    public function setLocale($locale = null)
    {
        $translate = $this->getTranslator();
        if ($translate === null) {
            require_once 'Zend/View/Exception.php';
            $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter');
            $e->setView($this->view);
            throw $e;
        }

        $translate->setLocale($locale);
        return $this;
    }

    /**
     * Returns the set locale for translations
     *
     * @throws Zend_View_Exception When no Zend_Translate instance was set
     * @return string|Zend_Locale
     */
    public function getLocale()
    {
        $translate = $this->getTranslator();
        if ($translate === null) {
            require_once 'Zend/View/Exception.php';
            $e = new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter');
            $e->setView($this->view);
            throw $e;
        }

        return $translate->getLocale();
    }

    public function direct($messageid = null)
    {
        return $this->translate($messageid);
    }
}

/*****A library file for translation******/

<?php

class Application_Locale {  



protected $_locale = 'en'; //default language 
function __construct($locale = null) {     

    $session->locale = $this->_locale; //Change this accordingly to your suit ir when you change the lang drop down box..change this..etc
}

/* get locale */

public function getLocale() {
    return $this->_locale;
}
public static function translate($string){ //a custom function for translation

    $translate = Zend_Registry::get('Zend_Translate');
    return $translate->translate($string);

    }

}

And finally in your application you can call Application_Locale::translate('your string') for translation
And most importanty read this for setting up poedit for your application
http://techie.ayyappadas.com/how-do-use-poeditor

在巴黎塔顶看东京樱花 2024-12-28 02:26:24

正如我在我的应用程序中所表达的,当您将不完整的数组传递给 Zend_Translate 时,会发生以下通知

注意:使用前必须添加语言“en”。

您应该添加 en 并在其中添加一些参数,例如:

    $english = array(
        'message1' => 'message1',
        'message2' => 'message2',
        'message3' => 'message3');

    $translate = new Zend_Translate(
        array(
            'adapter' => 'array',
            'content' => $english,
            'locale'  => 'en'
        )
    );

As i expressed in my app, Following notice happen when you pass incomplete array to Zend_Translate

Notice: The language 'en' has to be added before it can be used.

You should add en with some parameter in it like :

    $english = array(
        'message1' => 'message1',
        'message2' => 'message2',
        'message3' => 'message3');

    $translate = new Zend_Translate(
        array(
            'adapter' => 'array',
            'content' => $english,
            'locale'  => 'en'
        )
    );
好多鱼好多余 2024-12-28 02:26:24

查看 Project_dir/resources/languages 是否有可用的 en 文件夹?如果没有,请查看可用语言文件夹并在其中创建 Zend_Validate.php 文件以获取英语验证错误消息。

Look into Project_dir/resources/languages is there an en folder available? If not please look in available language folder and create Zend_Validate.php file there for English validation error messages.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文