CakePHP JavaScript文件的国际化

时间:2013-04-25 19:44:24

标签: php cakephp internationalization

我正在使用Cakes国际化功能完成一个项目,以便将我们的应用程序翻译成不同的语言。这很有效。

我注意到的一个问题是,有一些地方通过JavaScript添加了文本,而且这个文本目前根本不是来自服务器。它适用于对话框和一些根据用户选择而变化的文本。

您是如何在自己的应用程序中处理此问题的?你会怎么处理这个?是否有处理此问题的库或组件。那个jQuery库怎么样?

8 个答案:

答案 0 :(得分:7)

您也可以使用以下格式的JavaScript翻译文件来执行此操作:

lang = {
    no: "No",
    yes: "Ja",
    agreed: "Akkoord"
}

每种语言一个文件,例如:lang.nl.js,lang.es.js,lang.en.js ......

然后,您可以检查当前语言,并根据它加载一个或另一个文件:

if($this->Session->read('Config.language') == 'es'){
    $this->Html->script('lang.es', array('inline' => false));
}else{ 
    $this->Html->script('lang.en', array('inline' => false));
}

在你的javascripts中,而不是使用这样的东西:

alert("Yes");

你应该用这个:

alert(lang.yes);

就是这样:))

答案 1 :(得分:3)

CakePHP没有内置/标准的本地化 JavaScript 方式。 提供了各种方法来本地化字符串'一般'。见Internationalization & Localization

要本地化JavaScript输出的字符串,请考虑;

  1. 对于“静态”字符串(即不依赖于您网站的内容的字符串),请为脚本创建本地化文件。 许多插件都使用这种方法 例如,请参阅此页面以了解本地化JQuery-UI日期选择器UI/Datepicker/Localization

  2. 如果您已经通过.po文件在网站中本地化字符串,并希望在JavaScript中使用相同的翻译,则可以考虑动态创建1.)中提到的翻译文件,例如;

  3. app/Config/routes.php中,启用parsextensions,请参阅File Extensions

    Router::parseExtensions('json');
    

    创建一个控制器,输出本地化为JavaScript / JSON的字符串

    http://example.com/localized/strings/eng.json
    
    class LocalizedController extends AppController {
    
        public function strings($lang)
        {
            if('json' !== $this->request->ext) {
                throw new NotFoundException();
            }
    
            // Switch to the requested language
            Configure::write('Config.language', $lang);
    
            $strings = array(
                'hello',
                'world',
            );
    
            //translated the strings
            $translations = array();
            foreach ($strings as $string) {
                 $translations[$string] = __($string);
            }
    
            // build and send a JSON response
            $this->autoRender = false;
            $this->response->type('json');
            $this->response->body(json_encode($translations));
            return $this->response;
        }
    
    }
    

    此json文件现在应该可以通过http://example.com/localized/strings/eng.json访问,并且可以在运行时从javascripts中加载

    注释

    只是为了澄清;示例是未经测试,只是为了说明动态创建包含本地化字符串的JSON(或JavaScript)文件的想法。代码远非有效且(至少部分)代码在控制器内,但(例如)在模型内。

答案 2 :(得分:1)

为了在我的CakePHP应用程序中翻译JavaScript,我使用了这个库:https://github.com/wikimedia/jquery.i18n,它是维基百科中使用的库。

您拥有src文件夹中的所有必要文件。它的设置和使用非常简单。当然它适用于任何类型的应用程序,不仅仅是CakePHP!

答案 3 :(得分:1)

这是我用于cakePHP 3的解决方案:

布局文件中的

(我的是default.ctp):

if( isset( $translated_js ) && !empty( $translated_js ) ){
    $this->Html->scriptStart($block_render);
    echo "var translated_js = " . json_encode( $translated_js ) . ";";
    $this->Html->scriptEnd();
}

现在在任何控制器中添加一个beforeRender方法:

public function beforeRender(Event  $event){
    parent::beforeRender( $event );     

    $translated_js = [
        'reinit_map' => __('Reinit map to default'),            
    ];

    $this->set( 'translated_js' , $translated_js );
}

这样您就可以使用gettext指令。

在您的JS文件中,您现在可以通过以下方式使用翻译的元素:

translated_js.reinit_map

希望它能帮助某人搜索翻译文本的方式并传递给JS

答案 4 :(得分:0)

我遇到了和你一样的问题,我发现此链接非常有用:http://jamnite.blogspot.de/2009/05/cakephp-form-validation-with-ajax-using.html

这不是最新的,但主要原则应该是明确的。

答案 5 :(得分:0)

查看此CakePHP插件:https://github.com/wvdongen/CakePHP-I18nJs

它使用Drupal 8 JavaScript翻译的功能。它有CakePHP控制台函数来生成.po文件(就像你和Cake一样使用),并生成你翻译的.po文件到JavaScript。

答案 6 :(得分:0)

我使用更简单的方法。 (我不知道它是否是最好的,但它确实有用)。

在模板文件中,我定义了一系列带有js可能需要的消息的隐藏字段。

echo( $this->Form->hidden( 'msg-select-promotion-items', [ 'value' => __( 'Select promotion items' ) ] ) );

在这里,我们利用蛋糕自己的本地化系统。

然后在js文件中:

alert( $('input[name=msg-select-promotion-items]').val() );

希望这会有所帮助。 问候。 法昆

答案 7 :(得分:-1)

我走了简单的路:

alert( "<?php echo __('This is my translated string'); ?>" )

通过这种方式,您可以将所有翻译保存在一个位置:.po文件