因為本站使用的是繁體漢字,而我們大陸的大部分人都是使用的簡體漢字,所以我在頂端導航處加了「繁簡切換」功能。考慮到更好的用戶體驗,所以我決定在正文部分加上一些警示文字。但是呢,如果來訪的用戶如果是台灣或者香港地區的,那麼警示文字顯得有些多餘且沒必要,所以需要對其進行語言判斷。網上很多用到的方法大都是對來訪的ip進行判斷,但是如果用戶使用了代理或者在外等一些情況,那麼可能會顯得有些不準確。所以我考慮了下通過瀏覽器的語言設置進行判斷,雖然說不能排除某一小部分人可能喜歡用英文的語言設置,但是大部分還是奏效的。
實現的原理:
瀏覽器發給web服務器的 HTTP Headers Information 中包含了這樣一個信息 Accept-Language這個信息就是,瀏覽器中 工具->Internet選項->常規 下的 語言,它就是用來設置瀏覽器可接受的語言首選項的, 它可以是多種可接受語言的優先排序列。
以PHP為例,用戶可接受的語言信息,放在$_SERVER[‘HTTP_ACCEPT_LANGUAGE’]裏,變量信息是類似這樣的 “zh-cn”,如果是多語言列,是類似 “zh-cn,en;q=0.8,ko;q=0.5,zh-tw;q=0.3″這樣的情況。
戳我進入判斷當前使用的瀏覽器的語言設置
因為本人對php幾乎一竅不通,當時就直接用if語句寫個個判斷,如下:
1 2 3 4 5 6 | <? if($_SERVER['HTTP_ACCEPT_LANGUAGE']=="zh-cn" ) { echo "經雷達探測,您使用的語言為新中國的簡體漢字,為避免暈車,請使用頂端導航的繁簡切換功能,謝謝 !";//當是簡體中文的時候 } ?> |
但是你的瀏覽器可能並不是只有一種語言設置,例如firefox默認的語言設置就是zh-cn,zh;q=0.5,opera國際版的是zh-CN,en;q=0.9,fr;q=0.8,ja;q=0.7,de;q=0.6,es;q=0.5,it;q=0.4,pt;q=0.3,pt-PT;q=0.2,nl;q=0.1,sv;q=0.1,nb;q=0.1,da;q=0.1,fi;q=0.1,ru;q=0.1,pl;q=0.1,zh-TW;q=0.1,ko;q=0.1,所以此法並不可取。google了近半個小時,查到了php的preg_match()函數,大體就是可以自定義一個規則來和某一個參數進行匹配,所以判斷的語句修改成如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php error_reporting(E_ALL ^ E_NOTICE); preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);// 分析 HTTP_ACCEPT_LANGUAGE 的屬性 $lang = $matches[1];// 取第一語言設置 switch ($lang) { case 'zh-cn' : echo "經雷達探測,您使用的語言為新中國的簡體漢字,為避免暈車,請使用頂端導航的繁簡切換功能,謝謝 !"; break; default: echo "經雷達探測,您使用的語言目前超出本站的想像範圍,您確定您看得懂中文?"; break; } ?> |
部分瀏覽器的語言顯示大小寫可能有問題,比如我所使用的opera顯示的是zh-CN,所以我們要繼續完善它,成品如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php error_reporting(E_ALL ^ E_NOTICE); preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);// 分析 HTTP_ACCEPT_LANGUAGE 的屬性 $lang = $matches[1];// 這裡只取第一語言設置 (其他可根據需要增強功能,這裡只做簡單的方法演示) switch ($lang) { case 'zh-cn' : echo "經雷達探測,您使用的語言為新中國的簡體漢字,為避免暈車,請使用頂端導航的繁簡切換功能,謝謝 !"; break; case 'zh-CN' : echo "經雷達探測,您使用的語言為新中國的簡體漢字,為避免暈車,請使用頂端導航的繁簡切換功能,謝謝 !"; break; case 'zh-hk' : echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!"; break; case 'zh-HK' : echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!"; break; case 'zh-tw' : echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!"; break; case 'zh-TW' : echo "經雷達探測,您使用的語言為中國傳統繁體漢字,為本站所推崇文字,祝您旅途愉快!"; break; case 'en-us' : echo "經雷達探測,您使用的語言為英文,您確定你看得懂中文?"; break; default: echo "經雷達探測,您使用的語言目前超出本站的想像範圍,您確定您看得懂中文?"; break; } ?> |
具體的效果可見本blog的文章上端的提示文字,或者把代碼存成php放在自己網路空間測試。如發現顯示不準確,請訪問http://guaniu.com/test/lang.php探測你的瀏覽器的語言設置,然後給我回覆,謝謝!
Pingback: 讓你的<pre></pre>能自動換行 | Leeiio™ Chaos Made.
…… 哈哈,我看得懂中文,這提醒挺好玩的。
對了,你為什麼要用繁體的?當然,我也認為電腦宋體設計得很垃圾……
@Jor:習慣寫了,平時書面也會寫,只是覺得傳統的漢字很好看。
還行吧,只是覺得之前Google還有FF推介時,很多人用這個方法推廣自己的FF..
有沒有辦法添加更多語言的支持,並且自動附上一個google翻譯的鏈接,就是點了之後直接通過google翻譯成瀏覽者的語言
@Yuri case ‘en-us’ : 引號裡面自己去修改成其他語言的即可,可以參照句型複製很多個但是我覺得這樣太龐大了..
我在找一個合適在寫linux命令時會自動變成一個黑色的命令行.那樣在讓人看起來也懂的在寫文章時更容易.你這個是合適寫代碼的.是一件很不錯.如果你知道在寫命令行的.可以介紹一下.
Pingback: 讓你的能自動換行 - Leeiio Chaos Made.
不都是簡體么?沒有繁體呀!
@華晨
因為本站目前啟用了服務器端的繁簡轉換功能,只要你的瀏覽器的主語言設置是簡體中文的話,我的網站就會以簡體中文形式顯示~ 你可以嘗試在我博客地址後面加上 /zh-tw/
@Leeiio
呵呵,沒有啊,加了還是又跳轉到簡體中文的,呵呵。
@華晨
諸如地址 leeiio.me/zh-tw/
暈~~ 看了這篇文章才知道…
怪不得我在http://leeiio.me/jquery-last-by-author/#comment-5100 的回覆,文字全變了。。5555名字也變了「嗰個人」 😥
在判斷某些字元串的時候, 比如上面的 switch, 可以先把大小寫轉換再判斷, php 可用 strtolower 和 strtoupper
好博客 好博主 客戶端顯示簡繁的 JS代碼 我直接一個網站上複製的 博主看看
判斷可以在伺服器上判斷 翻譯就交給客戶端了 關鍵是全局的 不佔用伺服器資源
document.write(” 繁體中文“);
var Default_isFT = 0 //默認是否繁體,0-簡體,1-繁體
var StranIt_Delay = 50 //翻譯延時毫秒(設這個的目的是讓網頁先流暢的顯現出來)
//-------代碼開始,以下別改-------
//轉換文本
function StranText(txt,toFT,chgTxt)
{
if(txt==””||txt==null)return “”
toFT=toFT==null?BodyIsFt:toFT
if(chgTxt)txt=txt.replace((toFT?”簡”:”繁”),(toFT?”繁”:”簡”))
if(toFT){return Traditionalized(txt)}
else {return Simplized(txt)}
}
//轉換對象,使用遞歸,逐層剝到文本
function StranBody(fobj)
{
if(typeof(fobj)==”object”){var obj=fobj.childNodes}
else
{
var tmptxt=StranLink_Obj.innerHTML.toString()
if(tmptxt.indexOf(“簡”)<0)
{
BodyIsFt=1
StranLink_Obj.innerHTML=StranText(tmptxt,0,1)
StranLink.title=StranText(StranLink.title,0,1)
}
else
{
BodyIsFt=0
StranLink_Obj.innerHTML=StranText(tmptxt,1,1)
StranLink.title=StranText(StranLink.title,1,1)
}
setCookie(JF_cn,BodyIsFt,7)
var obj=document.body.childNodes
}
for(var i=0;i0||OO==StranLink_Obj)continue;
if(OO.title!=””&&OO.title!=null)OO.title=StranText(OO.title);
if(OO.alt!=””&&OO.alt!=null)OO.alt=StranText(OO.alt);
if(OO.tagName==”INPUT”&&OO.value!=””&&OO.type!=”text”&&OO.type!=”hidden”)OO.value=StranText(OO.value);
if(OO.nodeType==3){OO.data=StranText(OO.data)}
else StranBody(OO)
}
}
function JTPYStr()
{
return ‘皚藹礙愛翱襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊綳筆畢斃閉邊編貶變辯辮鱉癟瀕濱賓擯餅撥缽鉑駁卜補參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟產闡顫場嘗長償腸廠暢鈔車徹塵陳襯撐稱懲誠騁痴遲馳恥齒熾沖蟲寵疇躊籌綢丑櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨盪檔搗島禱導盜燈鄧敵滌遞締點墊電淀釣調迭諜疊釘頂錠訂東動棟凍斗犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩范販飯訪紡飛廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦復負訃婦縛該鈣蓋干趕稈贛岡剛鋼綱崗皋鎬擱鴿閣鉻個給龔宮鞏貢鉤溝構購夠蠱顧剮關觀館慣貫廣規硅歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴匯諱誨繪葷渾伙獲貨禍擊機積飢譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢鹼礆揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較秸階節莖驚經頸靜鏡徑痙競凈糾廄舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離里鯉禮麗厲勵礫歷瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴凌靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿么霉沒鎂門悶們錳夢謎彌覓綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒膩攆捻釀鳥聶嚙鑷鎳檸獰寧擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐國愛賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪朴譜臍齊騎豈啟氣棄訖牽扦釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽傘喪騷掃澀殺紗篩曬閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖綏歲孫損筍縮瑣鎖獺撻抬攤貪癱灘壇譚談嘆湯燙濤絛騰謄銻題體屜條貼鐵廳聽烴銅統頭圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍為濰維葦偉偽緯謂衛溫聞紋穩問瓮撾蝸渦窩嗚鎢烏誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈杴鮮纖咸賢銜閑顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶銹綉虛噓須許緒續軒懸選癬絢學勛詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顏閻艷厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠葯爺頁業葉醫銥頤遺儀彝蟻藝億憶義詣議誼譯異繹蔭陰銀飲櫻嬰鷹應纓瑩螢營熒蠅穎喲擁佣癰踴詠涌優憂郵鈾猶游誘輿魚漁娛與嶼語吁御獄譽預馭鴛淵轅園員圓緣遠願約躍鑰岳粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓臟鑿棗灶責擇則澤賊贈扎札軋鍘閘詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙幀鄭證織職執紙摯擲幟質鍾終種腫眾謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁庄裝妝壯狀錐贅墜綴諄濁茲資漬蹤綜總縱鄒詛組鑽致鍾么為只凶准啟板里靂余鏈泄’;
}
function FTPYStr()
{
return ‘皚藹礙愛翺襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊繃筆畢斃閉邊編貶變辯辮鼈癟瀕濱賓擯餅撥缽鉑駁蔔補參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟産闡顫場嘗長償腸廠暢鈔車徹塵陳襯撐稱懲誠騁癡遲馳恥齒熾沖蟲寵疇躊籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨蕩檔搗島禱導盜燈鄧敵滌遞締點墊電澱釣調疊諜疊釘頂錠訂東動棟凍鬥犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩範販飯訪紡飛廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦複負訃婦縛該鈣蓋幹趕稈贛岡剛鋼綱崗臯鎬擱鴿閣鉻個給龔宮鞏貢鉤溝構購夠蠱顧剮關觀館慣貫廣規矽歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴彙諱誨繪葷渾夥獲貨禍擊機積饑譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較稭階節莖驚經頸靜鏡徑痙競淨糾廄舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離裏鯉禮麗厲勵礫曆瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴淩靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿麽黴沒鎂門悶們錳夢謎彌覓綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒膩攆撚釀鳥聶齧鑷鎳檸獰甯擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐國愛賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪樸譜臍齊騎豈啓氣棄訖牽扡釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽傘喪騷掃澀殺紗篩曬閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖綏歲孫損筍縮瑣鎖獺撻擡攤貪癱灘壇譚談歎湯燙濤縧騰謄銻題體屜條貼鐵廳聽烴銅統頭圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍爲濰維葦偉僞緯謂衛溫聞紋穩問甕撾蝸渦窩嗚鎢烏誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈鍁鮮纖鹹賢銜閑顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶鏽繡虛噓須許緒續軒懸選癬絢學勳詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顔閻豔厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠藥爺頁業葉醫銥頤遺儀彜蟻藝億憶義詣議誼譯異繹蔭陰銀飲櫻嬰鷹應纓瑩螢營熒蠅穎喲擁傭癰踴詠湧優憂郵鈾猶遊誘輿魚漁娛與嶼語籲禦獄譽預馭鴛淵轅園員圓緣遠願約躍鑰嶽粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓髒鑿棗竈責擇則澤賊贈紮劄軋鍘閘詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙幀鄭證織職執紙摯擲幟質鍾終種腫衆謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝妝壯狀錐贅墜綴諄濁茲資漬蹤綜總縱鄒詛組鑽緻鐘麼為隻兇準啟闆裡靂餘鍊洩’;
}
function Traditionalized(cc){
var str=”,ss=JTPYStr(),tt=FTPYStr();
for(var i=0;i10000&&ss.indexOf(cc.charAt(i))!=-1)str+=tt.charAt(ss.indexOf(cc.charAt(i)));
else str+=cc.charAt(i);
}
return str;
}
function Simplized(cc){
var str=”,ss=JTPYStr(),tt=FTPYStr();
for(var i=0;i10000&&tt.indexOf(cc.charAt(i))!=-1)str+=ss.charAt(tt.indexOf(cc.charAt(i)));
else str+=cc.charAt(i);
}
return str;
}
function setCookie(name, value) //cookies設置
{
var argv = setCookie.arguments;
var argc = setCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
if(expires!=null)
{
var LargeExpDate = new Date ();
LargeExpDate.setTime(LargeExpDate.getTime() + (expires*1000*3600*24));
}
document.cookie = name + “=” + escape (value)+((expires == null) ? “” : (“; expires=” +LargeExpDate.toGMTString()));
}
function getCookie(Name) //cookies讀取
{
var search = Name + “=”
if(document.cookie.length > 0)
{
offset = document.cookie.indexOf(search)
if(offset != -1)
{
offset += search.length
end = document.cookie.indexOf(“;”, offset)
if(end == -1) end = document.cookie.length
return unescape(document.cookie.substring(offset, end))
}
else return “”
}
}
var StranLink_Obj=document.getElementById(“StranLink”)
if (StranLink_Obj)
{
var JF_cn=”ft”+self.location.hostname.toString().replace(/\./g,””)
var BodyIsFt=getCookie(JF_cn)
if(BodyIsFt!=”1″)BodyIsFt=Default_isFT
with(StranLink_Obj)
{
if(typeof(document.all)!=”object”) //非IE瀏覽器
{
href=”javascript:StranBody()”
}
else
{
href=”#”;
onclick= new Function(“StranBody();return false”)
}
title=StranText(“點擊以繁體中文方式瀏覽”,1,1)
innerHTML=StranText(innerHTML,1,1)
}
if(BodyIsFt==”1″){setTimeout(“StranBody()”,StranIt_Delay)}
}
當然遇上動態內容就不給力了 腳本啊 等等
不錯,解決問題的思路值得學習.
把語言名字都換成小寫的,然後放進數組,就不會那麼龐大了,初學php,借鑒你的代碼,稍稍修改了些
error_reporting(E_ALL ^ E_NOTICE);
preg_match(‘/^([a-z\-]+)/i’, $_SERVER[‘HTTP_ACCEPT_LANGUAGE’], $matches);// 分析 HTTP_ACCEPT_LANGUAGE 的屬性
$lang = strtolower($matches[1]);// 這裡只取第一語言設置 (其他可根據需要增強功能,這裡只做簡單的方法演示)
$zh_cn = array (“zh”,”zh-cn”,”zh-hant”,”zh-sg”);
$zh_tw = array(“zh-hk”,”zh-mo”,”zh-tw”);
if(in_array(“$lang”,$zh_cn)){
echo “中國簡體漢字”;
}elseif (in_array(“$lang”,$zh_tw)){
echo “中國傳統繁體漢字”;
}else{
echo “English”;
}
好站 好文