当前位置: 首页 > 编程日记 > 正文

ASP.NET全球化与本地化 c#多国语言的支持 (项目支持多国语言的开发)

ASP.NET 2.0及以上的开发平台,为全球化本地化应用程序提供了工具,而且实现起来非常简单。以下内容是使用c#,按照帮助一步步做的,将为初学者提供详细的实现步骤。

一 几个必要概念
 (一) 支持全球化
  由于Internet使得软件更容易跨越国家边界,所以全球化也就有了格外的重要。

1. 全球化
  全球化是为本地化准备应用程序的过程。这一步包括确定应用程序中所有能够本地化的资源,并从可执行代码中分离车它们,一方便对它们进行修改。

2. 本地化能力
  在此准备过程的本地化能力阶段,需要检查确定转化该应用程序是否真的不需要改变程序代码。

3. 本地化
  再后,在此准备过程的本地化阶段,为新的区域性定制该应用程序。

(二) 区域性

1. 理解区域性
  .NET框架通过通过指定某个区域性来标识本地化内容的目标用户。区域性是比语言更为精确的一个概念。例如:美国英语和英国英语在.NET框架中就是两个不同的区域性。要完全本地化某个应用程序,就必须依靠区域性而不能依靠语言。

2. 区域性代码
  .NET框架通过一组缩写词来表示区域性。每个缩写词是由区域性代码后跟一个或多个次区域性代码组成。区域性代码均为小写字母,而次区域性代码则为大写字母。例如:
  ·ni-BE 标识荷兰(比利时)区域性。方便生活在比利时的荷兰用户使用。
  ·sr-SP-Latn 这是多个次区域性的示例,标识在塞尔维亚以拉丁字母蛇蝎的塞尔维亚语。
  ·es 标识西班牙区域性。这是个非特定区域性,也就是不再指定次区域性。

(三) 区域性的属性和方法

1. CurrentUICulture和CurrentCulture之间的区别
  两者之间的区别在于.NET框架对他们的使用。CurrentUICulture属性用于从适当的文件检索区域性特定的资源(最重要的是用户界面文本)。CurrentCulture属性用于设置日期、时间、货币和数字格式,以及其他区域性的功能,包括排序顺序、字符串比较规则和包装规则等。

在没有看完整个本文的情况下,以下示例可以不看,以免混淆概念。
  2. 可以通过使用System.Globallization命名空间中的CultureInfo类,简单更改线程的区域性。

具体改变一个线程的区域性

using System;
using System.Globalization;
using System.Threading;
class test
{public static void main(){Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");Console.WriteLine(CultureInfo.CurrentUICulture.Name);}
}

二 创建文件系统网站
  打开 vs2005, 在菜单“文件”--“新建网站”,在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。在“位置”框中输入要保存网站页面的文件夹的名称。 例如,键入文件夹名“C:\WebSites”。在“语言”列表中,单击您想使用的编程语言c#。单击“确定”。系统(Visual Web Developer) 创建该文件夹和一个名为 Default.aspx 的新页。

三 通过 ASP.NET 进行隐式本地化

(一) 自动生成资源文件
  
  单击Default.aspx 页面底下的“设计” 或 “源”,可在 “设计”视图 和 “HTML源代码”视图 之间来回切换。

1. 切换到“设计”视图。

在“工具箱”中,从“标准”区域中将一个 Button控件拖动到页上。单击设计器图面或控件。
  在菜单上“工具”--“生成本地资源”,系统将在解决方案中自动创建一个 App_LocalResources 新文件夹,并在其中自动对应页面文件名称创建一个 Default.aspx.resx 新文件。使用隐式本地化时,资源文件名取决于各个页的名称。

2. 切换到“源”视图。
  查看对控件声明的更改,系统已向控件添加了一个属性,以从新创建的资源文件检索其值。例如,Button 控件的标记具有新的 meta:resourcekey 属性。

<asp:Button ID="Button1" Runat="server" meta:resourcekey="ButtonResource1" Text="Button" />

3. 浏览器向 Web 服务器发送区域性请求
  当浏览器向 Web 服务器发送请求时,该请求可包含有关当前语言和区域性的信息。例如,一个浏览器可能会发送字符串 "en-us" 以指示它已设置为使用美国英语;而另一个浏览器可能发送字符串 "zh-cn" 以指示它已设置为使用中国中文。

4. 回退区域性的资源文件
  该资源文件用作所有请求的默认资源文件。(它是回退区域性的资源文件。)如果浏览器未指定任何区域性,或者浏览器请求包含不支持的语言或区域性,则会从此默认文件提取资源值。

5.使用资源编辑器编辑资源文件
  现在已创建了资源文件,您可以使用资源编辑器将本地化后的文本放入该文件中。
  在解决方案资源管理器中打开 Default.aspx.resx
  在资源编辑器的“值”下,列出了页中放置的每个控件的“Text”属性。在此处更改值会导致更改默认区域性的值。 将“ButtonResource1.Text”设置为 local-auto-english。 保存该文件。

对页进行测试,按 Ctrl+F5 运行该页,就会看到所做的改变。

(二) 添加其他区域性

每种语言和区域性的组合均需要有唯一的资源文件。若要添加其他区域性,可以使用默认文件作为起点。可以为不同的区域性和区域设置创建资源文件,方法是创建新的资源文件,并在文件名中包含 ISO 语言代码(如 zh-cn、en-us、fr-ca 和 en-gb)。这些 ISO 代码位于页名和 .resx 文件扩展名之间,如 Default.aspx.en-us.resx。若要指定非区域性特定的语言,则应删除国家/地区代码,例如指定法语时应使用文件名 Default.aspx.fr.resx。

1.
  在解决方案资源管理器中,右击 Default.aspx.resx 文件,并单击“复制”。
  右击 App_LocalResources 文件夹,然后单击“粘贴”。
  右击“副本 Default.aspx.resx”文件,单击“重命名”,然后键入“Default.aspx.zh-CN.resx”。

仿上,再建立一个 Default.aspx.en-US.resx 文件。双击打开以上两者,将 Button控件的“ButtonResource1.Text”分别设置为  本地化-可选修改-中文  和 local-modify-english 。并分别保存文件。


  结果如下:
  

文件Default.aspx.zh-CN.resx的内容
名称
ButtonResource1.Text本地化-可选修改-中文
文件Default.aspx.en-US.resx的内容
名称
ButtonResource1.Textlocal-modify-english

对页进行测试,按 CTRL+F5 运行页。按钮将显示为: 本地-修改-中文

2. 用备用语言设置进行测试
  若要查看 ASP.NET 是否在使用这个新的资源文件,必须先将浏览器设置更改为请求所需的区域性。

更改IE浏览器的语言设置,在 Microsoft Internet Explorer 中,单击菜单“工具”--“Internet 选项”。
  单击下部的“语言”。在“语言首选项”对话框中单击“添加”。
  在“添加语言”对话框的“语言”下,单击“英语(美国)[en-us]”,然后单击“确定”。
  在“语言首选项”对话框的“语言”下,单击“英语(美国)[en-us]”,单击“上移”,直到首位,再单击“确定”。
  Internet Explorer 现在设置为将 en-us 作为所有请求的语言设置传递。在 Default.aspx 页中将区域性设置为 auto 时,ASP.NET 会试图根据语言和区域性首选项定位资源文件及其相应值以生成页。

对页进行测试,按 CTRL+F5 运行页。按钮将显示为: local-modify-english

3. 在文件web.config中的语言选择

<system.web><globalization culture="en-US" uiCulture="en-US"/>
</system.web>


  这里文件web.config中的设置,将覆盖IE浏览其中的设置,而且为所有的网页所共有。

4. 单独页面的语言选择
  在单独页面的语言选择,使用指令 <%@ Page  Culture="zh-CN"   UICulture="zh-CN" %>
  它将覆盖IE浏览器,以及文件web.config中的设置,为自己所用。
  例如: UICulture="zh-CN" ,不管文件web.config和IE的语言如何设置,都将显示中文的信息。

而当指令 <%@ Page 中的语言设置为 UICulture="auto"时,将先接受文件web.config,再接受IE的语言设置顺序。

5.Culture和UICulture区别
  Culture主要针对有关日期/货币等语言内部的,  而 UICulture针对用户界面的安钮之类的控件显示。

四 使用显式本地化

在上面部分,您已通过使用 ASP.NET 隐式本地化让控件显示本地化的文本。您生成了一个包含属性 (Property) 值的资源文件,并且在该过程中为每个控件添加了一个属性 (Attribute),该属性 (Attribute) 指示控件从资源文件填充其属性 (Property) 值(如果有)。隐式本地化自动工作,也就是说,您不需要逐个指定每个属性从资源文件读取信息的方式。
  但是,有时可能需要对属性的设置方式进行更直接的控制。要达到这个目的,不应使用隐式本地化,而应使用显式本地化。通过显式本地化,可以使用指向资源文件的表达式设置属性值。运行页时,会对表达式进行计算,从指定的资源文件中读取该值,然后使用该值设置属性。
  如果除了控件和标签外还需要本地化大量的文本或自定义消息,则显式本地化十分有用。例如,您可以为电子商务站点开发一系列本地化的欢迎消息和感谢消息,然后使用显式声明性表达式将此文本放置在页上。此外,显式本地化允许维护一个本地化的资源文件集,而不是为每个页单独维护一个文件集。

1. 建立任意资源名称 
  在本部分中,您将手动创建资源文件,然后使用 ASP.NET 声明性表达式语法引用这些文件。您将为一个简单的感谢消息创建一个资源文件。与使用设计器时不同,此时不需要为每个 ASP.NET 页创建一个单独的资源文件。
  为了好记,将资源文件的基名称,写为我的名称 WuchaoText ,将来是区别资源的类名。对于要本地化的每种语言,都将另外创建一个文件,并在文件名中包含相应的语言代码(有时可能还有区域性代码)。例如,对于中国中文,将创建名为 WuchaoText.zh-CN.resx 的文件。对于美国英语,将创建名为 WuchaoText.en-US.resx 的文件。这两个文件都将放在 Web 应用程序的 Resources 目录下。与前面介绍的隐式示例不同,您无需为每个 .aspx 页维护一个资源文件;相反,您可为支持的每种语言或区域性维护一系列文件。

2. 创建全局资源文件
  在解决方案资源管理器中,右击网站的根目录,单击“添加 ASP.NET 文件夹”,然后单击“App_GlobalResources”。

右击“App_GlobalResources”文件夹,然后单击“添加新项”。
  在“Visual Studio 已安装的模板”之下单击“资源文件”。
  在“名称”框中,键入 WuchaoText.resx,然后单击“添加”。
  WuchaoText.resx 文件将充当回退区域性的资源。
  再创建两个 .resx 文件,并将其命名为 WuchaoText.zh-CN.resx 和  WuchaoText.en-US.resx 。
  双击打开以上两个 .resx 文件。
  在“名称”列的第一行中都键入 g_AddStr。
  而在“值”列的第一行中,分别键入  全球化-必须手工添加-中文  和 global-must-hand-add-english。

结果如下:

文件WuchaoText.zh-CN.resx的内容
名称
g_AddStr全球化-必须手工添加-中文
文件WuchaoText.en-US.resx的内容
名称
g_AddStrglobal-must-hand-add-english

保存两个文件并将其关闭。

注意
  若要插入带锐音符(如 í)的字母,请在打开数字锁定的同时使用数字键盘键入 Alt+0237。
  现在已经为名为 g_AddStr 的资源创建了两个值。ASP.NET 将根据浏览器设置的语言从相应的资源文件中读取值。
  现在已创建资源文件,您可以返回到页,并添加引用该资源的控件。

3. 向页添加 Label 控件

切换到页面 Default.aspx,然后切换到“设计”视图。
  从“工具箱”中将一个 Label 控件拖动到页上。
  右击该 Label 控件,单击“属性”,然后找到 数据 (Expressions),单击其右侧框中的省略号 (…) 按钮。将出现“表达式”对话框。
  在“可绑定属性”列表中单击“Text”。
  在“表达式类型”列表中选择资源“Resources”。
  在“表达式属性”下,将类名键“ClassKey”设置为 WuchaoText ,并将资源键“ResourceKey”选择设置为 g_AddStr。
  单击“确定”。
  切换到“源”视图。
  标签的文本属性现在具有一个显式表达式,说明将从其中检索要选择的资源和键的基文件。

<asp:Label ID="Label1" Runat="server" Text="<%$ Resources:WuchaoText, g_AddStr %>">

注意
  WuchaoText 属性不具有语言指示符、区域性指示符或 .resx 扩展名,因为它不是实际的文件名。实际上,WuchaoText 表示基资源类。ASP.NET 将根据浏览器发送的区域性,从文件名中包含相应的语言或区域性代码的文件中选择资源,文件名可能类似 WuchaoText.zh-CN.resx 和  WuchaoText.en-US.resx,或者,如果未找到匹配的语言,则为 WuchaoText.resx。
  对页进行测试,按 Ctrl+F5 运行该页。测试期间,会多次更改浏览器的语言。在资源编辑器中提供的不同版本的文本将显示为 Label 控件的文本。

五  网页HTML源代码

1. 默认创建网页的第一行

<%@ Page Language="C#"   CodeFile="Default.aspx.cs" Inherits="_Default" %>

2. 创建本地资源后网页的第一行

<%@ Page Language="C#"   CodeFile="Default.aspx.cs" Inherits="_Default" Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>

3.最终的网页源代码为:网页强制按简体中文显示

<%@ Page Language="C#"   CodeFile="Default.aspx.cs" Inherits="_Default" Culture="zh-CN" meta:resourcekey="PageResource1" UICulture="zh-CN" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>无标题页</title>
</head>
<body><form id="form1" runat="server"><div><asp:Button ID="Button1" runat="server" meta:resourcekey="Button1Resource1" /><asp:Label ID="Label1" runat="server" Text="<%$ Resources:WuchaoText, g_AddStr %>"></asp:Label></div></form>
</body>
</html>

转载于:https://www.cnblogs.com/wolfocme110/p/5139335.html

相关文章:

promise 和 async await区别

什么是Async/Await? async/await是写异步代码的新方式&#xff0c;以前的方法有回调函数和Promise。   async/await是基于Promise实现的&#xff0c;它不能用于普通的回调函数。   async/await与Promise一样&#xff0c;是非阻塞的。   async/await使得异步代码看起来像…

mac 制作usb启动盘_如何使用Mac制作Windows 10 USB-从Mac终端构建可启动的ISO

mac 制作usb启动盘Most new PCs dont come with DVD drives anymore. So it can be a pain to install Windows on a new computer.大多数新PC不再附带DVD驱动器。 因此&#xff0c;在新计算机上安装Windows可能会很痛苦。 Luckily, Microsoft makes a tool that you can use …

作业05-继承、多态、抽象类与接口

1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口&#xff0c;Comparable&#xff0c;Comparator 1.2 尝试使用思维导图将这些关键词组织起来。 1.3 可选&#xff1a;使用常规方法总结其他上课内容。 1.接口特点&#xff1a;一个公开的界面 有统一定义的规…

炫彩流光按钮 html+css

话不多&#xff0c;先上效果&#xff1a; 简介&#xff1a; 用基础css做一个有一点炫酷的流光按钮&#xff0c;不止按钮&#xff0c;只要是盒子就行。 具体步骤&#xff1a; 1.先定义一个盒子当做按钮&#xff0c;如我就用a标签&#xff1a; <body><a href"#…

SQL取上一条, 下一条记录方法

如果我们需要取id为3的前后的1条记录. 就可以用以下方法 取上一条记录: select * from 表名 where id<3 order by id desc limit 1取下一条记录: select * from 表名 where id>3 order by id asc limit 1大小于比较 order limit 转载于:https://www.cnblogs.com/…

react中使用构建缓存_通过构建海滩度假胜地网站,了解如何使用React,Contentful和Netlify...

react中使用构建缓存In this full course from John Smilga you will learn React by building a beach resort website project. The project uses React router for routing, React context API for state management, Contentful headless CMS for data management, and Net…

R语言实战 - 基本统计分析(2)- 频数表和列联表

数据&#xff1a; > library(vcd) > head(Arthritis)ID Treatment Sex Age Improved 1 57 Treated Male 27 Some 2 46 Treated Male 29 None 3 77 Treated Male 30 None 4 17 Treated Male 32 Marked 5 36 Treated Male 46 Marked 6 23 …

随机位置显示图片不重叠前端实现详细讲解附效果图,代码可直接使用

目录先看看效果图所要实现的功能看看代码js代码讲解&#xff1a;下面看看完整代码吧小程序版本完整代码VUE版本的代码&#xff1a;先看看效果图 所要实现的功能 在页面上随机的位置显示随机大小的图片&#xff0c;并且每个图片不能重叠&#xff0c;完整实现代码。 看看代码 …

MVC缓存OutPutCache学习笔记 (一) 参数配置

OutPutCache 参数详解 Duration : 缓存时间&#xff0c;以秒为单位&#xff0c;这个除非你的LocationNone&#xff0c;可以不添加此属性&#xff0c;其余时候都是必须的。 Location : 缓存放置的位置; 该值为枚举值: None: 当被设置为None时&#xff0c;其余的任何设置将不起作…

在Mac上控制Alt Delete-如何在Macbook上打开任务管理器

It happens to the best of us: were working away on some important project, and our trusty computer freezes. Or rather, a program were in just stops responding. So what do you do?这对我们最好的人来说是偶然的&#xff1a;我们正在做一些重要的项目&#xff0c;而…

HEW MAP文件使用

参考资料转载于:https://www.cnblogs.com/iluzhiyong/p/5145396.html

算法导论九章 答案

http://blog.csdn.net/z84616995z/article/details/18840823?reload 9.3-8题&#xff1a; http://blog.csdn.net/z84616995z/article/details/18938181 9.3-9题&#xff1a; http://blog.csdn.net/z84616995z/article/details/18889535转载于:https://www.cnblogs.com/sa51718…

小程序实现瀑布流,获取图片高度分成两组数据的函数封装代码

把一个数组根据数组内部的图片的高度&#xff0c;拆分成两个数组&#xff0c;组成瀑布流数据的方法。 使用方式&#xff1a; async created() {var arr this.$mock.sssdata.data.lists;//arr 是一个数组&#xff0c;里面包含若干对象&#xff0c;对象里面有图片var myArr a…

实现线程哪种方法更好_实施数据以实现更好的用户体验设计的4种方法

实现线程哪种方法更好Gone are the days when design used to rely mainly on the color palettes and the creativity of the designer. In the rapidly expanding technological world of today, it is essential to work across departments to enhance the screen experien…

String比较.equals

首先定义四个变量str public class SIzhui {public static void main(String[] args) {String str1"wang";String str2"li";String str3"wang";String str4new String("wang");} } 然后进行比较 public class SIzhui {public static …

mac下mysql5.7.10密码问题

mysql5.7.10刚安装好&#xff0c;会生成一个随机密码。 如果没记住这个随机密码&#xff0c;那么到mysql/bin/下执行mysql_secure_installation命令 按照提示重置密码和其他选项。 ps&#xff1a;找了一下午终于找到方法了&#xff01;&#xff01;&#xff01; 转载于:https:/…

Error: Cannot find module ‘express‘

解决方案&#xff1a;把node_module整个文件夹删掉,然后npm clean cache,看下package.json里有没有express的依赖项,有的话直接npm install,没有的话 npm install express --save

Observables简介以及它们与Promise有何不同

‘Observables’, ‘Observables’, ‘Observables’...Yes! Today, we will talk about this often discussed word of the market. Well also learn how they are different from Promises (havent heard about Promises? Not to worry! You will know more soon). Let’s s…

Spring Boot项目错误:Error parsing lifecycle processing instructions

pom.xml文件错误&#xff1a;Error parsing lifecycle processing instructions 解决方法&#xff1a;清空.m2/repository下的所有依赖文件&#xff0c;重新下载即可解决该问题。转载于:https://www.cnblogs.com/EasonJim/p/7724683.html

oracle执行计划连接方式

嵌套循环&#xff08;Nested Loops &#xff08;NL&#xff09;&#xff09;假如有A、B两张表进行嵌套循环连接&#xff0c;那么Oracle会首先从A表中提取一条记录&#xff0c;然后去B表中查找相应的匹配记录&#xff0c;如果有的话&#xff0c;就把该条记录的信息推到等待返回的…

大转盘完整源码附效果图,可以下载直接用

本转盘实现功能&#xff0c;可以动态配置奖品和转盘相关的任何图片&#xff0c;可以灵活配置使用。是基于 uni-app 实现的。可以在小程序或者H5&#xff0c;各端兼容使用。 效果图&#xff1a;因为GIF图的掉帧&#xff0c;所以显示抽奖的转动速度慢&#xff0c;实际上转动比较…

使用FortJs使用现代JavaScript开发Node.js

介绍 (Introduction) Nodejs gives you the power to write server side code using JavaScript. In fact, it is very easy and fast to create a web server using Nodejs. There are several frameworks available on Node package manager which makes the development eve…

find 按时间查找

find 按时间查找 转载▼分类&#xff1a; linuxShell日记-mtime 修改时间-ctime 改变时间-atime 访问时间-mtime 5 至少5天之前修改过的文件&#xff0c;至少5天没修改过-mtime -5 5天之内修改过的文件-mtime 5 刚好5天前修改的文件 -perm 按权限查找 -perm 001 精确匹配权限…

转:从零开始做app需要做的事情列表

https://qdan.me/list/VaXl7N8emfv1ayWg 从零开始做App的Bootstrap 做一个App&#xff0c;需要很多东西。 不定期更新。 团队 工欲善其事&#xff0c;必先利其器。 需求管理 支持版本、迭代、需求的创建与管理。 产品经理在上面录入需求&#xff0c;开发参照开发&#xff0c;测…

uniapp自定义导航栏样式,自定义导航栏组件使用说明,兼容小程序和H5及各端

实现思路&#xff1a; 把底部导航做成一个组件&#xff0c;点击导航显示的页面也做成组件&#xff0c;在启动页面引入这四个组件&#xff0c;点击封装的导航组件就显示相应的组件页面&#xff0c;这样就不会出现页面重新加载的问题了&#xff0c;有个弊端就是导航页面不能使用…

javascript优化_如何通过使用服务人员来优化JavaScript应用

javascript优化Every now and then we hear about optimizing something. There are different kinds of optimizations we can do to make our apps faster and more efficient, or to save time or memory. This article will cover one of those methods — service worke…

【视觉SLAM14讲】ch3课后题答案

1.验证旋转矩阵是正交矩阵 感觉下面这篇博客写的不错 http://www.cnblogs.com/caster99/p/4703033.html 总结一下&#xff1a;旋转矩阵是一个完美的矩阵——正交矩阵。①行列式为1&#xff0c;②每个列向量都是单位向量且相互正交&#xff0c;③它的逆等于它的转置。 2.罗德里…

【转载】邻接表表示法

图的邻接表表示法 图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点v i &#xff0c;该方法把所有邻接于v i 的顶点v j 链成一个带头 结点的单链表&#xff0c;这个单链表就称为顶点v i 的邻接表(Adjacency List)。 1&#xff0e; 邻接表的结点结构 &#xff08…

宝塔的服务忽然挂掉解决方法

先登录宝塔看内存是否满了 如果满了就点击文件&#xff0c;找到大文件进行删除&#xff0c;然后清空回收站&#xff0c;重启服务器&#xff0c;就解决了。 清空回收站&#xff1a;点击首页&#xff0c;打开终端&#xff0c;输入下面命令&#xff0c; 清空回收站的命令是&#…

免费创办网站_足够好的工程来创办一家互联网公司

免费创办网站I gave a guest lecture in an undergraduate software engineering class (CSCE431) at Texas A&M University in March 2019. Now I’ve turned this lecture into a blog post here, and hopefully some people on the Internet will find this useful.我于…