Monday, April 4, 2011

Parse Accept-Language to detect a user's language

The Future of the Web » Parse Accept-Language to detect a user's language » Web Development with JavaScript, jQuery, PHP and MySQL


I'm an English-speaking Canadian living in Germany. Quite often I go to a website like Google or Kayak and find myself looking at a German version of the site.
Okay, I do live in Germany, but why assume that everyone within Germany speaks German? What about visitors from other countries, or even people living here that would prefer to use another language?
What must be happening is these sites are taking my IP address, looking up the geographical location of that address, and choosing the official language for that country. This may work most of the time, but there is an even easier way to choose a language.
Most browsers send an Accept-Language header. For example, mine is set to:
en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2
What this basically says is that I prefer (in decreasing order of preference) Canadian English, generic English, US English, German spoken in Germany, and lastly generic German. Any web site I visit is capable of looking at this list and deciding what language I would prefer.
Of course, no matter what assumptions you make about a visitor, give them a chance to change their language if needed. For example, if you use an Internet cafe in Berlin, you shouldn't be stuck viewing websites in German!
One really nice thing: I often see Google Ads and other geographically targeted ads in German, and this makes ignoring the ads much easier! :)
Update: I was inspired to throw together a quick Accept-Language parser in PHP:
$langs = array();  if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {     // break up string into pieces (languages and q factors)     preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);      if (count($lang_parse[1])) {         // create a list like "en" => 0.8         $langs = array_combine($lang_parse[1], $lang_parse[4]);               // set default to 1 for any without q factor         foreach ($langs as $lang => $val) {             if ($val === '') $langs[$lang] = 1;         }          // sort list based on value          arsort($langs, SORT_NUMERIC);     } }  // look through sorted list and use first one that matches our languages foreach ($langs as $lang => $val) {  if (strpos($lang, 'de') === 0) {   // show German site  } else if (strpos($lang, 'en') === 0) {   // show English site  }  }  // show default site or prompt for language 
This would produce the following structure for my Accept-Language string:
Array (     [en-ca] => 1     [en] => 0.8     [en-us] => 0.6     [de-de] => 0.4     [de] => 0.2 )

ZF组件功能简介

转自: ZF组件功能简介 - 在网一方的日志 - 网易博客

Zend_Acl:为权限管理提供轻量并灵活的访问控制列表的功能
Zend_Auth:为认证和一些通用用例情景的具体认证适配器提供一个接口
Zend_Cache:一个缓存任何数据的一般方法
Zend_Captcha:提交数据的验证,以判断提交者是人还是机器自动操作,防止被恶意提交
Zend_Config:简化访问和使用配置数据
Zend_Console_Getopt:命令参数的设置和读取
Zend_Controller:MVC的控制器★★
Zend_Currency:处理所有关于货币、钱的表示和格式
Zend_Date:处理日期和时间
Zend_Db:操作数据库★★
Zend_Debug:输出变量的值,只有一个方法Zend_Debug::dump($var, $label=null, $echo=true);
Zend_Dojo:Dojo Toolkit工具,1.6.0版本新增
Zend_Dom:为使用DOM文档和结构提供工具
Zend_Exception:ZF抛出的所有异常都是Zend_Exception的子类的对象
Zend_Feed:处理的RSS和Atom Feed
Zend_File:处理文件的上传和下载
Zend_Filter:替换掉不需要不安全的数据★
Zend_Filter_Input:多重数据过滤和校验★
Zend_Form:利用ZF多个组件对表单的创建和处理进行简化★
Zend_Gdata:Google服务的接口○
Zend_Http:执行HTTP请求,处理GET和POST等
Zend_Infocard:信息卡认证与管理○
Zend_Json:处理JS与PHP变量交换
Zend_Layout:布局,常用于模板,可脱离MVC使用
Zend_Ldap:处理轻量级目录访问协议,这一组件极不完善
Zend_Loader:加载的名称是变量的文件,require_once的升级版
Zend_Locale:本地化和国际化组件(L10n和I18n)
Zend_Log:通用日志组件,它支持多个日志后端,格式化发送给日志的消息,过滤被纪录的消息
Zend_Mail:通用功能用于撰写和发送文本以及兼容MIME标准的含有多个段的邮件消息★
Zend_Measure:处理度量衡的换算
Zend_Memory:内存数据管理
Zend_Mime:处理多段MIME消息的辅助类,在Zend_Mail和Zend_Mime_Message中使用了它,也可在需要MIME支持的应用程序中使用
Zend_OpenId:OpenID的支持接口
Zend_Paginator:数据分页,或取得所需页的数据★
Zend_Pdf:加载存在的PDF文档,生成新的、修改和保存修改后的PDF文档
Zend_ProgressBar:建立和控制进度条的组件
Zend_Registry:处理对象注册表(通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象,相当于一种全局存储)
Zend_Rest:REST是Web Service的一种,通过XML交换数据
Zend_Search_Lucene:通用文本搜索引擎,不需要数据库支持
Zend_Server:基于Reflection API的标准机制,供服务器类开发者使用
Zend_Service_Akismet:akismet.com的接口○
Zend_Service_Amazon:amazon.com的接口○
Zend_Service_Audioscrobbler:audioscrobbler.net的接口○
Zend_Service_Delicious:del.icio.us的接口○
Zend_Service_Flickr:flickr.com的接口○
Zend_Service_Nirvanix:nirvanix.com的接口○
Zend_Service_ReCaptcha:recaptcha.net的接口○

Thursday, March 31, 2011

stdClass的介绍

一维数组,我现在特别喜欢把它写成对象,因为键盘打起来比较顺手,看起来也顺眼,如
$andy = array();
$andy['a'] = 1;
$andy['b'] = 2;
$andy['c'] = 3;
我喜欢把它变成这样
$andy = array();
$andy = (object)$andy;
$andy->a = 1;
$andy->b = 2;
$andy->c = 3;
新建空数组只要$andy = array();
新建空对像却要$andy = new Andy; 而且还得先有个class Andy{}
或者得2行
$andy = array();
$andy = (object)$andy;
用array直接改类型成object有点别扭,今天找到了答案,感谢phpx的兄弟

Wednesday, March 30, 2011

Zend Framework 多语言国际化

转自: http://hi.baidu.com/tianhuimin/blog/item/ea115166dc637536aa184c17.html
多语言”仅仅是网站国际化的一个方面,其中还包括“日期格式”、“时区”、“日 历”、“货币”等。“多语言”、“日期”和“时区”是最为关心的。这篇文章就Zend_Locale, Zend_Translate, Zend_Date, date_default_timezone_set讲述国际化的简单运用。
1. 创建Zend_Locale对象
$local=new Zend_Locale();
默认情况下,按照用户浏览器设定地区。即,浏览器为中国,则网站地区为中国。
当然可以根据服务器环境设定地区,或者直接输入参数:new Zend_Locale(‘en_US’)。
设计思路:使用Cookie来保存用户曾经选择的地区,如果Cookie未设置,则默认根据浏览器判断。
$locale=new Zend_Locale();
if(isset($_COOKIE['locale'])&& Zend_Locale::isLocale($_COOKIE['locale'],true,false)){$locale->setLocale($_COOKIE['locale']);}
2. Zend_Translate 设置多语言
ZF提过了很多翻译适配器,其中最为常用的gettext,对应的语言数据位.mo。.mo被很多软件用来开发多语言,譬如WordPress。
简介下Zend_Rranslate的gettext用法:
$translate=new Zend_Translate(gettext,//适配器
‘languages’,//语言包文件夹,mo文件存放位置
$locale,//Zend_Locale对象
array(’scan’ => Zend_Translate::LOCALE_FILENAME)//自动扫描形式);
languages文件夹下存放数据文件为:zh_CN.mo, en_US.mo, zh_TW
Controller中使用方法$translate->_(‘msgID’),需要将$translate对象写入注册表,Zend_Registry(‘Zend_Translate’,$translate), 键值必须是 Zend_Translate,否则,得不到应有的结果。
View中使用方法translate(‘msgID’) ?> , 通过View中的translate助手。
关于mo文件的创建,可以下载poEdit,关于poEdit的使用我尚未完全明白,简述我的mo文件制作方法。
(1) 通过poEdit创建zh_CN.po文件,用editPlus打开zh_CN.po,
输入:
msgid "welcome"
msgstr "欢迎您"
(2)用poEdit打开zh_CN.po,保存一下,即可生成zh_CN.mo文件。也可以另存为zh_TW,用来做繁体。
3. 时间格式
都知道美国人表示时间格式与中国人不同,怎样才能把数据库中的一个UNIX时间戳根据地区显示不同形式呢?Zend_Date可以达到这样的效果。
$date=new Zend_Date(123456789,false,$locale);
print$date;
即可根据$locale地区设置不同时间显示格式。
思路
在数据库中存储UNIX时间戳,利用Zend_Date与$locale对象设置时间戳的显示格式。
4. 时区
让我很不解的是,好像Zend_Date里面没有时区设置,不能根据$locale自动设置时区,尝试很多,未果。我的思路如下:
将用户选择的失去写入Cookie,如果未设置Cookie,则使用Asia/Shanghai作为默认时区。
if(isset($_COOKIE['timezone'])){date_default_timezone_set($_COOKIE['timezone']);}else{date_default_timezone_set('Asia/Shanghai');}

Sunday, February 13, 2011

陶喆 David Tao Zhe -- small town girl 小镇姑娘

Tuesday, February 8, 2011

MySQL Database Country Code Table SQL With ISO 3166 1 and 2 Country Codes

转自: MySQL Database Country Code Table SQL With ISO 3166 1 and 2 Country Codes: "MySQL Database Country Code Table SQL"

各国语言缩写-各国语言简称,世界各国域名缩写 - Steven Lei的博客 - CSDN博客

转自: 各国语言缩写-各国语言简称,世界各国域名缩写 - Steven Lei的博客 - CSDN博客

各国语言缩写-各国语言简称

en 英文
en_US 英文 (美国)
ar 阿拉伯文
ar_AE 阿拉伯文 (阿拉伯联合酋长国)
ar_BH 阿拉伯文 (巴林)
ar_DZ 阿拉伯文 (阿尔及利亚)
ar_EG 阿拉伯文 (埃及)
ar_IQ 阿拉伯文 (伊拉克)
ar_JO 阿拉伯文 (约旦)
ar_KW 阿拉伯文 (科威特)
ar_LB 阿拉伯文 (黎巴嫩)
ar_LY 阿拉伯文 (利比亚)
ar_MA 阿拉伯文 (摩洛哥)
ar_OM 阿拉伯文 (阿曼)
ar_QA 阿拉伯文 (卡塔尔)
ar_SA 阿拉伯文 (沙特阿拉伯)
ar_SD 阿拉伯文 (苏丹)
ar_SY 阿拉伯文 (叙利亚)
ar_TN 阿拉伯文 (突尼斯)
ar_YE 阿拉伯文 (也门)
be 白俄罗斯文
be_BY 白俄罗斯文 (白俄罗斯)
bg 保加利亚文
bg_BG 保加利亚文 (保加利亚)
ca 加泰罗尼亚文
ca_ES 加泰罗尼亚文 (西班牙)
ca_ES_EURO 加泰罗尼亚文 (西班牙,Euro)
cs 捷克文
cs_CZ 捷克文 (捷克共和国)
da 丹麦文
da_DK 丹麦文 (丹麦)
de 德文
de_AT 德文 (奥地利)
de_AT_EURO 德文 (奥地利,Euro)
de_CH 德文 (瑞士)
de_DE 德文 (德国)
de_DE_EURO 德文 (德国,Euro)
de_LU 德文 (卢森堡)
de_LU_EURO 德文 (卢森堡,Euro)
el 希腊文
el_GR 希腊文 (希腊)
en_AU 英文 (澳大利亚)
en_CA 英文 (加拿大)
en_GB 英文 (英国)
en_IE 英文 (爱尔兰)
en_IE_EURO 英文 (爱尔兰,Euro)
en_NZ 英文 (新西兰)
en_ZA 英文 (南非)
es 西班牙文
es_BO 西班牙文 (玻利维亚)
es_AR 西班牙文 (阿根廷)
es_CL 西班牙文 (智利)
es_CO 西班牙文 (哥伦比亚)
es_CR 西班牙文 (哥斯达黎加)
es_DO 西班牙文 (多米尼加共和国)
es_EC 西班牙文 (厄瓜多尔)
es_ES 西班牙文 (西班牙)
es_ES_EURO 西班牙文 (西班牙,Euro)
es_GT 西班牙文 (危地马拉)
es_HN 西班牙文 (洪都拉斯)
es_MX 西班牙文 (墨西哥)
es_NI 西班牙文 (尼加拉瓜)
et 爱沙尼亚文
es_PA 西班牙文 (巴拿马)
es_PE 西班牙文 (秘鲁)
es_PR 西班牙文 (波多黎哥)
es_PY 西班牙文 (巴拉圭)
es_SV 西班牙文 (萨尔瓦多)
es_UY 西班牙文 (乌拉圭)
es_VE 西班牙文 (委内瑞拉)
et_EE 爱沙尼亚文 (爱沙尼亚)
fi 芬兰文
fi_FI 芬兰文 (芬兰)
fi_FI_EURO 芬兰文 (芬兰,Euro)
fr 法文
fr_BE 法文 (比利时)
fr_BE_EURO 法文 (比利时,Euro)
fr_CA 法文 (加拿大)
fr_CH 法文 (瑞士)
fr_FR 法文 (法国)
fr_FR_EURO 法文 (法国,Euro)
fr_LU 法文 (卢森堡)
fr_LU_EURO 法文 (卢森堡,Euro)
hr 克罗地亚文
hr_HR 克罗地亚文 (克罗地亚)
hu 匈牙利文
hu_HU 匈牙利文 (匈牙利)
is 冰岛文
is_IS 冰岛文 (冰岛)
it 意大利文
it_CH 意大利文 (瑞士)
it_IT 意大利文 (意大利)
it_IT_EURO 意大利文 (意大利,Euro)
iw 希伯来文
iw_IL 希伯来文 (以色列)
ja 日文
ja_JP 日文 (日本)
ko 朝鲜文
ko_KR 朝鲜文 (南朝鲜)
lt 立陶宛文
lt_LT 立陶宛文 (立陶宛)
lv 拉托维亚文(列托)
lv_LV 拉托维亚文(列托) (拉脱维亚)
mk 马其顿文
mk_MK 马其顿文 (马其顿王国)
nl 荷兰文
nl_BE 荷兰文 (比利时)
nl_BE_EURO 荷兰文 (比利时,Euro)
nl_NL 荷兰文 (荷兰)
nl_NL_EURO 荷兰文 (荷兰,Euro)
no 挪威文
no_NO 挪威文 (挪威)
no_NO_NY 挪威文 (挪威,Nynorsk)
pl 波兰文
pl_PL 波兰文 (波兰)
pt 葡萄牙文
pt_BR 葡萄牙文 (巴西)
pt_PT 葡萄牙文 (葡萄牙)
pt_PT_EURO 葡萄牙文 (葡萄牙,Euro)
ro 罗马尼亚文
ro_RO 罗马尼亚文 (罗马尼亚)
ru 俄文
ru_RU 俄文 (俄罗斯)
sh 塞波尼斯-克罗地亚文
sh_YU 塞波尼斯-克罗地亚文 (南斯拉夫)
sk 斯洛伐克文
sk_SK 斯洛伐克文 (斯洛伐克)
sl 斯洛文尼亚文
sl_SI 斯洛文尼亚文 (斯洛文尼亚)
sq 阿尔巴尼亚文
sq_AL 阿尔巴尼亚文 (阿尔巴尼亚)
sr 塞尔维亚文
sr_YU 塞尔维亚文 (南斯拉夫)
sv 瑞典文
sv_SE 瑞典文 (瑞典)
th 泰文
th_TH 泰文 (泰国)
tr 土耳其文
tr_TR 土耳其文 (土耳其)
uk 乌克兰文
uk_UA 乌克兰文 (乌克兰)
zh 中文
zh_CN 中文 (中国)
zh_HK 中文 (香港)
zh_TW 中文 (台湾)

Countries and Regions国家或地区国际域名缩写
Angola 安哥拉 AO
Afghanistan 阿富汗 AF
Albania 阿尔巴尼亚 AL
Algeria 阿尔及利亚 DZ
Andorra 安道尔共和国 AD
Anguilla 安圭拉岛 AI
Antigua and Barbuda 安提瓜和巴布达 AG
Argentina 阿根廷 AR
Armenia 亚美尼亚 AM
Ascension 阿森松
Australia 澳大利亚 AU
Austria 奥地利 AT
Azerbaijan 阿塞拜疆 AZ
Bahamas 巴哈马 BS
Bahrain 巴林 BH
Bangladesh 孟加拉国 BD
Barbados 巴巴多斯 BB
Belarus 白俄罗斯 BY
Belgium 比利时 BE
Belize 伯利兹 BZ
Benin 贝宁 BJ
Bermuda Is. 百慕大群岛 BM
Bolivia 玻利维亚 BO
Botswana 博茨瓦纳 BW
Brazil 巴西 BR
Brunei 文莱 BN
Bulgaria 保加利亚 BG
Burkina-faso 布基纳法索 BF
Burma 缅甸 MM
Burundi 布隆迪 BI
Cameroon 喀麦隆 CM
Canada 加拿大 CA
Cayman Is. 开曼群岛
Central African Republic 中非共和国 CF
Chad 乍得 TD
Chile 智利 CL
China 中国 CN
Colombia 哥伦比亚 CO
Congo 刚果 CG
Cook Is. 库克群岛 CK
Costa Rica 哥斯达黎加 CR
Cuba 古巴 CU
Cyprus 塞浦路斯 CY
Czech Republic 捷克 CZ
Denmark 丹麦 DK
Djibouti 吉布提 DJ
Dominica Rep. 多米尼加共和国 DO
Ecuador 厄瓜多尔 EC
Egypt 埃及 EG
EI Salvador 萨尔瓦多 SV
Estonia 爱沙尼亚 EE
Ethiopia 埃塞俄比亚 ET
Fiji 斐济 FJ
Finland 芬兰 FI
France 法国 FR
French Guiana 法属圭亚那 GF
Gabon 加蓬 GA
Gambia 冈比亚 GM
Georgia 格鲁吉亚 GE
Germany 德国 DE
Ghana 加纳 GH
Gibraltar 直布罗陀 GI
Greece 希腊 GR
Grenada 格林纳达 GD
Guam 关岛 GU
Guatemala 危地马拉 GT
Guinea 几内亚 GN
Guyana 圭亚那 GY
Haiti 海地 HT
Honduras 洪都拉斯 HN
Hongkong 香港 HK
Hungary 匈牙利 HU
Iceland 冰岛 IS
India 印度 IN
Indonesia 印度尼西亚 ID
Iran 伊朗 IR
Iraq 伊拉克 IQ
Ireland 爱尔兰 IE
Israel 以色列 IL
Italy 意大利 IT
Ivory Coast 科特迪瓦
Jamaica 牙买加 JM
Japan 日本 JP
Jordan 约旦 JO
Kampuchea (Cambodia ) 柬埔寨 KH
Kazakstan 哈萨克斯坦 KZ
Kenya 肯尼亚 KE
Korea 韩国 KR
Kuwait 科威特 KW
Kyrgyzstan 吉尔吉斯坦 KG
Laos 老挝 LA
Latvia 拉脱维亚 LV
Lebanon 黎巴嫩 LB
Lesotho 莱索托 LS
Liberia 利比里亚 LR
Libya 利比亚 LY
Liechtenstein 列支敦士登 LI
Lithuania 立陶宛 LT
Luxembourg 卢森堡 LU
Macao 澳门 MO
Madagascar 马达加斯加 MG
Malawi 马拉维 MW
Malaysia 马来西亚 MY
Maldives 马尔代夫 MV
Mali 马里 ML
Malta 马耳他 MT
Mariana Is 马里亚那群岛
Martinique 马提尼克
Mauritius 毛里求斯 MU
Mexico 墨西哥 MX
Moldova, Republic of 摩尔多瓦 MD
Monaco 摩纳哥 MC
Mongolia 蒙古 MN
Montserrat Is 蒙特塞拉特岛 MS
Morocco 摩洛哥 MA
Mozambique 莫桑比克 MZ
Namibia 纳米比亚 NA
Nauru 瑙鲁 NR
Nepal 尼泊尔 NP
Netheriands Antilles 荷属安的列斯
Netherlands 荷兰 NL
New Zealand 新西兰 NZ
Nicaragua 尼加拉瓜 NI
Niger 尼日尔 NE
Nigeria 尼日利亚 NG
North Korea 朝鲜 KP
Norway 挪威 NO
Oman 阿曼 OM
Pakistan 巴基斯坦 PK
Panama 巴拿马 PA
Papua New Cuinea 巴布亚新几内亚 PG
Paraguay 巴拉圭 PY
Peru 秘鲁 PE
Philippines 菲律宾 PH
Poland 波兰 PL
French Polynesia 法属玻利尼西亚 PF
Portugal 葡萄牙 PT
Puerto Rico 波多黎各 PR
Qatar 卡塔尔 QA
Reunion 留尼旺
Romania 罗马尼亚 RO
Russia 俄罗斯 RU
Saint Lueia 圣卢西亚 LC
Saint Vincent 圣文森特岛 VC
Samoa Eastern 东萨摩亚(美)
Samoa Western 西萨摩亚
San Marino 圣马力诺 SM
Sao Tome and Principe 圣多美和普林西比 ST
Saudi Arabia 沙特阿拉伯 SA
Senegal 塞内加尔 SN
Seychelles 塞舌尔 SC
Sierra Leone 塞拉利昂 SL
Singapore 新加坡 SG
Slovakia 斯洛伐克 SK
Slovenia 斯洛文尼亚 SI
Solomon Is 所罗门群岛 SB
Somali 索马里 SO
South Africa 南非 ZA
Spain 西班牙 ES
Sri Lanka 斯里兰卡 LK
St.Lucia 圣卢西亚 LC
St.Vincent 圣文森特 VC
Sudan 苏丹 SD
Suriname 苏里南 SR
Swaziland 斯威士兰 SZ
Sweden 瑞典 SE
Switzerland 瑞士 CH
Syria 叙利亚 SY
Taiwan 台湾省 TW
Tajikstan 塔吉克斯坦 TJ
Tanzania 坦桑尼亚 TZ
Thailand 泰国 TH
Togo 多哥 TG
Tonga 汤加 TO
Trinidad and Tobago 特立尼达和多巴哥 TT
Tunisia 突尼斯 TN
Turkey 土耳其 TR
Turkmenistan 土库曼斯坦 TM
Uganda 乌干达 UG
Ukraine 乌克兰 UA
United Arab Emirates 阿拉伯联合酋长国 AE
United Kiongdom 英国 GB
United States of America 美国 US
Uruguay 乌拉圭 UY
Uzbekistan 乌兹别克斯坦 UZ
Venezuela 委内瑞拉 VE
Vietnam 越南 VN
Yemen 也门 YE
Yugoslavia 南斯拉夫 YU
Zimbabwe 津巴布韦 ZW
Zaire 扎伊尔 ZR
Zambia 赞比亚 ZM