应用国际化
[转] 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 |

浙公网安备 33010602011771号