[英]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输出的字符串,请考虑;
对于“静态”字符串(即不取决于您网站内容的字符串),请为脚本创建本地化文件。 许多插件都使用这种方法,例如,有关本地化JQuery-UI日期选择器UI / Datepicker / Localization的信息 ,请参见此页
如果您已经通过.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.