我在我的网站上设置了一个翻译系统(由你真正开发),这基本上是一些返回数组的php文件。
hello.php
return [
'world' => 'Hello, world!'
];
通过课程轻松访问
Lang::get('hello', 'world'); // Hello, world!
在构建响应时,这一切都很好,但是在某些情况下我需要在没有请求的情况下显示翻译。例如,我已经制作了另一个方便的功能,我在表单上进行了PHP验证,并且我自动生成了JavaScript规则,在发送请求之前在页面上执行相同的验证,如果验证失败,那么我需要显示相应的消息 - 验证失败可能有数百种可能的原因。请注意,这只是一个示例用例,因此我看到的解决方案是:
我可以使用初始请求加载翻译字符串的所有,并准备好显示其中任何一个。这将浪费大量带宽,因为大多数时候大多数字符串根本不需要。我可以更进一步,将它们缓存在本地存储中,但缓存整个网站的文本内容(可翻译)可能超过允许的存储量,因此这似乎不太可靠。
< / LI>我无论如何都可以发送请求并检索我需要的翻译,在示例用例中破坏了进行此类验证的全部要点,但是比前一个更好的解决方案,此外如果做得对我可以从浏览器的内部缓存中获益,该缓存只会请求翻译一次并在后续请求中从缓存加载它们,这听起来不错。
我已选择使用第二种解决方案而我遇到的问题是:
我有一个JavaScript功能,我将在伪代码中描述。
function translate(file, key) {
if(!storage[file]) {
storage[file] = sendAjaxAndLoadFileFromServer();
}
return storage[file][key];
}
var storage = {};
如果浏览器缓存了请求,我不知道是否需要在页面上进行二次缓存,但这似乎不会造成损害?我也可以对此发表意见。
现在这可行,因为我正在同步发送AJAX请求。但是我在控制台中看到了这条消息:
主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用。如需更多帮助http://xhr.spec.whatwg.org/
继续suggested site我没有看到任何暗示我不应该使用同步请求的内容,但是此消息中的弃用一词让我思考。
不幸的是,这是我实现此解决方案的唯一方法(通过同步请求),因为此函数是在需要返回值的地方调用的,例如
new Dialog(translate('world'));
我不知道如何在这种情况下实施承诺或任何事情。
所以问题是:
我可以使用同步AJAX请求,它们会在不久的将来消失吗??
答案 0 :(得分:0)
根据评论,也许有一种方法:
也许你可以立即让翻译返回但是回调。每次调用翻译队列字符串进行翻译并显示&#34;等待&#34;。在回调中,您将获得翻译后的字符串。
将会有另一个过程 - 翻译。如果queue不为空,它将定期转换排队的字符串(例如每隔10ms),并为每个字符串调用注册的回调。处理后如果队列为空,则隐藏&#34;等待&#34;。
效果将是 - 首次请求翻译节目&#34;等待&#34;最后一次请求隐藏了它。所有翻译都是分开的,但是分批提供。您需要做的是将字符串替换逻辑移动到回调函数。
答案 1 :(得分:0)
这将是一个由两部分组成的答案,因为您的问题是打开两个单独的主题。
它被推荐是有充分理由的。如果您执行同步ajax请求,整个网站会在请求期间冻结。当互联网连接速度很快且服务器迅速响应时,这只需要几毫秒。但是,如果浏览器必须等待更长时间才能响应,网站可能会冻结几秒钟,这可能会让用户感到沮丧。这就是应该避免同步ajax请求的原因。
您可能需要考虑以下几个选项:
(对于静态文件) Ping是将请求发送到服务器并获取第一个字节所花费的时间。它需要1毫秒的光纤,并且可以在移动设备上花费几百毫秒的时间。在具有100ms ping和100kB / s带宽的3G连接上,以下两者都需要200ms:
因此,选择一次加载多个消息的翻译解决方案可能是完全可以接受的,因为您可以避免因服务器和客户端之间的ping而浪费时间。