我目前正在使用Handlebars.js(與Backbone和jQuery相關)來製作幾乎完全客戶端渲染的Web應用程序,而且我遇到了此應用程序國際化的問題。如何用Handlebars.js(小鬍子模板)製作i18n?
我該如何做這項工作?
有沒有插件?
我目前正在使用Handlebars.js(與Backbone和jQuery相關)來製作幾乎完全客戶端渲染的Web應用程序,而且我遇到了此應用程序國際化的問題。如何用Handlebars.js(小鬍子模板)製作i18n?
我該如何做這項工作?
有沒有插件?
我知道這已被回答,但我想分享我的簡單解決方案。要建立使用I18n.js(這是我們與我們的工作項目中使用)Gazler的解決方案,我只是用了一個很簡單的把手幫助促進這一進程做對飛本地化:
處理器
Handlebars.registerHelper('I18n',
function(str){
return (I18n != undefined ? I18n.t(str) : str);
}
);
模板
<script id="my_template" type="x-handlebars-template">
<div>{{I18n myVar}}</div>
</script>
這樣做的主要優點是沒有昂貴的前/後處理整個JSON對象上。更不用說如果傳入的json嵌套了對象/數組,那麼如果對象很大,花在尋找和解析它們上的時間可能會變得很昂貴。
乾杯!基於@poweratom的回答
我比較喜歡這個解決方案@Gazler的 –
尼斯解決方案。我做了這一個https://gist.github.com/1589125。但@ poweratom的一個似乎更清潔。 –
我得到這個錯誤:'TypeError:I18n.t不是一個函數'。任何建議? – slackmart
https://github.com/fnando/i18n-js是一個紅寶石寶石,它將從您的config/locales文件夾創建一個國際化文件。但是,如果您不使用導軌,則可以在其自己的here上找到使用的JavaScript。
你只要簡單的把翻譯存儲在一個嵌套的對象..
I18n.translations = {"en":{"date":{"formats":{"default":"%Y-%m-%d","short":"%b %d","long":"%B %d, %Y"}}}};
東西也可能是使用你,我在我的項目中使用的是鬍子,在格式自動轉換字符串補丁@@ translation_key @@
i18nize = function (result) {
if (I18n) {
var toBeTranslated = result.match(/@@([^@]*)@@/gm);
if (!toBeTranslated) return result;
for(var i = 0; i < toBeTranslated.length; i++) {
result = result.replace(toBeTranslated[i], I18n.t(toBeTranslated[i].replace(/@/g, "")));
}
}
return result;
};
你再調用i18nize 後渲染讓你把譯文在你的模板,而不是將其穿過的。
小心修補小鬍子,因爲您將無法將模板移植到標準小鬍子實現。但在我的情況下,所提供的好處超過了這個問題。
希望這會有所幫助。
這真的很棒,我完全錯過了我可以用我的一個函數「重新解析」模板的事實,這正是我想要做的,也許是用R.js或其他東西。 非常感謝你=) – mdcarter
:
只有ember.js,同樣與傳遞給I18n.js.選項
如果使用計算屬性,它會奇蹟般的重新加載。
Ember.Handlebars.helper "t", (str, options) ->
if I18n? then I18n.t(str, options.hash) else str
模板:
{{t 'sharings.index.title' count=length}}
陽明:
en:
sharings:
index:
title: To listen (%{count})
對於那些不使用任何JS框架http://i18next.com看起來很有希望太
剛剛創建車把助手打電話給喜歡這裏http://i18next.com/pages/doc_templates.html翻譯
隨着的NodeJS /快速:
nginx的代理配置
server {
listen 80;
server_name fr.domain.com;
client_max_body_size 20m;
proxy_set_header Accept-Language fr
location/{
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_buffering off;
}
}
node-i18n(檢測Accept-Language頭)
app.use(i18n.init);
翻譯樣本文件
{
"hello": "hello",
"home-page": {
"home": "Home",
"signup": "Sign Up"
}
}
在高速控制器
...
data.tr = req.__('home-page');
var template = Handlebars.compile(source);
var result = template(data);
把手模板
<li class="active"><a href="/">{{tr.home}}</a></li>
的問題的答案,但他們可能是,你不想依賴任何i8n的情況下, lib並完全使用你自己的。我使用我自己的靈感https://gist.github.com/tracend/3261055
你可以使用http://i18next.com for i18n->自帶手柄助手:http://i18next.com/pages/doc_templates.html – jamuhl