使用Symfony2在JS文件中进行翻译

使用Symfony2在JS文件中进行翻译,symfony,translation,Symfony,Translation,我目前正在开发一个应用程序,需要使用我的Java脚本的翻译 bundle BazingaJsTranslationBundle看起来不错,但在我尝试之后,我认为它不适合我的需要。它为我的所有应用程序包生成所有翻译。它可能很重 你知道其他的捆绑或技巧吗 感谢您的帮助。根据您的具体需要和情况,json格式的简单对象可以是一个足够好的字典。例如: var dict = { TextIdWelcome : "Welcome", TextIdGoodBy : "Good by" } 用法

我目前正在开发一个应用程序,需要使用我的Java脚本的翻译

bundle BazingaJsTranslationBundle看起来不错,但在我尝试之后,我认为它不适合我的需要。它为我的所有应用程序包生成所有翻译。它可能很重

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


感谢您的帮助。

根据您的具体需要和情况,json格式的简单对象可以是一个足够好的字典。例如:

var dict = {
    TextIdWelcome : "Welcome",
    TextIdGoodBy : "Good by"
}
用法示例:

var elem = document.getElementById("WelcomeTag");
elem.innerHtml = dict["TextIdWelcome"];
var userName = "Jhon";
var elem = document.getElementById("WelcomeTag");
elem.innerHtml = tr("TextIdWelcome", userName);
您可以在服务器端为在客户端选择的实际语言生成这样的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 elem = document.getElementById("WelcomeTag");
elem.innerHtml = dict["TextIdWelcome"];
var userName = "Jhon";
var elem = document.getElementById("WelcomeTag");
elem.innerHtml = tr("TextIdWelcome", userName);
请注意,这个解决方案缺少几个精巧的技巧(转义标记、可变数量的运行时值、高效的替换算法等),但在简单的日常情况下,这就足够了。这一技巧也非常简单(因此您可以轻松地根据需要对其进行增强),并且您可以100%地控制它应该如何处理字典。当然,您可以控制何时以及将什么词典加载到
dict
变量中。

我在BazingaJsTranslationBundle中遇到了类似的问题(大型翻译文件),我通过以下方式简化了此问题:

#config.yml
bazinga_expose_translation:
    default_domains: [ jsonly ]
    locale_fallback: "%locale%"
创建简单的html细枝来存储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 %}
并且在布局中只包含所需的变量

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 %}
{layout.html.twig}
{%if-app.request.locale=='pl%}
{%else%}
{%endif%}

谢谢您的帮助。是的,生成并使用类似于您的json是很有用的。但是如何在app/Resources/translations/messages.fr.php和src/*/Bundle/Resources/translations/messages.fr.php中生成包含所有可用翻译的JSON?因为我可能需要这两个文件中的任何翻译。我在考虑每个Bundle使用一个域(例如mybundle.fr.php用于我的“mybundle”中的翻译)捆绑。你认为呢?这应该是答案。当然,对于我来说,细枝的想法似乎有点不正常,所以我使用的是.yml。你在js中可以有多少翻译键?转储程序只转储settings.yml中设置的域。