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