cni*_*ini 4 php cakephp internationalization
我正在使用Cakes国际化功能完成一个项目,以便将我们的应用程序翻译成不同的语言.这很有效.
我注意到的一个问题是,有一些地方通过JavaScript添加了文本,而且这个文本目前根本不是来自服务器.它适用于对话框和一些根据用户选择而变化的文本.
你是如何在自己的应用程序中处理这个的?你会怎么处理这个?是否有处理此问题的库或组件.那些jQuery库怎么样?
您也可以使用以下格式的JavaScript翻译文件来执行此操作:
lang = {
no: "No",
yes: "Ja",
agreed: "Akkoord"
}
Run Code Online (Sandbox Code Playgroud)
每种语言一个文件,例如: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));
}
Run Code Online (Sandbox Code Playgroud)
在你的javascripts中,而不是使用这样的东西:
alert("Yes");
Run Code Online (Sandbox Code Playgroud)
你应该用这个:
alert(lang.yes);
Run Code Online (Sandbox Code Playgroud)
就是这样:)
CakePHP 没有本地化JavaScript的内置/标准方法。它确实提供了“一般”本地化字符串的各种方法。请参阅国际化和本地化
要本地化 JavaScript 输出的字符串,请考虑:
对于“静态”字符串(即不依赖于您网站内容的字符串),请为您的脚本创建本地化文件。许多插件都使用这种方法例如,请参阅本页有关本地化 JQuery-UI 日期选择器UI/Datepicker/Localization
如果您已经通过 .po 文件本地化网站中的字符串,并且希望在 JavaScript 中使用相同的翻译,您可以考虑动态创建翻译文件,如 中提到的1.),例如;
在您的 中app/Config/routes.php,启用 parsextensions,请参阅文件扩展名
Router::parseExtensions('json');
Run Code Online (Sandbox Code Playgroud)
创建一个控制器,它将输出本地化为 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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在应该可以通过访问此 json 文件http://example.com/localized/strings/eng.json,并且可以在运行时从 javascript 中加载该文件
只是为了澄清;该示例未经测试,只是为了说明动态创建包含本地化字符串的 JSON(或 JavaScript)文件的想法。该代码远非高效,并且(至少部分)代码不应位于控制器内部,而应(例如)位于模型内部。