繁体   English   中英

CakePHP JavaScript文件中的国际化

[英]Internationalization in CakePHP JavaScript files

我正在使用Cakes国际化功能包装一个项目,以允许我们的应用程序翻译成不同的语言。 很好。

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

您如何在自己的应用程序中处理此问题? 您将如何处理? 是否有处理此问题的库或组件。 jQuery库又如何呢?

您也可以使用以下格式的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));
}

在您的JavaScript中,而不是使用类似这样的东西:

alert("Yes");

您应该使用此:

alert(lang.yes);

就是这样:)

CakePHP没有本地化JavaScript的内置/标准方式。 确实提供了各种“一般”本地化字符串的方法。 请参阅国际化和本地化

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

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

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

在您的app/Config/routes.php routes.php中,启用parsextensions,请参阅文件扩展名

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;
    }

}

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

注意

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

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

您在src文件夹中拥有所有必需的文件。 设置和使用非常容易。 当然,它可以与任何类型的应用程序一起使用,不仅限于CakePHP!

这是我用于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的方法

我遇到了与您相同的问题,并且我发现此链接非常有帮助: http : //jamnite.blogspot.de/2009/05/cakephp-form-validation-with-ajax-using.html

它不是最新的,但是主要原理应该清楚。

签出这个CakePHP插件: https : //github.com/wvdongen/CakePHP-I18nJs

它使用了Drupal 8 JavaScript转换的功能。 它具有CakePHP控制台功能来生成.po文件(与您在Cake上使用的完全相同),以及将转换后的.po文件生成为JavaScript。

我使用一种更直接的方法。 (我不知道它是否是最好的,但是它可以工作)。

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

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

在这里,我们利用cake自身的本地化系统。

然后在js文件中:

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

希望这可以帮助。 问候。 Facundo。

我走了简单的路:

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

这样,您可以将所有翻译都放在一个位置:.po文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM