我正在使用Cakes国际化功能完成一个项目,以便将我们的应用程序翻译成不同的语言。这很有效。
我注意到的一个问题是,有一些地方通过JavaScript添加了文本,而且这个文本目前根本不是来自服务器。它适用于对话框和一些根据用户选择而变化的文本。
您是如何在自己的应用程序中处理此问题的?你会怎么处理这个?是否有处理此问题的库或组件。那个jQuery库怎么样?
答案 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输出的字符串,请考虑;
对于“静态”字符串(即不依赖于您网站的内容的字符串),请为脚本创建本地化文件。 许多插件都使用这种方法 例如,请参阅此页面以了解本地化JQuery-UI日期选择器UI/Datepicker/Localization
如果您已经通过.po文件在网站中本地化字符串,并希望在JavaScript中使用相同的翻译,则可以考虑动态创建1.)
中提到的翻译文件,例如;
在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文件