精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

Yii2——基于Mustache的頁面多語言解決方案-創新互聯

在Yii 2中,官方的頁面多語言解決方案有兩個:

創新互聯成立與2013年,是專業互聯網技術服務公司,擁有項目成都網站設計、成都網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元疊彩做網站,已為上家服務,為疊彩各地企業和個人服務,聯系電話:13518219792

方案1,使用Yii::t()函數,在頁面中需要輸出文字的地方,使用類似如下代碼:

這樣做的后果是頁面上大量充斥著類似的代碼,導致頁面可讀性很差,而且對于同一個頁面來說,Yii::t()函數的第一個參數基本上都是一樣的,看到這些重復代碼,也是心塞。我曾經在項目中采用這種方式實現多語言,一個簡單的登錄頁面都能寫到心煩的要命。

方案2,為指定語言做一個專門的視圖,假設你有個頁面是英文的,想再做個中文頁面,可是中英文頁面布局等相差很大,不是簡單的翻譯文字,那么在Yii 2中,可以在該頁面的目錄下,再建立一個zh-CN目錄,然后在這個目錄下建立一個同名的視圖文件,頁面內容用中文實現即可。這個我會專門再有文章說明如何實現。

如果中英文頁面布局基本一樣,只是文字有變化,那么建議還是不要用方案2了,寧可用方案1降低可讀性,否則一旦頁面內容有修改,兩個頁面之間的內容同步會搞到你懷疑人生。

總之,不管是方案1還是2,我都不喜歡,想要尋找一種簡潔明了的頁面多語言方案,頁面看起來干凈清爽,又不需要為每個語言做單獨的頁面。

那么怎樣才能做到呢,我從Mustache中找到了實現的方案,假設下面是一個視圖的代碼:

{{基本信息}}

{{下載隊列}} {{等待隊列}}
{{已安裝}} {{當前GameInfo}}
{{剩余電量}} {{是否允許OTA}}

如果把想要多語言顯示的文字用Mustache的變量符號給括起來,然后假設上面的內容已經存到一個字符串$content里,那么在Action中,可以用Mustache將其輸出為英文:

$content = $this->render('mypage', $params);
$m = new Mustache_Engine();
$content = $m->render($content, [
    '基本信息' => 'Base Information',
    '下載隊列' => 'Downloading',
    '等待隊列' => 'Waiting',
    '已安裝' => 'Installed',
    '當前GameInfo' => 'GameInfo',
    '剩余電量' => 'Battery Level',
    '是否允許OTA' => 'Is can OTA',
]);

return $content;

這里的要點是先用Yii的render函數,得到要輸出頁面的字符串,然后使用Mustache,將指定的文字轉換為英文,最后通過return輸出。

上面這段代碼就是使用Mustache實現頁面多語言的核心思想,首先看頁面的代碼,完全沒有任何PHP的代碼,都是標準的HTML元素,頁面看起來非常的干凈清爽,前端開發人員可以直接用這個頁面做前端的各種效果,完美實現前后端開發的解耦。

當然,上面展示的是核心的思想,但是要實際使用,還是需要進一步的完善。

首先,翻譯的文字其實不適合放到Action的代碼里,這樣不好維護,應該按照Yii 2的設計思想,放到messages目錄下,為指定語言建立messages文件,類似如下:

return [
    'device/views/deviceLog/mypage => [
        '基本信息' => 'Base Information',
        '下載隊列' => 'Downloading',
        '等待隊列' => 'Waiting',
        '已安裝' => 'Installed',
        '當前GameInfo' => 'GameInfo',
        '剩余電量' => 'Battery Level',
        '是否允許OTA' => 'Is can OTA',
    ],
];

使用視圖的路徑作為鍵值,方便為每個頁面確定翻譯的內容。

其次,做一個自己的Controller的基類,重載render函數:

public function render($view, $params = [])
{
    $content = parent::render($view, $params);

    $path = $this->getViewPath() . '/' . $view;
    $list = EonI18nUtils::getMsgs($path);
    if (empty($list)) {
        return $content;
    }
    $m = new Mustache_Engine([
        'delimiters' => '## ##',
    ]);
    $content = $m->render($content, $list);

    return $content;
}

這里,先調用父類的render函數,得到正常輸出的視圖字符串,再調用EonI18nUtils::getMsgs(),根據視圖文件的路徑,得到該頁面的多語言鍵值對,然后創建Mustache對象,將視圖字符串中的指定鍵值修改為翻譯后的文字。

為了保證頁面上基于JavaScript的Mustache可以使用,這里將Mustache的鍵值標簽由{{}}改為####,頁面代碼類似如下:

##基本信息##

##下載隊列## {{downloading}} ##等待隊列## {{waitting}}
##已安裝## {{installed}} ##當前GameInfo## {{gameinfo}}
##剩余電量## {{battery_level}}% ##是否允許OTA## {{allowOTA}}

這樣,上面代碼中用##括起來的文字會被翻譯,而用{{}}括起來的,則由頁面上的JS代碼使用Mustache方案替換文字。

EonI18nUtils::getMsgs()的參考代碼如下:

public static function getMsgs($category, $lang = null)
{
    $category = str_replace('\\', '/', $category);
    $arr = explode("/", $category);
    $arr = array_slice($arr, count($arr) - 4);
    $category = implode("/", $arr);

    $messageSource = \Yii::$app->getI18n()->getMessageSource('messages');
    $list = $messageSource->getMsgList($category, $lang);
    return $list;
}

getMsgList()代碼類似如下:

public function getMsgList($langPath, $language)
{
    $language = $this->getLanguage($language);
    if (!isset($this->_messages[$language])) {
        $this->_messages[$language] = $this->loadMessages('messages', $language);
    }
    if (isset($this->_messages[$language][$langPath])) {
        return $this->_messages[$language][$langPath];
    }
    return false;
}

另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


當前名稱:Yii2——基于Mustache的頁面多語言解決方案-創新互聯
分享地址:http://m.jcarcd.cn/article/hcigi.html
主站蜘蛛池模板: 麻花豆传媒在线观看 | 蜜臀国产在线视频 | 日本免费新区 | 欧美一区二区免费 | 国产午夜福利免 | 国产亚洲熟女电影院 | 成人公开免费视频 | 欧洲北美日韩 | 强视频在线观看 | 国产二品不卡 | 精品国产福利导航 | 日本中文一二区 | 91看片淫| 69午夜国产精品 | 91人人 | 国内性色精品视频 | 91精品91| 国产夫妇肉麻对白 | 日本簧片 | 国产91免费不| 国产精品欧美 | 欧美中文字幕无线 | 91男同| 国产白丝喷浆 | 韩日午夜福利 | 国产精品第八页 | 国产欧美另 | 国产一区二区动漫 | 国内精品视频在线 | 日产乱码无线码 | 国产无人区一码二码 | aⅴ片在线观看 | 国产在线观看专线一 | 国产精品尤物视频 | 午夜日韩欧美 | 精品国产久九九 | 91福利在线视频 | 欧美日韩国产成 | 国产精品天天在线看 | 91福利在线播放 | 精品免费中文乱伦 |