thinkphp 原始碼分析系列 三 多語言

2021-10-10 06:41:04 字數 1788 閱讀 1772

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了。鑑於瀏...