【发布时间】:2018-03-10 16:05:49
【问题描述】:
我有一个主要用 PHP 编写的应用程序。翻译是使用 gettext() 完成的。
有一个小的 JavaScript 部分也包含要翻译的字符串。 我使用 XMLHttpRequest 编写了这个简单但有效的方法:
function gettext(string_to_translate) {
var filename = get_php_script_folder() + 'gettext.php?string_to_translate=' + string_to_translate;
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", filename, false);
xmlhttp.send();
if (xmlhttp.status === 200) {
var translated_string = xmlhttp.responseText;
return translated_string;
} else {
console.log("Error while translating " + string_to_translate + " Status " + xmlhttp.status);
return string_to_translate; //Just give the original string.
}
}
php文件也很简单:
require_once '../../default.php'; //configures gettext, session management, etc.
//TODO: support for ngettext might be added.
$string_to_translate = filter_input(INPUT_GET, 'string_to_translate', FILTER_SANITIZE_STRING);
$translated_string = gettext($string_to_translate);
echo $translated_string;
在我刚刚调用的 JavaScript 中:
var input_box_form_default_reason = gettext("Vacation");
document.getElementById('input_box_form_reason').value = input_box_form_default_reason;
如果我同步调用此函数 [xmlhttp.open("GET", filename, false);] Firefox/Chrome 会警告我:
[Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
因此,尽管此方法有效,但它可能随时停止。
但如果我运行代码 async [xmlhttp.open("GET", filename, true);],那么下一行将在结果出现之前执行。该值将是未定义的。
在这种情况下使异步 XMLHttpRequest 工作是否可行?在编写一些聪明的 API 之前,我是否应该坚持同步获取值? 我应该用 PHP 编写我的 JS 文件吗? (我希望不会。)
PS:
我不使用任何像 jQuery 这样的框架。这是一个“宗教”的事情。我想自己完全理解和维护整个代码库。
-
我阅读了以下问题,但没有回答我的问题:
【问题讨论】:
-
我个人使用 PHP 在页面源代码中直接填充需要翻译的任何字符串的 JS 数组,不依赖任何 AJAX 请求。如果您有很多字符串,那么您还会查看大量请求,这可能会降低您的应用速度。
-
我同意。我加载了一个带有翻译的 xml 文件,并使用 xpath 将它们读出。
标签: javascript php ajax xmlhttprequest gettext