多語系採用資料庫處理。區分為系統多語系(table:LocaleStringResource) 及資料多語系(table:LocalizedProperty)。語系 (table:Language) , 一開始的確很難理解 所以直接忽略原理,後續理解它的原理有助於更多 .net core asp.net 的技術應用。
HtmlString Class
繼承自 IHtmlContent 目的是為了 wraps an HTML encoded String.
所以你要用字串在 razor 頁面上輸出 html 就得用 new Htmlstring
或 Html.Raw 不然直接輸出字串的話會是編碼過後字串, 而不是 html.
@*這個在上面直接輸出 *@ @(new HtmlString("<h1>SDF</h1>")) @* .Value 會編碼 html 後輸出, 所以 <h1></h1> 都會輸出 *@ @(new HtmlString("<h1>new HtmlString(\"\")</h1>).Value</h1>").Value) @Html.Raw("<h2> Html.Raw 回傳的是一個 IHtmlContent 介面 所以與 new HtmlString(\"\" 是差不多的東西)</h2>")
namespace Nop.Web.Framework.Localization { /// <summary> /// Localized string /// </summary> public class LocalizedString : HtmlString { /// <summary> /// Ctor /// </summary> /// <param name="localized">Localized value</param> public LocalizedString(string localized): base (localized) { Text = localized; } /// <summary> /// Text /// </summary> public string Text { get; } } }
LocalizedString 繼承自 HtmlString , 而多了一個 Text 屬性
/// <summary> /// Localizer /// </summary> /// <param name="text">Text</param> /// <param name="args">Arguments for text</param> /// <returns>Localized string</returns> public delegate LocalizedString Localizer(string text, params object[] args);
private ILocalizationService _localizationService; private Localizer _localizer; /// <summary> /// Get a localized resources /// </summary> public Localizer T { get { if (_localizationService == null) _localizationService = EngineContext.Current.Resolve<ILocalizationService>(); if (_localizer == null) { _localizer = (f, args) => { var resFormat = _localizationService.GetResource(f); if (string.IsNullOrEmpty(resFormat)) { return new LocalizedString(f); } return new LocalizedString((args == null || args.Length == 0) ? resFormat : string.Format(resFormat, args)); }; } return _localizer; } }
private ILocalizationService _localizationService; /// <summary> /// Get a localized resources /// </summary> public LocalizedString T(string source, params object[] args) { if (_localizationService == null) _localizationService = EngineContext.Current.Resolve<ILocalizationService>(); var resFormat = _localizationService.GetResource(source); if (string.IsNullOrEmpty(resFormat)) { return new LocalizedString(source); } return new LocalizedString((args == null || args.Length == 0) ? resFormat : string.Format(resFormat, args)); }
語言種類管理,可以設定多種語言,但相對應的就會有多語系的資料欄位要輸入,像如果你設三個語系, 商品欄位名字就會出現三個相對應的欄位讓你輸入
語系資源檔,頁面上UI要顯示的語系資料。可以在語言管理下方匯出修改後再匯入。
語系資源檔,資料用的語系資料。