ABP 初探 之 多語言

     最近幾天空閒時間比較多,就研究Abp的多語言,Abp是基於接口的依賴注入,有不少思想與方法都很好,需本身深刻體會與應用,轉化成本身的思想應用於實踐。javascript

  本篇介紹基於 開源Demo ModuleZeroSampleProject,多語言分爲兩部分,基於後臺的CS代碼和前臺的JS。前端

  資源文件定義分爲Web端和嵌入DLL層java

  基於Dll層的資源文件需設置文件屬性爲嵌入,不然發佈後找不到資源文件。app

  基於Web端的初始化方法ide

//Add/remove localization sources here
            Configuration.Localization.Sources.Add(
                new XmlLocalizationSource(
                    ModuleZeroSampleProjectConsts.LocalizationSourceName,
                    HttpContext.Current.Server.MapPath("~/Localization/ModuleZeroSampleProject")
                    )
                );

嵌入Dll的初始化方法 abp是命名空間,Localization.Sources.AbpXmlSource是文件路徑。函數

Configuration.Localization.Sources.Add(
                new DictionaryBasedLocalizationSource(
                    AbpConsts.LocalizationSourceName,
                    new XmlEmbeddedFileLocalizationDictionaryProvider(
                        Assembly.GetExecutingAssembly(), "Abp.Localization.Sources.AbpXmlSource"
                        )));

  後臺CS 分爲三部分,分別對應Controller、Application、Corethis

  多語言的使用第一步是初始化,只能指定了資源文件名稱才能正常解析與使用,spa

      Cotroller 初始化方法,建立Cotroller基類 ModuleZeroSampleProjectControllerBase,在構造函數添加 資源路徑prototype

public abstract class ModuleZeroSampleProjectControllerBase : AbpController
    {
        protected ModuleZeroSampleProjectControllerBase()
        {
            LocalizationSourceName = ModuleZeroSampleProjectConsts.LocalizationSourceName;
        }
    }
View Code

  Application、Core 初始化方法,建立Service基類,全部的方法都繼承該基類,資源文件屬性都要設置 嵌入code

public class MarketApplicationServiceBase : ApplicationService
    {

        protected MarketApplicationServiceBase()
        {
            LocalizationSourceName = MarketCoreConsts.LocalizationSourceName;
        }
    }
View Code

前端JS部分初始化,一空要引用abp.js 在abp.js裏定義了資源初始化的相關方法

 abp.localization = abp.localization || {};

    abp.localization.localize = function (key, sourceName) {
        sourceName = sourceName || abp.localization.defaultSourceName;

        var source = abp.localization.values[sourceName];

        if (!source) {
            abp.log.warn('Could not find localization source: ' + sourceName);
            return key;
        }

        var value = source[key];
        if (value == undefined) {
            return key;
        }

        var copiedArguments = Array.prototype.slice.call(arguments, 0);
        copiedArguments.splice(1, 1);
        copiedArguments[0] = value;

        return abp.utils.formatString.apply(this, copiedArguments);
    };

    abp.localization.getSource = function (sourceName) {
        return function (key) {
            var copiedArguments = Array.prototype.slice.call(arguments, 0);
            copiedArguments.splice(1, 0, sourceName);
            return abp.localization.localize.apply(this, copiedArguments);
        };
    };

    abp.localization.isCurrentCulture = function (name) {
        return abp.localization.currentCulture
            && abp.localization.currentCulture.name
            && abp.localization.currentCulture.name.indexOf(name) == 0;
    };

    abp.localization.defaultSourceName = undefined;
    abp.localization.abpWeb = abp.localization.getSource('AbpWeb');
View Code

經過如何方法能夠讀取資源文件

<script>
            $(function () {
                var appLocalizationSource = abp.localization.getSource('Market');  //xml文件名
                function localize() {
                    return appLocalizationSource.apply(this, arguments);
                };
                alert(localize('Role_IsDefault')) // xml當中定義的字段
            })
        </script>

前端加載的資源文件都來源於JS 動態生成  <script src="~/AbpScripts/GetScripts?v=@(Abp.Timing.Clock.Now.Ticks)" type="text/javascript"></script>

引用上面的Js文件會生成以下 內容

Views 界面也能夠經過以下方法顯示多語言,L 方法位於以下命名空間 Abp.Web.Mvc.Views.AbpWebViewPage

相關文章
相關標籤/搜索