.net网站如何实现多国语言切换?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net网站如何实现多国语言切换?相关的知识,希望对你有一定的参考价值。
A. 如何手动建立并编辑资源文件1. 建立名为 LocProject 的 ASP.NET Web 应用程序。如需详细说明,请参阅建立 Web 项目。
注意:程序中会使用项目名称 LocProject
2. 在项目中,加入新项(Add New Item...)
3. 选择 "资源文件"(Assembly Resource File) 。文件名为 strings.resx (名称中间不能有".",否则,容易错误)。资源文件 strings.resx 将会包含英文的原有资源。每当应用程序找不到更适合 UI 文化特性的资源,就会存取这些资源。
文件将加入至项目中,并在 XML 设计工具 中打开。
4. 在 "数据表"(Data Tabls:) 列表中,选择 "data"。
5. 在 "数据" (Data:) 页面中,增加2行数据 txtSearch 和 txtWelcome, 如下:
name value
txtSearch Search for the following text:
txtWelcome Welcome to Localization!
6. 再重复1次步骤 2 到 5,建立另外一个命名为 strings.zh-CHS.resx.resx 的资料文件,数据如下:
name value
txtSearch 搜索字符串:
txtWelcome 欢迎本地化!
B. 如何存取资源
1. 加入 System.Resources 和 System.Globalization 命名空间。以下代码如下:
using System.Resources;
using System.Globalization;
namespace LocProject
2. 声明 ResourceManager 类的变量 LocRM
// C#
namespace LocProject_CS
public class WebForm1 : System.Web.UI.Page
protected ResourceManager LocRM;
3. 将以下代码加入到 WebForm1 方法 Page_Load 中,创建 ResourceManager 类的实例。ResourceManager 构造函数使用两个参数。第一个是资源文件的根名称,也就是不含文化特性和 .resx 后缀的资源文件名称。第二个参数是主要组件。
// C#
LocRM= new ResourceManager("LocProject.strings", typeof(WebForm1).Assembly);
注意:如果您没有将项目命名为 LocProject,就应该修改资源文件的根名称。
C. 如何显示页面中的静态资源字符串
将代码放在 <form> 和 </form> 标记 (Tag) 之间:
<h3><%=LocRM.GetString("txtWelcome")%></h3>
注意: ResourceManager 中区分大小写。
D. 如何将资源字符串赋给控件的属性
1. 加入代码:
//C#
Label1.Text=LocRM.GetString("txtSearch");
Label2.Text=LocRM.GetString("txtWelcome");
2. 增加 System.Threading 命名空间。
// C#
using System.Threading;
3. 将下列代码加入 Page_Load 方法的起始处,指定 Web Form 网页应按照浏览器的 Accept-Language 标题中所指定之文化特性来显示资源和格式。这段代码相当重要,因为如果没有的话,您的 Web 应用程序就会按照服务器的文化特定设置,而这可能对 Web Form 网页的远端使用者并不适用。
// C#
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.UserLanguages[0]);
编译、执行就可以看到结果。控制面板\区域选项 中,如果选择:中文(中国),就会显示中文网页;如果选择其它,则会显示英文网页。 参考技术A 一般网站都是中文或者英文 多国的有点不现实! 一般是做了一个英文版本,一种中文版本的。点不同的版本会连接到英文或者中文版。本回答被提问者采纳 参考技术B 乱码问题不可能完全避免,你在做资源本地化的每个国家的语言的时候,尽量在那种语言的标准语言环境下填写,要是使用方没有那种语言包那是怎么搞也搞不好的事情
App多语言实现
参考技术A项目中遇到 切换app语言 的需求,要求在“简体中文”和“English”两种语言之间切换部分控件的语言文案,不受系统语言切换的影响。
TODO 切换系统Configuration设置源码分析
TODO Android资源管理机制
按照Android的资源管理方式,我们需要在res目录下建立两个values目录,其中values是默认的路径,values-en是英文资源的目录。
默认情况下,app启动会根据系统的设置加载对应的资源,系统切换了语言设置,app也会更新设置,所以这样不能完全满足我们的需求。
我们不想要app随着系统语言的改变而改变,而是保持用户上一次的选择。默认安卓系统不会保留app的语言设置,我们需要本地记录一下用户的选择,在app重新启动的时候加载之前保存的语言资源。存储用户的选择比较容易,放到SharedPreference里即可。然后在app重新启动的时候,我们需要手动更新下app的Application、Activity、Fragment和Service收到的配置信息。
以Activity为例,我们在基类的attachBaseContext方法中更新保存有config信息的Context对象:
ConfigurationUtil.attachBaseContext(newBase) 方法中更新newBase对象,使其中保存的Locale为我们自定义,而非系统的。当Activity被attach到window时,调用到此方法,便会加载我们想要的资源。这时如果手动修改了系统语言设置,然后从任务历史中切回我们的app时,栈中的所有Activity会被系统依照展示次序依次销毁重建(栈顶被销毁重建,退出到前一个页面时,前一个页面会被销毁重建)。由于Activity被销毁重建,会重新执行了生命周期方法,Activity的attachBaseContext方法也就会被重新执行到,所以系统的语言修改后,我们仍然可以正确地加载到我们自己设置的语言资源,所以从表面上看并没有受到系统修改的影响。
通常官方也是建议我们重启所有Activity的,这么做会销毁旧的资源数据,重新加载新的,安全方便。
官方描述:
如果我们不希望在系统语言发生变化时重启Activity,需要在Manifest.xml文件中配置: android:configChanges="locale" 即可。
这样做之后我们会在重新回到Activity的时候,进入回调方法 public void onConfigurationChanged(Configuration newConfig) ... 中去执行。其参数newConfig对象代表所有当前配置,而不仅仅是已经变更的配置。
需要注意:当我们修改系统语言设置后,系统会更新当前手机中所有正在运行的进程里的所有组件(分析在开篇的链接里有说明),所以这种情况下再次回到Activity,如果我们刷新UI,UI会使用系统的设置加载相应的资源文件。比如,
假设我们app设置为了简体中文(我们在Application中保存相应的flag,来判断系统的语言设置是否和app的设置一致或者发生了变化),如果系统由简体中文修改为了English,如果我们不做上述处理,刷新UI会加载英文资源。
这并不是我们想要的效果,所以我们需要在onConfigurationChanged回调中,再次更新Context中的Resources设置。做法如下:
上述方案并非完美结局问题,onConfigurationChanged方法调用之前getResource()有可能就会被调用多次,时序问题,加载出依据系统的语言设置的资源文件。(。>︿<)_θ,所以会有4的兜底方案。
TODO 切换语言并回到app,然后新建fragment并add,会有资源加载错误情况
我们在Activity的onConfigurationChanged方法更新过资源,貌似这里没有起作用。有种暴力的方式:
我们在 getResources() 方法中调用 ConfigurationUtil.updateResources(getResources()); ,但是 getResources() 方法会被多次调用,每次调用会判断一次,并不是特别理想,不过可以及时刷新,再未找到更好的方法前也算是一种兜底的方案。
在切换的Activity中,我们最好重启一下所有的app,执行下方方法后,重新打开singleTask的MainActivity...
以上是关于.net网站如何实现多国语言切换?的主要内容,如果未能解决你的问题,请参考以下文章