应用国际化

本文详细介绍应用国际化所需的各项技术实现,包括国家代码、语言代码、时区处理等关键内容,为开发者提供全面的国际化指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[转] 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()会有较多时区不支持。

手机号格式

在全球各个国家的手机号格式不尽相同,这里列举出一些常用国家或地区的手机号格式:

国家或地区长度开头
中国111开头
美国10-
加拿大7-
中国香港86、9开头
中国台湾1009开头,0是台湾省内用
英国11077,078,079开头
德国1017开头
印度1098开头
日本11080、090开头,小灵通070开头
韩国11010、011、016、017、018、019开头
泰国9666开头

 

附录

对照表
Countries and Regions国家或地区国际域名缩写国际电话区号 CC时差移动设备国家代码 MCC
Angola安哥拉AO244-7631
Afghanistan阿富汗AF93-3.5412
Albania阿尔巴尼亚AL355-7276
Algeria阿尔及利亚DZ213-8603
Alaska(U.S.A)阿拉斯加US1907+3310~316
Andorra安道尔AD376-8213
Anguilla安圭拉岛AI1264-12365
Antigua and Barbuda安提瓜和巴布达AG1268-12344
Argentina阿根廷AR54-11722
Armenia亚美尼亚AM3740283
Ascension阿森松 247-8 
Australia澳大利亚AU61+2505
Austria奥地利AT43-7232
Azerbaijan阿塞拜疆AZ994-5400
Bahamas巴哈马BS1242-13364
Bahrain巴林BH973-5426
Bangladesh孟加拉国BD880-2470
Barbados巴巴多斯BB1246-12342
Belarus白俄罗斯BY375-6257
Belgium比利时BE32-7206
Belize伯利兹BZ501-14702
Benin贝宁BJ229-7616
Bermuda Is百慕大群岛BM1441-12350
Bhutan不丹BT9750402
Bolivia玻利维亚BO591-12736
Botswana博茨瓦纳BW267-6652
Brazil巴西BR55-11724
Brunei文莱BN6730528
Bulgaria保加利亚BG359-6284
Burkina-faso布基纳法索BF226-8613
Burma缅甸MM95-1.3414
Burundi布隆迪BI257-6642
Cameroon喀麦隆CM237-7624
Canada加拿大CA1-13302
Cayman Is开曼群岛KY1345-13346
Central African Republic中非共和国CF236-7623
Chad乍得TD235-7622
Chile智利CL56-13730
China中国CN860460~461
Colombia哥伦比亚CO570732
Congo刚果CG242-7629
Democratic Republic of the Congo刚果民主共和国CD243-7630
Cook Is库克群岛CK682-18.3548
Costa Rica哥斯达黎加CR506-14712
Cuba古巴CU53-13368
Cyprus塞浦路斯CY357-6280
Czech捷克CZ420-7230
Denmark丹麦DK45-7238
Djibouti吉布提DJ253-5638
Dominica多米尼加DO1890-13370
Ecuador厄瓜多尔EC593-13740
Egypt埃及EG20-6602
EI Salvador萨尔瓦多SV503-14706
Estonia爱沙尼亚EE372-5248
Ethiopia埃塞俄比亚ET251-5636
Fiji斐济FJ679+4542
Finland芬兰FI358-6244
France法国FR33-8208
French Guiana法属圭亚那GF594-12742
Gabon加蓬GA241-7628
Gambia冈比亚GM220-8607
Georgia格鲁吉亚GE9950282
Germany德国DE49-7262
Ghana加纳GH233-8620
Gibraltar直布罗陀GI350-8266
Greece希腊GR30-6202
Grenada格林纳达GD1809-14352
Guam关岛GU1671+2535
Guatemala危地马拉GT502-14704
Guinea几内亚GN224-8611
Guyana圭亚那GY592-11738
Haiti海地HT509-13372
Honduras洪都拉斯HN504-14708
Hongkong香港HK8520454
Hungary匈牙利HU36-7216
Iceland冰岛IS354-9274
India印度IN91-2.3404
Indonesia印度尼西亚ID62-0.3510
Iran伊朗IR98-4.3432
Iraq伊拉克IQ964-5418
Ireland爱尔兰IE353-8272
Israel以色列IL972-6425
Italy意大利IT39-7222
Ivory Coast科特迪瓦CI225-6612
Jamaica牙买加JM1876-12338
Japan日本JP81+1440~441
Jordan约旦JO962-6416
Cambodia(Kampuchea)柬埔寨KH855-1456
Kazakstan哈萨克斯坦KZ327-5401
Kenya肯尼亚KE254-5639
Korea韩国KR82+1450
Kuwait科威特KW965-5419
Kyrgyzstan吉尔吉斯坦KG331-5437
Laos老挝LA856-1457
Latvia拉脱维亚LV371-5247
Lebanon黎巴嫩LB961-6415
Lesotho莱索托LS266-6651
Liberia利比里亚LR231-8618
Libya利比亚LY218-6606
Liechtenstein列支敦士登LI423-7295
Lithuania立陶宛LT370-5246
Luxembourg卢森堡LU352-7270
Macao澳门MO8530455
Madagascar马达加斯加MG261-5646
Malawi马拉维MW265-6650
Malaysia马来西亚MY60-0.5502
Maldives马尔代夫MV960-7472
Mali马里ML223-8610
Malta马耳他MT356-7278
Mariana Is马里亚那群岛MP1670+1534
Martinique马提尼克MQ596-12340
Mauritius毛里求斯MU230-4617
Mexico墨西哥MX52-15334
Moldova摩尔多瓦MD373-5259
Monaco摩纳哥MC377-7212
Mongolia蒙古MN9760428
Montserrat Is蒙特塞拉特岛MS1664-12354
Morocco摩洛哥MA212-6604
Mozambique莫桑比克MZ258-6643
Namibia纳米比亚NA264-7649
Nauru瑙鲁NR674+4536
Nepal尼泊尔NP977-2.3429
Netheriands Antilles荷属安的列斯 599-12 
Netherlands荷兰NL31-7204
New Zealand新西兰NZ64+4530
Nicaragua尼加拉瓜NI505-14710
Niger尼日尔NE227-8614
Nigeria尼日利亚NG234-7621
North Korea朝鲜KP850+1467
Norway挪威NO47-7242
Oman阿曼OM968-4422
Pakistan巴基斯坦PK92-2.3410
Panama巴拿马PA507-13714
Papua New Cuinea巴布亚新几内亚PG675+2537
Paraguay巴拉圭PY595-12744
Peru秘鲁PE51-13716
Philippines菲律宾PH630515
Poland波兰PL48-7260
French Polynesia法属玻利尼西亚PF689+3547
Portugal葡萄牙PT351-8268
Puerto Rico波多黎各PR1787-12330
Qatar卡塔尔QA974-5427
Reunion留尼旺RE262-4647
Romania罗马尼亚RO40-6226
Russia俄罗斯RU7-5250
Saint Lueia圣卢西亚LC1758-12358
Saint Vincent圣文森特岛VC1784-12360
American Samoa美属萨摩亚AS684-19544
Samoa萨摩亚WS685-19549
San Marino圣马力诺SM378-7292
Sao Tome and Principe圣多美和普林西比ST239-8626
Saudi Arabia沙特阿拉伯SA966-5420
Senegal塞内加尔SN221-8608
Seychelles塞舌尔SC248-4633
Sierra Leone塞拉利昂SL232-8619
Singapore新加坡SG65+0.3525
Slovakia斯洛伐克SK421-7231
Slovenia斯洛文尼亚SI386-7293
Solomon Is所罗门群岛SB677+3540
Somali索马里SO252-5637
South Africa南非ZA27-6655
Spain西班牙ES34-8214
Sri Lanka斯里兰卡LK940413
St.Lucia圣卢西亚LC1758-12358
St.Vincent圣文森特VC1784-12360
Sudan苏丹SD249-6634
Suriname苏里南SR597-11.3746
Swaziland斯威士兰SZ268-6653
Sweden瑞典SE46-7240
Switzerland瑞士CH41-7228
Syria叙利亚SY963-6417
Taiwan台湾TW8860466
Tajikstan塔吉克斯坦TJ992-5436
Tanzania坦桑尼亚TZ255-5640
Thailand泰国TH66-1520
Togo多哥TG228-8615
Tonga汤加TO676+4539
Trinidad and Tobago特立尼达和多巴哥TT1809-12374
Tunisia突尼斯TN216-7605
Turkey土耳其TR90-6286
Turkmenistan土库曼斯坦TM993-5438
Uganda乌干达UG256-5641
Ukraine乌克兰UA380-5255
United Arab Emirates阿拉伯联合酋长国AE971-4424,430~431
United Kiongdom英国GB44-8234~235
United States of America美国US1-13310~316
Uruguay乌拉圭UY598-10.3748
Uzbekistan乌兹别克斯坦UZ233-5434
Venezuela委内瑞拉VE58-12.3734
Vietnam越南VN84-1452
Yemen也门YE967-5421
Zimbabwe津巴布韦ZW263-6648
Zambia赞比亚ZM260-6645

参考链接

转载于:https://www.cnblogs.com/syyong/p/6226289.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值