如何国际化javascript代码中使用的字符串?

Mor*_*eng 5 javascript php internationalization

在开发AJAX程序时,我遇到了在JavaScript.code中创建字符串I18N的设计决策.某些字符串仅供JavaScript使用.例如.

$('#submit').click(function() {
    $(#target).html('Please wait while submitting...').load(someURI);
}
Run Code Online (Sandbox Code Playgroud)

我想要I18N字符串'请等待提交......'.我不确定最好的方法是什么.目前,我只是在服务器中使用字符串I18N-ed并在页面中呈现为javascript变量(我正在使用PHP/wordpress).

<script>strSubmit = <?php  _e('Please wait while submitting...'); ?></script>
Run Code Online (Sandbox Code Playgroud)

然后,在javascript中,我只使用varialble

$('#submit').click(function() {
    $(#target).html(strSubmit).load(someURI);
}
Run Code Online (Sandbox Code Playgroud)

这有效,但看起来很混乱.有没有更好的方法来实现这一目标?

Fab*_*ger 10

您应该使用JSON将服务器端l10n字符串转换为JSON对象:

// In the <head> tag :
<script type="text/javascript" src="locales.php"></script> 
Run Code Online (Sandbox Code Playgroud)

这在locales.php中:

var l10n = <?php echo json_encode($l10n); ?>;
Run Code Online (Sandbox Code Playgroud)

其中$ l10n是一个包含所有语言环境的数组,如下所示:

$l10n = array(
  'Please wait while submitting...' => 'Veuillez patienter durant le traitement...',
  'bah' => 'bih'
);
Run Code Online (Sandbox Code Playgroud)

您现在可以在JS中使用这样的字符串:

function $T(s){
  return l10n[s] || s;
}

alert($T('Please wait while submitting...'));
Run Code Online (Sandbox Code Playgroud)

  • 是的,但文件是由浏览器缓存的,因此只下载一次. (2认同)

use*_*291 2

您还可以通过使用 javascript 的 php“预处理器”来自动执行此操作

<script src="script.php?file=blah.js">
Run Code Online (Sandbox Code Playgroud)

其中 script.php 类似于

    function _repl($x) { return '"' . _e($x[1]) . '"'; }

    $js = file_get_contents($_GET['file']);
    $js = preg_replace_callback('~_e\("(.+?)"\)~', '_repl', $js);
    echo $js;
Run Code Online (Sandbox Code Playgroud)

这将透明地_e(something)用实际字符串替换 JavaScript 代码