我正在结束一个使用 Cakes 国际化功能的项目,以允许我们的应用程序被翻译成不同的语言。效果很好。
我注意到的一个问题是,有几个地方是通过 JavaScript 添加文本的,而这些文本当前根本不是来自服务器。它适用于对话框和一些根据用户选择而变化的文本。
您是如何在自己的应用程序中处理这个问题的?你会怎么处理这个?是否有处理此问题的库或组件。那么任何 jQuery 库呢?
我正在结束一个使用 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));
}
在你的 javascripts 中,而不是使用这样的东西:
alert("Yes");
你应该使用这个:
alert(lang.yes);
就是这样:)
CakePHP 没有本地化JavaScript的内置/标准方法。它确实提供了各种“一般”本地化字符串的方法。请参阅国际化和本地化
要本地化 JavaScript 输出的字符串,请考虑;
对于“静态”字符串(即不依赖于您网站内容的字符串),为您的脚本创建本地化文件。许多插件使用这种方法例如,请参阅this page on localizing the JQuery-UI date picker UI/Datepicker/Localization
如果您已经通过 .po 文件对网站中的字符串进行本地化,并且想在 JavaScript 中使用相同的翻译,您可以考虑动态创建翻译文件1.)
,例如,
在您的app/Config/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;
}
}
这个 json 文件现在应该可以通过 访问,http://example.com/localized/strings/eng.json
并且可以在运行时从您的 javascripts 中加载
只是为了澄清; 该示例未经测试,只是为了说明动态创建包含本地化字符串的 JSON(或 JavaScript)文件的想法。该代码远非高效,并且(至少部分)代码不应位于控制器内部,而应(例如)位于模型内部。
For translating JavaScript inside my CakePHP applications, I use this library : https://github.com/wikimedia/jquery.i18n , it's the one used in Wikipedia.
You have all the necessary files inside the src folder. It's quite easy to set up and use. Of course it works with any kind of application, not only 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 的方法的人
查看此 CakePHP 插件:https ://github.com/wvdongen/CakePHP-I18nJs
它使用 Drupal 8 JavaScript 翻译的功能。它具有 CakePHP 控制台功能,可以生成 .po 文件(与您使用 Cake 完全一样),并将您翻译的 .po 文件生成为 JavaScript。
我和你有同样的问题,我发现这个链接很有帮助:http: //jamnite.blogspot.de/2009/05/cakephp-form-validation-with-ajax-using.html
它不是最新的,但主要原则应该清楚。
我使用更直接的方法。(我不知道它是否是最好的,但它有效)。
在模板文件中,我定义了一系列隐藏字段,其中包含 js 可能需要的消息。
echo( $this->Form->hidden( 'msg-select-promotion-items', [ 'value' => __( 'Select promotion items' ) ] ) );
在这里,我们利用 cake 自己的本地化系统。
然后在 js 文件中:
alert( $('input[name=msg-select-promotion-items]').val() );
希望这可以帮助。问候。法昆多。
我选择了更简单的方法:
alert( "<?php echo __('This is my translated string'); ?>" )
这样您就可以将所有翻译保存在一个地方:.po 文件