簡單的解決方案
正如我真的不喜歡它,有檢測語言i18next可能性來自url參數。 在i18next選擇您需要添加下面的條目:
detectLngQS: 'lang'
多虧了它,您可以設置使用?lang=en-US
URL參數頁面的語言。
更好的(恕我直言)解決方案
在我的應用我用來創建處理本地化功能的迪朗達爾本地化服務模塊。在App/services
我確實創造localization.ts
文件(打字稿抱歉,但我真的很喜歡它在JS)與follwing代碼:
/// <reference path='../../Scripts/typings/durandal/durandal.d.ts' />
/// <reference path='../../Scripts/typings/i18next/i18next.d.ts' />
//#region Imports
import app = require('durandal/app');
//#endregion
//#region Public Members
export var Languages: KnockoutObservableArray<ILanguage> = ko.observableArray();
export var Init = (callback: (t: (key: string, options?: any) => string) => void) =>
{
var pl: ILanguage =
{
Id: ko.observable('pl'),
Name: ko.observable('Polski'),
Icon: ko.observable('Content/images/pl_flag.png'),
IsActive: ko.observable(true)
};
var en: ILanguage =
{
Id: ko.observable('en'),
Name: ko.observable('English'),
Icon: ko.observable('Content/images/en_flag.png'),
IsActive: ko.observable(false)
};
var de: ILanguage =
{
Id: ko.observable('de'),
Name: ko.observable('German'),
Icon: ko.observable('Content/images/de_flag.png'),
IsActive: ko.observable(false)
};
Languages.push(pl);
Languages.push(en);
Languages.push(de);
var option: I18nextOptions =
{
preload: ['pl', 'en', 'de'],
lng: 'pl',
fallbackLng: 'pl',
ns: 'app',
debug: true
};
$.i18n.init(option, callback);
app.trigger('Localization:Init');
};
export var T = (key: string) =>
{
return $.i18n.t(key);
};
export var Lng =() =>
{
return $.i18n.lng();
};
export var SetLng = (lng: ILanguage) =>
{
for (var l in Languages())
{
var value = Languages()[l];
if (value.Id != lng.Id)
{
value.IsActive(false);
}
else
{
value.IsActive(true);
}
}
$.i18n.setLng(lng.Id());
$('*').i18n();
app.trigger('Localization:SetLng');
};
//#endregion
//#region Local Interfaces
export interface ILanguage
{
Id: KnockoutObservable<string>;
Name: KnockoutObservable<string>;
Icon: KnockoutObservable<string>;
IsActive: KnockoutObservable<boolean>;
}
//#endregion
初始化函數被調用main.js
文件中app.start()
回調:
app.start().then(function() {
toastr.options.positionClass = 'toast-bottom-right';
toastr.options.backgroundpositionClass = 'toast-bottom-right';
viewLocator.useConvention();
localization.Init(function() {
binder.binding = function (obj, view) {
$(view).i18n();
};
app.setRoot('viewmodels/shell', 'entrance');
});
});
值得注意到Init函數是一些複雜的本地化初始化的好地方(例如從數據庫獲取本地化選項)。
對您而言最重要的是SetLng
。根據你的架構和想法,它可以在很多地方調用,但是因爲它在模塊中,所以可以在任何其他模塊中調用它(僅由require.js引用),所以它很棒。我通常在自舉導航欄中創建本地化按鈕,這使得我在任何時候都可以隨時更改語言動態。
編輯
據我知道,你仍然可以使用i18next MVC的意見 - 剛剛成立i18next綁定。如果你想基於身份驗證設置語言,最好的選擇可能是使用18下一個cookie。在您的登錄MVC動作你需要類似的東西添加到:
var languageCode = GetLanguageCode(username)
var userCookie = new HttpCookie("i18next", languageCode);
userCookie.Expires.AddDays(365);
HttpContext.Response.Cookies.Add(userCookie);
只要確保在i18next選項默認設置爲英語 - 這種語言會被選擇爲匿名用戶。在語言登錄後,將事先設定你的邏輯和選擇將瀏覽器來保留
編輯2
應該只在text.js文件小的變化 - 也許你應該補充一點,兩個或三個行號text.js(和一個幫助函數)
首先,我們需要幫助函數來獲取給定cookie的值(document.cookie返回所有cookie名稱和值的連接,所以我們需要以某種方式解析它)
function getCookie(cname)
{
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
現在您需要修改您的text.js文件以設置i18next cookie。 273之前代碼行:
var cookie = getCookie('i18next');
if (cookie != '') xhr.setRequestHeader("Cookie", "i18next=" + cookie);
謝謝基耶斯洛夫,但我已經有一個相當的國際化設置。我的問題不是關於國際化。我希望通過MVC視圖找到一種通過durandal按需提供本地化的方法。基本上,我關於本地化的應用場景很簡單:以前你是匿名的時候使用英文,並且一旦登錄就選擇語言。 – Christophe
@Christophe,隨時再次 –
感謝檢查我的編輯爲試圖解決我的問題,但我的登錄過程通過,Ajax調用管理,而不是由表單提交... – Christophe