用Symfony2翻译JS文件

时间:2014-08-19 19:50:10

标签: symfony translation

我目前正在开发需要使用JavaScripts翻译的应用程序。

捆绑BazingaJsTranslationBundle似乎很好,但在我尝试之后,我认为它不符合我的需求。它会为我的所有应用程序包生成所有翻译。加载可能很重。

你知道其他捆绑或技巧吗?

感谢您的帮助。

2 个答案:

答案 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变量中的字典。