应用国际化
[转] http://www.syyong.com/other/Application-internationalization.html
概述
为支持应用国际化所需考虑的技术实现问题很多,比如时区、手机号、语言、国家或地区名称等不同所造成的I18N问题。
术语
CC
即Country Code,国际电话区号,如中国为86,也称为国家码。由国际电信联盟(ITU)的E.123和E.164标准所分配。
国际冠码
国际冠码是要拨打国际电话时,在键入受话地区的国际电话区号前,所须键入发话地区的输出(前缀)码,以转接至国际电话线路用的数字。在拨打国际电话时,通常会将国际冠码放在国际电话区号前以表示本号码将会拨离本地。例如当在美国要拨打电话至英国的号码1234 567890时,就必须先输入美国的国际冠码 011,然后英国的国际区号 44 再接着当地的电话号码 1234 567890,也就是说整体的形式为 011-44-1234-567890 。加号(+)可以用来代替任何国家的冠码,用以表示拨号者使用了所在国家的国际冠码。当前的大部分手机都允许“+”的输入,可以是按住“0”键(大部分GSM制式的手机)或连按两次“*”星号键输入。在使用时,系统会根据电话被使用的位置自动将“+”转换成正确的国际代码,使得拨打者可以在任何国家用相同的储存号码拨打电话。“+”也可以用“00”来代替。
国际电信联盟早些前已推荐00作为通用的国际冠码,并已为数不少的国家所采用。然而仍有国家决定采用不同的国际冠码,甚至提供多组冠码,例如美国的就是011。详细国际冠码表。
MCC
移动设备国家代码 Mobile Country Code (MCC)由三位十进制数组成,它表明移动用户(或系统)归属的国家。
格式。MCC由三个十进制数组成,编码范围为十进制的000-999。作为全球唯一的国家识别标准,MCC的资源由国际电联(ITU)统一分配和管理。ITU建议书E.212规定了各国的MCC号码。中国的移动设备国家代码为460(十进制)。 由于MCC的特殊意义,因此它在网络中一旦设定之后是不允许更改的。
移动设备国家代码列表➫
MNC
即移动网号,两个数字。格式:移动网号(MNC)由二个十进制数组成,编码范围为十进制的00-99。若一个国家中有多于一个的GSM公司陆地移动网(PLMN),则每个网必须具有不同的MNC。MNC一般由国家的有关电信管理部门统一分配,同一个营运者可以拥有一个或多个MNC(视业务提供的规模而定),但不同的营运者不可以分享相同的MNC。由于MNC的特殊意义,因此它在网络中一旦设定是不允许更改的。中国运营商的MNC:
00 中国移动
01 中国联通
02 中国移动
03 中国电信
05 中国电信
06 中国联通
07 中国移动
IMSI
国际移动用户识别码(IMSI) International Mobile Subscriber Identity。国际上为唯一识别一个移动用户所分配的号码。从技术上讲,IMSI可以彻底解决国际漫游问题。但是由于北美目前仍有大量的AMPS系统使用MIN号码,且北美的MDN和MIN采用相同的编号,系统已经无法更改,所以目前国际漫游暂时还是以MIN为主。其中以0和1打头的MIN资源称为IRM(International Roaming MIN),由IFAST (International Forum on ANSI-41 Standards Technology)统一管理。目前联通申请的IRM资源以09打头。可以看出,随着用户的增长,用于国际漫游的MIN资源将很快耗尽,全球统一采用IMSI标识用户势在必行。
格式:IMSI共有15位,其结构为:MCC+MNC+MIN 。MIN共有10位,其结构:09+M0M1M2M3+ABCD。其中的M0M1M2M3和MDN号码中的H0H1H2H3可存在对应关系,ABCD四位为自由分配。可以看出IMSI在MIN号码前加了MCC,可以区别出每个用户的来自的国家,因此可以实现国际漫游。在同一个国家内,如果有多个CDMA运营商,可以通过MNC来进行区别。
国际域名缩写、国家代码
即为每个国家、地区分配的域名的缩写,如中国为CN。
语言代码
ISO 639是数个由国际标准化组织为各语言所订定的语言代码。中文的ISO 639-1代码为zh。 ISO 639-1是国际标准化组织ISO 639语言编码标准的第一部分。它含有 136 个两字母的编码,用来标示世界上主要的语言。这些代码在很多地方都被用作语言的简写,例如:
英语(English)用en表示
德语(Deutsch)用de表示(Deutsch 是德语的本名)
日语(Japanese)用ja表示(尽管日语的拼音是 Nihongo)
汉语 使用zh表示,来自“中文”的汉语拼音:Zhōngwén
ISO 639-1在 2002年成为正式标准。
ISO 639-1收录语言列表➫。
语言的标签表示法
由RFC 4646标准定义,《Tags for Identifying Languages》。
这个文件规定,一种语言的标签应该按照如下方式排列:
language-script-region-variant-extension-privateuse
1. language:这部分就是ISO 639规定的语言代码,比如中文是zh。
2. script:表示变体,比如简体汉字是zh-Hans,繁体汉字是zh-Hant。
3. region:表示语言使用的地理区域,比如zh-Hans-CN就是中国大陆使用的简体中文。
4. variant:表示方言。
5. extension-privateus:表示扩展用途和私有标识。
一般约定,language标签全部小写,region标签全部大写,script标签只有首字母大写。不同标签之间用连字号-链接。
比如html中,content-language用于定义页面所使用的语言代码。
content-language语法:
language-code = primary-code ( "-" subcode )*
// 例如:zh-CN
primary-code为语言代码,subcode为国家代码。
中文zh
Chinese zh
Chinese (Simplified) Legacy zh-CHS
Chinese (Traditional) Legacy zh-CHT
Chinese (Simplified) zh-Hans
Chinese (Traditional) zh-Hant
Chinese (Simplified, PRC) zh-CN
Chinese (Traditional, Hong Kong S.A.R.) zh-HK
Chinese (Traditional, Macao S.A.R.) zh-MO
Chinese (Simplified, Singapore) zh-SG
Chinese (Traditional, Taiwan) zh-TW
zh-CN → zh-CHS → zh-Hans → zh
zh-TW → zh-CHT → zh-Hant → zh
// 简体汉字zh-Hans,繁体汉字zh-Hant,是zh汉字的变体。
时区
时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。比如中国为东八区(UTC/GMT+08:00)。是比世界协调时间(UTC)/格林威治时间(GMT)快8小时的时区。在1884年的“国际经度会议”上,格林尼治天文台测定的经线被确定为零度经线,有关国际会议决定将地球表面按经线从南到北,每相隔15度划一个区域,这样一共有24个区域,并且规定相邻区域的时间相差1小时。在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。
移动端
获取locale
ios、Android可以获取到本机设置语言,如zh-Hans。
注意:这个会跟随用户如手机设置的语言、地区而发生变动。
获取国家代码(国际域名缩写)
ios、Android可以获取到本机设置所在国家、地区,如CN。
注意:这个会跟随用户如手机设置的所在国家、地区而发生变动。
获取MCC
ios、Android 在设备插入了SIM卡后可以获取到MCC。
MCC不会随用户所在地理位置而改变。
未插入SIM卡获取不到。
获取MNC
ios、Android 在设备插入了SIM卡后可以获取到MNC。
未插入SIM卡获取不到。
获取本机手机号
ios、Android 在手机插入了SIM卡,并且获得用户授权后可以获取到本机手机号。
有些运营商SIM并不能获取到本机号
获取到的手机号包含国家冠码+国家区码+手机号。
ios在获取本机号可能存在AppStore审核不通过可能,ios一般不会去获取本机号。
获取通讯录
ios、Android 获得用户授权后可以获取到通讯录。
通讯录信息可以拿到姓名+号码。号码即用户输入存入的号码,不会自动加上冠码、国家区号等信息。
获取所在时区
ios、Android 可以获取到用户所在时区,值为用户本机系统设置的时区。
服务端
时区
PHP:
PHP支持的时区➫
注意这个是在变动的。通过函数:timezone_identifiers_list() 或者方法:\DateTimeZone::listIdentifiers() 来列取当前php环境下定义了的时区。客户端在上报timeZone时,由于时区字符串规则较多,且总数不固定。在做合法性检查时可以巧妙的使用:
$timeZone = "Asia/Shanghai";
$o = new DateTimeZone($timeZone);
if (is_object($o)) {
return $timeZone; // 合法
}
return false; // 不合法
这个方案比in_array($timeZone, timezone_identifiers_list()) 更优,实际使用中发现timezone_identifiers_list()会有较多时区不支持。
手机号格式
在全球各个国家的手机号格式不尽相同,这里列举出一些常用国家或地区的手机号格式:
国家或地区 | 长度 | 开头 |
---|---|---|
中国 | 11 | 1开头 |
美国 | 10 | - |
加拿大 | 7 | - |
中国香港 | 8 | 6、9开头 |
中国台湾 | 10 | 09开头,0是台湾省内用 |
英国 | 11 | 077,078,079开头 |
德国 | 10 | 17开头 |
印度 | 10 | 98开头 |
日本 | 11 | 080、090开头,小灵通070开头 |
韩国 | 11 | 010、011、016、017、018、019开头 |
泰国 | 9 | 666开头 |
附录
对照表
Countries and Regions | 国家或地区 | 国际域名缩写 | 国际电话区号 CC | 时差 | 移动设备国家代码 MCC |
---|---|---|---|---|---|
Angola | 安哥拉 | AO | 244 | -7 | 631 |
Afghanistan | 阿富汗 | AF | 93 | -3.5 | 412 |
Albania | 阿尔巴尼亚 | AL | 355 | -7 | 276 |
Algeria | 阿尔及利亚 | DZ | 213 | -8 | 603 |
Alaska(U.S.A) | 阿拉斯加 | US | 1907 | +3 | 310~316 |
Andorra | 安道尔 | AD | 376 | -8 | 213 |
Anguilla | 安圭拉岛 | AI | 1264 | -12 | 365 |
Antigua and Barbuda | 安提瓜和巴布达 | AG | 1268 | -12 | 344 |
Argentina | 阿根廷 | AR | 54 | -11 | 722 |
Armenia | 亚美尼亚 | AM | 374 | 0 | 283 |
Ascension | 阿森松 | 247 | -8 | ||
Australia | 澳大利亚 | AU | 61 | +2 | 505 |
Austria | 奥地利 | AT | 43 | -7 | 232 |
Azerbaijan | 阿塞拜疆 | AZ | 994 | -5 | 400 |
Bahamas | 巴哈马 | BS | 1242 | -13 | 364 |
Bahrain | 巴林 | BH | 973 | -5 | 426 |
Bangladesh | 孟加拉国 | BD | 880 | -2 | 470 |
Barbados | 巴巴多斯 | BB | 1246 | -12 | 342 |
Belarus | 白俄罗斯 | BY | 375 | -6 | 257 |
Belgium | 比利时 | BE | 32 | -7 | 206 |
Belize | 伯利兹 | BZ | 501 | -14 | 702 |
Benin | 贝宁 | BJ | 229 | -7 | 616 |
Bermuda Is | 百慕大群岛 | BM | 1441 | -12 | 350 |
Bhutan | 不丹 | BT | 975 | 0 | 402 |
Bolivia | 玻利维亚 | BO | 591 | -12 | 736 |
Botswana | 博茨瓦纳 | BW | 267 | -6 | 652 |
Brazil | 巴西 | BR | 55 | -11 | 724 |
Brunei | 文莱 | BN | 673 | 0 | 528 |
Bulgaria | 保加利亚 | BG | 359 | -6 | 284 |
Burkina-faso | 布基纳法索 | BF | 226 | -8 | 613 |
Burma | 缅甸 | MM | 95 | -1.3 | 414 |
Burundi | 布隆迪 | BI | 257 | -6 | 642 |
Cameroon | 喀麦隆 | CM | 237 | -7 | 624 |
Canada | 加拿大 | CA | 1 | -13 | 302 |
Cayman Is | 开曼群岛 | KY | 1345 | -13 | 346 |
Central African Republic | 中非共和国 | CF | 236 | -7 | 623 |
Chad | 乍得 | TD | 235 | -7 | 622 |
Chile | 智利 | CL | 56 | -13 | 730 |
China | 中国 | CN | 86 | 0 | 460~461 |
Colombia | 哥伦比亚 | CO | 57 | 0 | 732 |
Congo | 刚果 | CG | 242 | -7 | 629 |
Democratic Republic of the Congo | 刚果民主共和国 | CD | 243 | -7 | 630 |
Cook Is | 库克群岛 | CK | 682 | -18.3 | 548 |
Costa Rica | 哥斯达黎加 | CR | 506 | -14 | 712 |
Cuba | 古巴 | CU | 53 | -13 | 368 |
Cyprus | 塞浦路斯 | CY | 357 | -6 | 280 |
Czech | 捷克 | CZ | 420 | -7 | 230 |
Denmark | 丹麦 | DK | 45 | -7 | 238 |
Djibouti | 吉布提 | DJ | 253 | -5 | 638 |
Dominica | 多米尼加 | DO | 1890 | -13 | 370 |
Ecuador | 厄瓜多尔 | EC | 593 | -13 | 740 |
Egypt | 埃及 | EG | 20 | -6 | 602 |
EI Salvador | 萨尔瓦多 | SV | 503 | -14 | 706 |
Estonia | 爱沙尼亚 | EE | 372 | -5 | 248 |
Ethiopia | 埃塞俄比亚 | ET | 251 | -5 | 636 |
Fiji | 斐济 | FJ | 679 | +4 | 542 |
Finland | 芬兰 | FI | 358 | -6 | 244 |
France | 法国 | FR | 33 | -8 | 208 |
French Guiana | 法属圭亚那 | GF | 594 | -12 | 742 |
Gabon | 加蓬 | GA | 241 | -7 | 628 |
Gambia | 冈比亚 | GM | 220 | -8 | 607 |
Georgia | 格鲁吉亚 | GE | 995 | 0 | 282 |
Germany | 德国 | DE | 49 | -7 | 262 |
Ghana | 加纳 | GH | 233 | -8 | 620 |
Gibraltar | 直布罗陀 | GI | 350 | -8 | 266 |
Greece | 希腊 | GR | 30 | -6 | 202 |
Grenada | 格林纳达 | GD | 1809 | -14 | 352 |
Guam | 关岛 | GU | 1671 | +2 | 535 |
Guatemala | 危地马拉 | GT | 502 | -14 | 704 |
Guinea | 几内亚 | GN | 224 | -8 | 611 |
Guyana | 圭亚那 | GY | 592 | -11 | 738 |
Haiti | 海地 | HT | 509 | -13 | 372 |
Honduras | 洪都拉斯 | HN | 504 | -14 | 708 |
Hongkong | 香港 | HK | 852 | 0 | 454 |
Hungary | 匈牙利 | HU | 36 | -7 | 216 |
Iceland | 冰岛 | IS | 354 | -9 | 274 |
India | 印度 | IN | 91 | -2.3 | 404 |
Indonesia | 印度尼西亚 | ID | 62 | -0.3 | 510 |
Iran | 伊朗 | IR | 98 | -4.3 | 432 |
Iraq | 伊拉克 | IQ | 964 | -5 | 418 |
Ireland | 爱尔兰 | IE | 353 | -8 | 272 |
Israel | 以色列 | IL | 972 | -6 | 425 |
Italy | 意大利 | IT | 39 | -7 | 222 |
Ivory Coast | 科特迪瓦 | CI | 225 | -6 | 612 |
Jamaica | 牙买加 | JM | 1876 | -12 | 338 |
Japan | 日本 | JP | 81 | +1 | 440~441 |
Jordan | 约旦 | JO | 962 | -6 | 416 |
Cambodia(Kampuchea) | 柬埔寨 | KH | 855 | -1 | 456 |
Kazakstan | 哈萨克斯坦 | KZ | 327 | -5 | 401 |
Kenya | 肯尼亚 | KE | 254 | -5 | 639 |
Korea | 韩国 | KR | 82 | +1 | 450 |
Kuwait | 科威特 | KW | 965 | -5 | 419 |
Kyrgyzstan | 吉尔吉斯坦 | KG | 331 | -5 | 437 |
Laos | 老挝 | LA | 856 | -1 | 457 |
Latvia | 拉脱维亚 | LV | 371 | -5 | 247 |
Lebanon | 黎巴嫩 | LB | 961 | -6 | 415 |
Lesotho | 莱索托 | LS | 266 | -6 | 651 |
Liberia | 利比里亚 | LR | 231 | -8 | 618 |
Libya | 利比亚 | LY | 218 | -6 | 606 |
Liechtenstein | 列支敦士登 | LI | 423 | -7 | 295 |
Lithuania | 立陶宛 | LT | 370 | -5 | 246 |
Luxembourg | 卢森堡 | LU | 352 | -7 | 270 |
Macao | 澳门 | MO | 853 | 0 | 455 |
Madagascar | 马达加斯加 | MG | 261 | -5 | 646 |
Malawi | 马拉维 | MW | 265 | -6 | 650 |
Malaysia | 马来西亚 | MY | 60 | -0.5 | 502 |
Maldives | 马尔代夫 | MV | 960 | -7 | 472 |
Mali | 马里 | ML | 223 | -8 | 610 |
Malta | 马耳他 | MT | 356 | -7 | 278 |
Mariana Is | 马里亚那群岛 | MP | 1670 | +1 | 534 |
Martinique | 马提尼克 | MQ | 596 | -12 | 340 |
Mauritius | 毛里求斯 | MU | 230 | -4 | 617 |
Mexico | 墨西哥 | MX | 52 | -15 | 334 |
Moldova | 摩尔多瓦 | MD | 373 | -5 | 259 |
Monaco | 摩纳哥 | MC | 377 | -7 | 212 |
Mongolia | 蒙古 | MN | 976 | 0 | 428 |
Montserrat Is | 蒙特塞拉特岛 | MS | 1664 | -12 | 354 |
Morocco | 摩洛哥 | MA | 212 | -6 | 604 |
Mozambique | 莫桑比克 | MZ | 258 | -6 | 643 |
Namibia | 纳米比亚 | NA | 264 | -7 | 649 |
Nauru | 瑙鲁 | NR | 674 | +4 | 536 |
Nepal | 尼泊尔 | NP | 977 | -2.3 | 429 |
Netheriands Antilles | 荷属安的列斯 | 599 | -12 | ||
Netherlands | 荷兰 | NL | 31 | -7 | 204 |
New Zealand | 新西兰 | NZ | 64 | +4 | 530 |
Nicaragua | 尼加拉瓜 | NI | 505 | -14 | 710 |
Niger | 尼日尔 | NE | 227 | -8 | 614 |
Nigeria | 尼日利亚 | NG | 234 | -7 | 621 |
North Korea | 朝鲜 | KP | 850 | +1 | 467 |
Norway | 挪威 | NO | 47 | -7 | 242 |
Oman | 阿曼 | OM | 968 | -4 | 422 |
Pakistan | 巴基斯坦 | PK | 92 | -2.3 | 410 |
Panama | 巴拿马 | PA | 507 | -13 | 714 |
Papua New Cuinea | 巴布亚新几内亚 | PG | 675 | +2 | 537 |
Paraguay | 巴拉圭 | PY | 595 | -12 | 744 |
Peru | 秘鲁 | PE | 51 | -13 | 716 |
Philippines | 菲律宾 | PH | 63 | 0 | 515 |
Poland | 波兰 | PL | 48 | -7 | 260 |
French Polynesia | 法属玻利尼西亚 | PF | 689 | +3 | 547 |
Portugal | 葡萄牙 | PT | 351 | -8 | 268 |
Puerto Rico | 波多黎各 | PR | 1787 | -12 | 330 |
Qatar | 卡塔尔 | QA | 974 | -5 | 427 |
Reunion | 留尼旺 | RE | 262 | -4 | 647 |
Romania | 罗马尼亚 | RO | 40 | -6 | 226 |
Russia | 俄罗斯 | RU | 7 | -5 | 250 |
Saint Lueia | 圣卢西亚 | LC | 1758 | -12 | 358 |
Saint Vincent | 圣文森特岛 | VC | 1784 | -12 | 360 |
American Samoa | 美属萨摩亚 | AS | 684 | -19 | 544 |
Samoa | 萨摩亚 | WS | 685 | -19 | 549 |
San Marino | 圣马力诺 | SM | 378 | -7 | 292 |
Sao Tome and Principe | 圣多美和普林西比 | ST | 239 | -8 | 626 |
Saudi Arabia | 沙特阿拉伯 | SA | 966 | -5 | 420 |
Senegal | 塞内加尔 | SN | 221 | -8 | 608 |
Seychelles | 塞舌尔 | SC | 248 | -4 | 633 |
Sierra Leone | 塞拉利昂 | SL | 232 | -8 | 619 |
Singapore | 新加坡 | SG | 65 | +0.3 | 525 |
Slovakia | 斯洛伐克 | SK | 421 | -7 | 231 |
Slovenia | 斯洛文尼亚 | SI | 386 | -7 | 293 |
Solomon Is | 所罗门群岛 | SB | 677 | +3 | 540 |
Somali | 索马里 | SO | 252 | -5 | 637 |
South Africa | 南非 | ZA | 27 | -6 | 655 |
Spain | 西班牙 | ES | 34 | -8 | 214 |
Sri Lanka | 斯里兰卡 | LK | 94 | 0 | 413 |
St.Lucia | 圣卢西亚 | LC | 1758 | -12 | 358 |
St.Vincent | 圣文森特 | VC | 1784 | -12 | 360 |
Sudan | 苏丹 | SD | 249 | -6 | 634 |
Suriname | 苏里南 | SR | 597 | -11.3 | 746 |
Swaziland | 斯威士兰 | SZ | 268 | -6 | 653 |
Sweden | 瑞典 | SE | 46 | -7 | 240 |
Switzerland | 瑞士 | CH | 41 | -7 | 228 |
Syria | 叙利亚 | SY | 963 | -6 | 417 |
Taiwan | 台湾 | TW | 886 | 0 | 466 |
Tajikstan | 塔吉克斯坦 | TJ | 992 | -5 | 436 |
Tanzania | 坦桑尼亚 | TZ | 255 | -5 | 640 |
Thailand | 泰国 | TH | 66 | -1 | 520 |
Togo | 多哥 | TG | 228 | -8 | 615 |
Tonga | 汤加 | TO | 676 | +4 | 539 |
Trinidad and Tobago | 特立尼达和多巴哥 | TT | 1809 | -12 | 374 |
Tunisia | 突尼斯 | TN | 216 | -7 | 605 |
Turkey | 土耳其 | TR | 90 | -6 | 286 |
Turkmenistan | 土库曼斯坦 | TM | 993 | -5 | 438 |
Uganda | 乌干达 | UG | 256 | -5 | 641 |
Ukraine | 乌克兰 | UA | 380 | -5 | 255 |
United Arab Emirates | 阿拉伯联合酋长国 | AE | 971 | -4 | 424,430~431 |
United Kiongdom | 英国 | GB | 44 | -8 | 234~235 |
United States of America | 美国 | US | 1 | -13 | 310~316 |
Uruguay | 乌拉圭 | UY | 598 | -10.3 | 748 |
Uzbekistan | 乌兹别克斯坦 | UZ | 233 | -5 | 434 |
Venezuela | 委内瑞拉 | VE | 58 | -12.3 | 734 |
Vietnam | 越南 | VN | 84 | -1 | 452 |
Yemen | 也门 | YE | 967 | -5 | 421 |
Zimbabwe | 津巴布韦 | ZW | 263 | -6 | 648 |
Zambia | 赞比亚 | ZM | 260 | -6 | 645 |