php是靜態語言,Thinkphp靜態緩存多語言切換

該樓層疑似違規已被系統折疊?隱藏此樓查看此樓

  • 1.首先判斷用戶有無手動指定語言
  • 2.從session中獲得當前語言
  • 3.session里面沒有則從cookie里面去取
  • 4.若是cookie里沒有,則根據IP段判斷
  • 5.若不在指定ip范圍內,自動偵測瀏覽器語言

首先我們在Common/Conf/tags.php配置開啟多語言行為

return array(

'app_begin' => array('Behavior\CheckLangBehavior'),

);

接著我們看下ThinkPHP/Library/Behavior/CheckLangBehavior.class.php。其中根據ip程序沒有作處理,請建表插入數據庫自行解決。

if (!C('LANG_SWITCH_ON',null,false)){

return;

}

// 啟用了語言包功能

$langSet = C('DEFAULT_LANG');

$varLang = C('VAR_LANGUAGE',null,'l');

$langList = C('LANG_LIST',null,'en');

// session_start();

// 首先判斷用戶有無手動指定語言

if(!empty($_GET[$varLang]))

{

$selectLang = $_GET[$varLang];

}

if (isset($selectLang)) {

// 切換語言

$langSet = $selectLang;

$abc='用戶自己設置語言';

if (false === stripos($langList, $langSet)) $langSet = C('DEFAULT_LANG');// 非法語言參數

$this->selectLang($langSet);

} else {

// 從session中獲得當前語言

$sessionLang = session('rm_selected_language');

if(isset($sessionLang))

{

$abc='從Session中獲得';

$langSet = $sessionLang;

if (false === stripos($langList, $langSet)) {

$langSet = C('DEFAULT_LANG');// 非法語言參數

$this->selectLang($langSet); // 刷新成正確的值

}

} else {

if (cookie('rm_selected_language')) {// 獲取上次用戶的選擇

$langSet = cookie('rm_selected_language');

$abc='獲取上次用戶的選擇';

} elseif (null !== $this->getLangTypeByIP()) {

//優先級2 根據IP段判斷

$langSet = $this->getLangTypeByIP();

$abc='根據IP段判斷';

} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {// 自動偵測瀏覽器語言

preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);

//優先級3 根據瀏覽器語言判斷

$langSet = strtolower($matches[1]) == 'zh-cn' ? 'zh' : $matches[1];

$abc='自動偵測瀏覽器語言';

}

if (false === stripos($langList, $langSet)) $langSet = C('DEFAULT_LANG');// 非法語言參數

$this->selectLang($langSet);

}

}

// 定義當前語言

define('LANG_SET',strtolower($langSet));

define('HELLO',$abc);

// 讀取框架語言包

$file = THINK_PATH.'Lang/'.LANG_SET.'.php';

if(LANG_SET != C('DEFAULT_LANG') && is_file($file))

L(include $file);

// 讀取應用公共語言包

$file = LANG_PATH.LANG_SET.'.php';

if(is_file($file))

L(include $file);

// 讀取模塊語言包

$file = MODULE_PATH.'Lang/'.LANG_SET.'.php';

if(is_file($file))

L(include $file);

// 讀取當前控制器語言包

$file = MODULE_PATH.'Lang/'.LANG_SET.'/'.strtolower(CONTROLLER_NAME).'.php';

if (is_file($file))

L(include $file);

從以上代碼我們發現語言包在Common/lang文件夾下。

標簽: 多語言中英文國際化

聲明:本文為原創文章,如需轉載,請注明來源sucaihuo.com并保留原文鏈接:http://www.sucaihuo.com/php/166.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

10.8.8.8檸檬wifi網頁登錄_基于企業郵箱進行wifi實名認證的方案

之前我們介紹過如何用釘釘認證和企業微信認證來實現企業內部的實名上網認證。此外郵箱認證也是企業進行wifi實名認證的一個有效手段。因為很多企業都給員工開通了企業郵箱,直接讓員工輸入郵箱賬號和密碼進行認證上網。配置、使用和維護都相對比較簡單。本文我將介紹…

用pycharm寫python老是提示錯誤_python pycharm錯誤集錦

url:http://www.cnblogs.com/hinimix/p/8016859.html1, this list creation could be rewritten as a list literal預先定義了一個listlist1 [1,2,3,4] #這么用好比list1 [1,2,3] #這么用不好list1.append(4)此時會出現該提示解決鏈接:https://stackoverflow.com/…

php tire樹,Immutable.js源碼之List 類型的詳細解析(附示例)

本篇文章給大家帶來的內容是關于Immutable.js源碼之List 類型的詳細解析(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一、存儲圖解我以下面這段代碼為例子,畫出這個List的存儲結構:let myL…

nodejs missing script: dev_nodejs深入學習系列之v8基礎篇

V8這個概念大家都不陌生了,那么你動手編譯過V8源碼嗎?編譯后有嘗試去了解V8背后的一些概念嗎?如果沒有,那么也不用心慌,下文將跟大家一一解釋這些東西。在編譯V8之前我們先要了解一個東西-構建系統1、構建系統1.1、構建…

cmos存儲器中存放了_天津大學姚建銓院士,張雅婷副教授JMCC:具有寬光譜調控特性的阻變存儲器...

【引言】存儲器是計算機中數據存放的主要介質。隨著5G時代到來,帶動人工智能、物聯網、智慧城市等應用市場發展并向存儲器提出多樣化需求,加上傳統存儲器市場價格變化等因素,新型存儲器將在市場發揮越來越重要的作用。因此具有存儲密度更高&a…

matlab轉差頻率控制,轉差頻率控制的異步電機調速系統的研究

1 引言交流變頻調速的方法是異步電機最有發展前途的調速方法。隨著電力電子技術、計算機技術和自動控制技術的不斷發展,交流電機變頻調速已經逐步取代直流電機調速,并經歷了采用電壓頻率協調控制、轉差頻率控制、矢量控制以及直接轉矩控制的發展過程。其…

python中標識符的命名規則_Python——標識符的命名規則

01 Python語言的特點 python的語言特點有很多,我們這里只講一點,python是一門面向對象的語言,即一切皆對象(Linux中有一句是:一切皆文件),括號內的只是打個比方,不懂也沒事&#xff…

python內置對象是什么_Python內置對象類型之數字類型

Python中有6種內置對象類型整數、浮點數–Number字符串–String列表–List元組–Tuple字典–Dictionary集合–Set不可變類型:Number、String、Tuple可變類型:List、Dictionary、Set知識點:變量和對象的關系–引用變量的使用數字類型的常見使用…

oracle的exp和imp,oracle exp和imp

--1.exp和imp的輸入都是名字和值對:如:exp parameter_namevalue 或exp parameter_name(value1,value2,value3..)--2.exp和imp都支持helpy選項。命令格式為:exp/imp helpy--3.exp中的參數:參數名稱 默認值 含義 建議compress Y 不壓縮導出數據的內容 comp…

python案例實操_用案例實操學習Python ,培養編程邏輯思維

案例一: A、B、C、D、E 五人在某天夜里合伙去捕魚,到第二天凌晨時都疲憊不堪,于是各自找地方睡覺。 日上三桿 A 第一個醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。 B 第二個醒來,…

oracle錯誤1327,Oracle中的PGA監控報警分析(r11筆記第97天)

最近接到一個數據庫報警,讓我頗有些意外,這是一個PGA相關的報警。聽起來感覺是應用端的資源調用出了問題。報警內容大體如下:報警內容: PGA Alarm on alltest------------------------------------報警級別: PROBLEM------------------------…

python控制臺清屏_Python Shell 怎樣清屏?

啟動Python有兩種方式,分別為“Windows命令行窗口”和“IDLE” “命令行窗口”下可以通過如下兩種方法: 1. import subprocess subprocess.call("clear") # linux/mac subprocess.call("cls", shellTrue) # windows 執行完次命令后&…

python卸載opencv包_Ubuntu16.04卸載opencv2.4.9并安裝opencv3.2.0+contrib

本文為作者原創,轉載請注明出處(http://www.cnblogs.com/mar-q/)by 負赑屃需要用到opencv中的surf和sift算法,機器上只有opencv3.2,沒有擴展包,于是就去GitHub和官網看了下,沒想到8月剛出了3.3,一個激動就想…

php函數內的循環,PHP 循環列出目錄內容的函數代碼

PHP 循環列出目錄內容的函數代碼復制代碼 代碼如下:function list_files($dir){if(is_dir($dir)){if($handle opendir($dir)){while(($file readdir($handle)) ! false){if($file ! "." && $file ! ".." && $file ! "Thumbs.db&quo…

python火柴人打架代碼_python火柴人

廣告關閉 騰訊云11.11云上盛惠 ,精選熱門產品助力上云,云服務器首年88元起,買的越多返的越多,最高返5000元! 代碼實現了一個火柴人,他開心時可以跳躍、可以舞蹈,不開心時可以躺地上... ?代碼有…

spring boot admin 2.2 獲取日志失敗_SB實戰20-Spring Boot的日志和報告

上篇我們學習了《SB實戰19-Spring Boot的外部配置》,本篇我們學習Spring Boot的日志和報告。4 日志和報告4.1 日志日志是對應用運行時進行調試和分析的重要工具。Spring Boot使用SLF4J作為日志的API,Logback、Log4j2、Java Util Logging都可以作為日志提…

oracle樹狀排序,Oracle樹狀結構查詢

oracle用表的形式組織數據,某些數據還呈現樹狀結構,提供了對這些數據的組織、查詢等功能。在掃描樹結構表時,要依次訪問樹中的每一個節點,并且每個節點只能訪問一次,其步驟如下:1:從根節點開始2…

python numpy讀取數據_大神教你python 讀取文件并把矩陣轉成numpy的兩種方法

導讀 今天小編就為大家分享一篇python 讀取文件并把矩陣轉成numpy的兩種方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 在當前目錄下: 方法1: file open(‘filename) a file.read() b a.split(‘\n)#使用…

datagrid wpf 獲取選中_c# WPF DataGrid 獲取選中單元格信息

private void Button_Click(objectsender, RoutedEventArgs e){DataGridCell cell dg.GetCell(1, 2);TextBlock tb cell.Content asTextBlock;Console.WriteLine(tb.Text);}public static classDataGridExtension{/// ///獲取DataGrid控件單元格/// /// DataGrid控件/// 單元格…

redis哨兵高可用-源碼篇

前段時間寫過兩篇redis哨兵的文章,一篇是redis哨兵模式的搭建。另外一篇是redis哨兵主從切換的原理,。 當時寫的原理篇,是手動模擬主節點故障,然后查看主從切換的日志推算哨兵主從切換的流程。但是感覺這樣搞出來的流程太粗,忽略了很多細節,真正要搞明白…