ResourceProvider 多语言实现

1. 在在web.config定义特定的culture和uiCulture, 如果应用自定义resource prodiver的话, 加上resourceProviderFactoryType的设置:

 如:

 <globalization culture="en-us" uiCulture="en-us" resourceProviderFactoryType="DBResourceProviderFactory, Common "/>
 
 culture和uiCulture也可以设置成auto, 这样就会取浏览器首选区域设定, DBResourceProviderFactory为provider factory类的命名空间加上类名, Common 则为dll的名字。代码就不作详解!

 

2. 运行中更改语言类别。对浏览器首选语言区域的检测是在页面什么周期早期, 可以在basepage基类中overirde InitializeCulture, 并且修改Thread.CurrentThread.CurrentUICulture和Thread.CurrentThread.CurrentCulture。 如:

protected override void InitializeCulture() { string language = string.Empty; if (Session["lang"] != null) { language = Session["lang"].ToString(); } if (!String.IsNullOrEmpty(language) && (language != "Auto")) { Thread.CurrentThread.CurrentUICulture = new CultureInfo(language); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language); } }

 

3. 可以在后台也可以在页面上直接调用资源

- 后台方法调用: GetLocalResourceObject 或 GetGlobalResourceObject,

- 直接在页面有两种方法: 隐式和显式, 下面简单说说他们俩的区别。

a. 调用方法不同

显示表达式:

调用全局资源 <asp:Literal id="Literal1" Text="<%$ Resources:riskCommon, ltrRiskStatus %>" runat="server"></asp:Literal>, 其中riskCommon是resource type字段, ltrRiskStatus是resource key

调用本地资源<asp:Literal ID="ltrUserName" runat="server" Text="<%$ Resources:ltrUserName %>"></asp:Literal>

隐式表达式:

调用本地资源<asp:Localize runat="server" Text="Deafult value" meta:resourcekey="lblProviderType"></asp:Localize>

b. 隐式表达式只可以调用本地资源

c. 隐式表达式存储值方式不一样, 在database里面如lblProviderType.text是Text属性的resource key。当然也可以配置其他属性, 如Visible的resource key 是lblProviderType.Visible

d. 隐式表达式是通过resourcereader去取资源的, 也就是说会一次把该resource type下的所有资源一次拿出来, 更有利于性能。而显式表达式是一条一条取的。(通过验证, 隐式表达式还是会一个一个跑一次)

e. 隐式表达式通过resource provider取不到值时会用默认值, 如上例中的Text="Default value", 而显式表达式会有编译错误(有点烦)。

注意:如果只是为了显示值,请使用控件<asp:Localize .., 上面有例子。

 

你可能感兴趣的:(ResourceProvider 多语言实现)