CakePHP JavaScript文件的国际化

cni*_*ini 4 php cakephp internationalization

我正在使用Cakes国际化功能完成一个项目,以便将我们的应用程序翻译成不同的语言.这很有效.

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

你是如何在自己的应用程序中处理这个的?你会怎么处理这个?是否有处理此问题的库或组件.那些jQuery库怎么样?

Alv*_*aro 7

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

就是这样:)


tha*_*tah 3

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

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

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

  2. 如果您已经通过 .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)文件的想法。该代码远非高效,并且(至少部分)代码不应位于控制器内部,而应(例如)位于模型内部。