thinkphp 支援多語言,一直對thinkphp 怎麼實現多語言比較好奇。這次來分析一下thinkphp 語言包
先是98行設定lang的預設語言,賦值為lang::range
然後100行檢測是否開啟多語言自動檢測lant_switch_on,如果開啟的話,進行語言檢測(自動偵測設定獲取語言):
可以看到195 行,如果get 中傳入了lang 引數的話,就把lan
gset
設定為傳
入的值,
cook
ie中設
置了也是
一樣的,
如果都沒
有的話,
就會檢測
langset 設定為傳入的值,cookie 中設定了也是一樣的,如果都沒有的話,就會檢測
langse
t設定為
傳入的值
,coo
kie中
設定了也
是一樣的
,如果都
沒有的話
,就會檢
測_server[『http_accept_language』] 也就是瀏覽器端的語言,
然後205行到210行做了相容:
如果設定了zh-hans-cn 的話,會轉化為zh-cn ,當然也可以自定義這種轉換
然後215行開始檢測語言是否合法,判斷lang::allowlanglist 是否為空或者lan
gset
是否在l
ang:
:all
owla
ngli
st中,
如果在的
話,則把
lang
e::r
ange
設定為langset 是否在lang::allowlanglist 中,如果在的話,則把lange::range 設定為
langse
t是否在
lang
::al
lowl
angl
ist中
,如果在
的話,則
把lan
ge::
rang
e設定為
可以看到先是判斷檔案是否存在,然後存在的話直接include 語言包檔案進來。自此lang::$lang[$range] 就匯入了語言包陣列
怎麼轉化的呢?利用的是lang::get() 函式,檢查lang::$lang[$range]陣列,來進行轉化。
還可以使用助手函式:
當然也有set() 函式:
多語言一般用在控制器中,當然模板層面也可能會用到:
ThinkPHP原始碼分析系列 專案編譯機制
核心編譯快取檔案中包含的檔案有三種不同的情況 如果使用者在自身的專案配置目錄中配置了core.php檔案,那麼 runtime.php中就包含core.php檔案中返回的檔案列表下的檔案 如果使用者設定了專案特定的執行模式,那麼 runtime.php中就包含該模式下所定義的核心檔案 除此之外,ru...
Redis原始碼分析系列
redis目前熱門nosql記憶體資料庫,量不是很大,本系列是本人閱讀redis原始碼時記錄的筆記,由於時間倉促和水平有限,文中難免會有錯誤之處,歡迎讀者指出,共同學習進步,本文使用的redis版本是2.8.19。redis之hash資料結構 redis之intset資料結構 redis之skipl...
jQuery原始碼分析系列
斷斷續續地看jquery原始碼,第一次萌生看jq原始碼的念頭,當時還是版本1.7.2,由於工作中沒有用到jq的機會,連 有幾種用法都還不知道,就開始啃原始碼,痛苦自然是少不了的,於是不久就放棄扔一邊了。等到工作中終於就機會用jq了 撒花 又萌生了啃jq原始碼的念頭,此時jq版本已經是2.0了。鑑於瀏...