beego中的語言本地化

       運行github.com\beego\samples目錄下的WebIM應用,配置目錄下的app.conf文件中包含"lang_types = zh-CN|en-US",而且也包含locale_en-US.ini、locale_zh-CN.ini兩個文件。在chrome瀏覽器去訪問的時候總是顯示中文,在controllers目錄下的baseController結構體的Prepare方法中看到註釋"Prepare implemented Prepare() method for baseController.It's used for language option check and setting.",調用this.Ctx.Request.Header.Get("Accept-Language")獲取到accept language,然後再設置的中文,但是在beego庫和WebIM應用中都沒有搜到"Accept-Language",然後就把this.Ctx.Request.Header打印出來得到"map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9] Cache-Control:[max-age=0] Connection:[keep-alive] Sec-Fetch-Mode:[navigate] Sec-Fetch-Site:[cross-site] Sec-Fetch-User:[?1] Upgrade-Insecure-Requests:1 User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36]]"。看來是chrome自帶的"Accept-Language"字段。

        WebIM應用中routers目錄下的router.go文件的init函數中定義了路由規則,初始化爲welcome.html即歡迎界面,在該網頁文本中處於form表單中的submit類型的button,由於form的action屬性值爲"/join"而且method屬性值爲"post",所以會直接調用AppController類的Join方法,最終會重定向到長輪詢或者websocket的主頁,其實longpolling.html和websocket.html幾乎沒有區別。

       因爲在長輪詢對應的js文件longpolling.js中"Call fetch every 3 seconds",所以在路由"/lp/fetch"對應的處理函數LongPollingController類的Fetch函數中需要通過chan bool來阻塞,只有chatroom.go中有新的models.Event來到後,纔會繼續執行長輪詢的Fetch函數,然後把數據返回到網頁端的longpolling.js中,js去做聊天事件的呈現,而且js中根據isWait變量來判斷如果正在阻塞等待服務端數據後就不會繼續fetch。

       websocket.go文件中定義了區別長輪詢的另一種連接,websocket連接。1、在對應的websocket.js文件中"// Create a socket"連接的是"'ws://' + window.location.host + '/ws/join?uname='",根據路由配置最終會調用WebSocketController類的Join方法;2、注意WebSocketController類的Join方法中依賴"github.com/gorilla/websocket"所創建的websocket對象,其中註釋"// Upgrade from http request to WebSocket.";WebSocketController類的Join方法中的ws就代表了網頁客戶端到服務的的連接;3、服務端的Join方法中"// Message receive loop"不斷的從網頁端阻塞讀取數據,而網頁端的websocket.js文件中在用戶點擊"發送"按鈕後調用"socket.send(content);"發送數據到服務端;4、當服務端有event事件時候調用broadcastWebSocket廣播函數依次往所有的websocket連接中發送數據;5、websocket是長連接,所以斷開的時候會通知到其他的連接(包括長輪詢的短連接)事件"xxx left the chat room"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章