我目前正在开发需要使用JavaScripts翻译的应用程序。
捆绑BazingaJsTranslationBundle似乎很好,但在我尝试之后,我认为它不符合我的需求。它会为我的所有应用程序包生成所有翻译。加载可能很重。
你知道其他捆绑或技巧吗?
感谢您的帮助。
答案 0 :(得分:3)
我和BazingaJsTranslationBundle有类似的问题(大型翻译文件),我简化了这个:
#config.yml
bazinga_expose_translation:
default_domains: [ jsonly ]
locale_fallback: "%locale%"
创建简单的html twig来存储你的js变量,然后从这些文件中公开它们
{# jsOnleVariables.html.twig #}
{% set var1 = 'Welcome'|trans({},'jsonly') %}
{% set var2 = 'Bye'|trans({},'jsonly') %}
转储变量
php app/console bazinga:expose-translation:dump web/js
并且在您的布局中仅包含想要的变量
{# layout.html.twig #}
<script src="{{ asset('bundles/bazingaexposetranslation/js/translator.js') }}" type="text/javascript"></script>
{% if app.request.locale == 'pl' %}
<script src="{{ asset('js/i18n/jsonly/pl.js') }}" type="text/javascript"></script>
{% else %}
<script src="{{ asset('js/i18n/jsonly/en.js') }}" type="text/javascript"></script>
{% endif %}
答案 1 :(得分:0)
根据您的确切需求和情况,json格式的简单对象可以是一个足够好的字典。例如:
var dict = {
TextIdWelcome : "Welcome",
TextIdGoodBy : "Good by"
}
用法示例:
var elem = document.getElementById("WelcomeTag");
elem.innerHtml = dict["TextIdWelcome"];
您可以在服务器端为客户端选择的实际语言生成此类json对象,您可以通过自己喜欢的方法(jquery,XMLHttpRequest等)检索它,并将其分配给此dict
变量
如果你需要具有运行时相关值的句子,一个简单的基本技巧可能适合你的需要。让我们在翻译文本中使用像%0,%1等标记。
var dict = {
TextIdWelcome : "Welcome %0",
TextIdGoodBy : "Good by %0"
}
function tr(textId, runTimeValue1, runTimeValue2){
var text = dict[textId];
if(runTimeValue1 !== undefined)
text = text.replace("%0", runTimeValue1);
if(runTimeValue2 !== undefined)
text = text.replace("%1", runTimeValue2);
return text;
}
一个用法示例:
var userName = "Jhon";
var elem = document.getElementById("WelcomeTag");
elem.innerHtml = tr("TextIdWelcome", userName);
请注意,此解决方案缺少一些改进的技巧(转义标记,可变数量的运行时值,有效的替换算法等),但在简单的日常情况下,这可能足够好。这个技巧也非常简单(因此您可以根据需要轻松增强它),并且您可以100%控制它应该如何处理字典。您当然可以控制何时加载到dict
变量中的字典。