引言
本文档包含正确进行多语言开发所必需的表格和数据。我强烈建议使用国际标准化组织(ISO)作为信息的主要来源,因为这是实现高质量产品和兼容性的唯一途径。请记住,ISO通常只管理标准。每个ISO标准背后都有一些公司为商业用户提供数据库和更新。互联网也是一个很好的信息来源,因此我从各种资源收集了全球化数据,并将其放入6个表格中。如果您有任何建议,请通过电子邮件与我联系:Evaldas Jocys <evaldas@jocys.com>。
为了实现完整的多语言支持,需要这些表格的数据
- 语言 - 关于所有语言的信息
- 文化 - 关于所有文化(语言+国家)的信息
- 编码 - 关于所有编码的信息
- 范围 - 可用于通过IP地址获取客户所在文化
- 货币 - 每个国家的商业信息
- 国家货币 - 该国使用的货币
要求
- Microsoft SQL Server 2005
- Microsoft .NET Framework 3.5
安装
- 下载上面指定的 ZIP 文件。
- 将 ZIP 内容解压到临时文件夹。
- 导航到WebApp\Projects\Globalization\SQL\文件夹。
- 打开Globalization-SqlDataImport.bat文件。
- 转到第5行,将srv值更新为您的SQL Server名称。
- 转到第6行,将cat值更新为您的数据库名称。
- 保存并关闭Globalization-SqlDataImport.bat文件。
- 执行Globalization-SqlDataImport.bat以重新创建[Globalization_*] **表格**和**数据**。
**注意**:导入脚本会询问数据库登录名和密码。如果您想使用受信任的连接,请按[Enter]键。
Using the Code
存档包含.zip**\Engine**文件夹,其中包含LINQ to SQL类和一些方法。您可以将此文件夹的内容提取到您的C#项目中。例如,Engine\Globalization\Ranges.cs文件包含两个函数...
/// <summary>
/// Convert IP Address string to long number.
/// </summary>
/// <param name="ipString">IP Address string: 64.233.167.99</param>
/// <returns>Numeric representation of IP Address</returns>
public long IpToInt(string ipString)
{
System.Net.IPAddress address = System.Net.IPAddress.Parse(ipString);
return (long)BitConverter.ToUInt32(address.GetAddressBytes().Reverse().ToArray(), 0);
}
/// <summary>
/// Get Alpha 3 Code of country by IP Address.
/// </summary>
/// <param name="ipString">IP Address string: 64.233.167.99</param>
/// <returns>ISO 3166-1 Alpha-3 Code. For example: LTU</returns>
public string GetCountryByIp(string ipString)
{
Data.GlobalizationDataContext db = new Data.GlobalizationDataContext();
long ip = IpToInt(ipString);
Data.Range range = db.Ranges.SingleOrDefault
(item => item.RangeStart <= ip && ip <= item.RangeEnd);
return (range == null) ? string.Empty : range.CountryA3;
}
这样您就可以获取访问者的国家代码,并将他/她重定向到特定的网页
// Get visitor's IP Address.
string ipString = Request.ServerVariables["REMOTE_ADDR"];
// Get ISO 3166-1 Alpha-3 Code of Country by IP Address.
string countryA3 =
Engine.AppContext.Current.Globalization.Ranges.GetCountryByIp(ipString);
// Define default language of user:
// Lithuanian if user came from Lithuania or English for all other countries.
string language = (countryA3 == "LTU") ? "ltu" : "enu";
// Redirect user to specific page.
System.Web.HttpContext.Current.Response.Redirect("Default_" + language + ".htm", true);
1. 国家
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
CountryA3 |
char(3) |
NOT NULL |
|
ISO 3166-1 Alpha-3代码。例如:LTU |
2 |
CountryA2 |
char(2) |
NOT NULL |
|
ISO 3166-1 Alpha-2代码。例如:GB |
3 |
ShortName |
nvarchar(256) |
NOT NULL |
|
国家简称(Pascal Case)。例如:United Kingdom |
4 |
FullName |
nvarchar(512) |
NOT NULL |
|
国家全称。例如:Republic of South Africa |
5 |
NativeShortName |
nvarchar(256) |
|
|
国家简称的本地名称。例如:Lietuva |
6 |
NativeFullName |
nvarchar(512) |
|
|
国家全称的本地名称。例如:Lietuvos Respublika |
7 |
IsoCode |
int(4) |
NOT NULL |
|
国家的ISO代码 |
8 |
IsoName |
nvarchar(256) |
NOT NULL |
'' |
ISO 3166-1简称。例如:SOUTH AFRICA |
9 |
DialingCode |
int(4) |
|
|
国际拨号代码。例如:44 |
10 |
备注 |
nvarchar(2000) |
NOT NULL |
'' |
ISO 3166-1备注。例如:包括马里恩岛、爱德华王子岛 |
11 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
12 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
13 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录更新日期 |
|
|
2. 语言
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
LanguageA3 |
char(3) |
NOT NULL |
'' |
ISO 639-3 Alpha-3代码。例如:RUS |
2 |
LanguageA2 |
char(2) |
NOT NULL |
'' |
SO 639-1 Alpha-2代码。例如:RU |
3 |
LanguageName |
nvarchar(256) |
NOT NULL |
'' |
语言名称(Pascal Case)。例如:Russian |
4 |
NativeName |
nvarchar(256) |
NOT NULL |
'' |
语言的本地名称。例如:Русский |
5 |
描述 |
nvarchar(2000) |
NOT NULL |
'' |
描述和注释 |
6 |
IsPrimary |
bit(1) |
NOT NULL |
|
主要语言 |
7 |
IsWellKnown |
bit(1) |
NOT NULL |
|
您只能使用广为人知的语言:例如:1 |
8 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
9 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
10 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录修改日期 |
|
|
3. 文化
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
CultureCode |
varchar(20) |
NOT NULL |
|
缩写的文化名称。例如:mk-MK |
2 |
ParentCultureCode |
varchar(20) |
|
|
父级缩写的文化名称。例如:mk-MK |
3 |
CultureName |
nvarchar(256) |
|
|
文化名称 |
4 |
NativeName |
nvarchar(256) |
|
|
文化的本地名称。 |
5 |
AbbreviatedIsoName |
char(3) |
|
|
ISO/CD 639-5 Alpha-3代码:例如:mkd |
6 |
AbbreviatedWindowsName |
char(3) |
|
|
缩写的Windows名称。例如:MKI |
7 |
CodePageAnsi |
int(4) |
|
|
ANSI代码页。例如:1251 |
8 |
CodePageEbcdic |
int(4) |
|
|
EBCDI代码页。例如:500 |
9 |
CodePageOem |
int(4) |
|
|
OEM代码页。例如:866 |
10 |
CodePageMac |
int(4) |
|
|
MAC代码页。例如:10007 |
11 |
IsNeutral |
bit(1) |
|
|
中性文化指示符 |
12 |
DatePattern |
nvarchar(40) |
|
|
日期格式。例如:dd.MM.yyyy |
13 |
TimePattern |
nvarchar(40) |
|
|
时间格式。例如:HH:mm |
14 |
CurrencyPatterns |
nvarchar(100) |
|
|
货币格式。例如:n $;-n $ |
15 |
CurrencySymbol |
nvarchar(20) |
|
|
货币符号。例如:ден。 |
16 |
FirstDayOfWeek |
nvarchar(40) |
|
|
每周的第一天。例如:Monday |
17 |
DayNames |
nvarchar(512) |
|
|
星期名称。例如:недела;понеделник;вторник;... |
18 |
MonthNames |
nvarchar(512) |
|
|
月份名称。例如:јануари;февруари;март;април;... |
19 |
AbbreviatedDayNames |
nvarchar(256) |
|
|
缩写的星期名称。例如:нед;пон;втр;срд;чет;пет;саб |
20 |
AbbreviatedMonthNames |
nvarchar(512) |
|
|
缩写的月份名称。例如:јан;фев;мар;апр;мај;јун;јул;... |
21 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
22 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
23 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录更新日期 |
|
|
文化也称为“语言标识符”(RFC 3066)。文化代表在一个地区说一种语言的人的信息。文化代码代表语言和国家/地区的组合。
4. 编码
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
CodePage |
int(4) |
NOT NULL |
|
代码页。例如:21866 |
2 |
EncodingName |
nvarchar(256) |
NOT NULL |
|
编码名称。例如:Cyrillic (KOI8-U) |
3 |
WindowsCodePage |
int(4) |
|
|
Windows代码页。例如:1251 |
4 |
IsBrowserDisplay |
bit(1) |
|
|
Web浏览器可以显示 |
5 |
IsMessageDisplay |
bit(1) |
|
|
邮件和新闻应用程序可以显示 |
6 |
HeaderName |
nvarchar(100) |
|
|
Header名称。例如:koi8-u |
7 |
BodyName |
nvarchar(100) |
|
|
用于消息的正文名称。例如:koi8-u |
8 |
WebName |
nvarchar(100) |
|
|
用于Web浏览器的Web名称:koi8-u |
9 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
10 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
11 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录更新日期 |
|
|
- 替代/免费数据源:Microsoft Windows 2003 Server 内部资源
5. 范围
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
RangeStart |
bigint(8) |
NOT NULL |
(0) |
IP地址的数字表示:3560944688 (212.63.180.48) |
2 |
RangeEnd |
bigint(8) |
NOT NULL |
(0) |
IP地址的数字表示:3560944691 (212.63.180.51) |
3 |
CountryA3 |
char(3) |
|
'' |
ISO 3166-1 Alpha-3代码。例如:FRA (France) |
4 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
5 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
6 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录修改日期 |
|
|
此数据库将帮助通过IP或电子邮件域名自动检测用户所在国家,然后是语言。可以通过电子邮件编码检测文化。
IP to Country Database
6. 货币
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
CurrencyA3 |
char(3) |
NOT NULL |
'' |
货币 Alpha-3 代码。例如:GBP (Pound) |
2 |
CurrencyName |
nvarchar(256) |
NOT NULL |
'' |
货币名称。例如:Pound |
3 |
NativeName |
nvarchar(256) |
NOT NULL |
'' |
货币的本地名称 |
4 |
CurrencySymbol |
nvarchar(6) |
NOT NULL |
'' |
货币符号。例如:£ |
5 |
CurrencyCode |
int(4) |
NOT NULL |
(0) |
ISO 4217 货币代码。 |
6 |
CountryA3 |
char(3) |
|
'' |
ISO 3166-1 Alpha-3 国家代码。例如:UK (United Kingdom) |
7 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
8 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
9 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录更新日期 |
|
|
提供:每个国家货币的最新信息以及所有最新的汇率。
7. 国家货币
ID |
名称 |
数据类型 |
Nulls |
默认值 |
描述 |
1 |
RecordId |
uniqueidentifier(16) |
NOT NULL |
newid() |
UTF-8的HMAC-MD5校验和:Key="Currency", Value=[CurrencyA3],[CountryA3] |
2 |
CountryA3 |
char(3) |
NOT NULL |
|
ISO 3166-1 Alpha-3 国家代码。例如:UK (United Kingdom) |
3 |
CurrencyA3 |
char(3) |
NOT NULL |
|
货币 Alpha-3 代码。例如:GBP (Pound) |
4 |
IsPrimary |
bit(1) |
NOT NULL |
|
国家内部主要货币的指示符。 |
5 |
IntroductionDate |
datetime(8) |
|
|
货币引入日期 |
6 |
AbolitionDate |
datetime(8) |
|
|
货币废止日期 |
7 |
IsEnabled |
bit(1) |
NOT NULL |
(1) |
记录活动状态 |
8 |
DateCreated |
datetime(8) |
NOT NULL |
getdate() |
记录创建日期 |
9 |
DateUpdated |
datetime(8) |
NOT NULL |
getdate() |
记录修改日期 |
|
|
提供:每个国家货币的最新信息。