iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 5
3

第5天-擁抱全球市場:
網站內容多語化,一個多國語言平台該怎麼寫

作者:台灣碼農-10號工程師

我的職業是在台灣當一位碼農,名字不能公開,所以你知道我的代號就好,我的代號是『10號工程師』。

我不知道各位你們在面試時是否有遇過要真正開發過多語系平台的工程師嗎?有人想找開發過多語系有經驗的工程師,找了2年還遇不到,等到人就出現在他面前時,還是認為我只是一位普通碼農。

在資訊科技的領域,國際化與本地化常被分別簡稱成i18n,如果你想多了解多語系系統要怎樣寫可以搜尋『i18n』。

好吧,開始說說我編的故事,多語系平台通常都是你先有了一個平台之後,然後你開始想說要擁抱全球市場國際化,然後你在打算將網站改成支援2種語系,然後3種,以此類推到8種以上,可是呢?多語系平台是一種一開始沒規劃好,後來就很難改的一種架構。如果你是工程師,你一定聽過mvc架構的優缺點,那麼有多語系支援的平台那就是:

MVC+L多語系架構

Model – 數據和組件處理
View – 外觀處理
Controller – 主控制程式
Language – 語言處理

了解歸了解,請問你要怎樣實作呢?首先我要請問大家一個問題,「多語系共存」你要把語言資料放在資料表中還是檔案中?

回答用資料庫就可以搞定的是錯誤答案。

資料表,那麼請問你要增加幾個欄位,答案是1個,你只要用原本的資料表多建1個欄位語系代號,這樣就解決了。但是也有絕對不能放在資料表的東西,選單上面的按鈕文字,可以放在資料庫裡嗎?答案是不應該,應該放在檔案中,也就是商品資料的多語系放在資料表中,選單上面的按鈕文字,無論如何都應該放在檔案中。

我說的有依據嗎?有。
OPENCART的語言系統就是這樣幹的

OPENCART這套購物車系統,它本身就是支援多國語言的,他會依照你後台的語系設定順序,先找正體中文的語言檔,找不到才使用預設的英文語系檔。

所以你只要將產生的正體中文的語言檔拷貝至OPENCART這套購物車系統的語言目錄,你就能將你的英文版插件或模板變為機器翻譯的中文版。

我們來隨便打開它的一個語言檔來看看
例如
\admin\language\en-gb\user\user.php 英文語言
\admin\language\ez-TW\user\user.php 繁體中文

<?php
// Heading
$_['heading_title']         = 'Users';

// Text
$_['text_success']          = 'Success: You have modified users!';
$_['text_list']             = 'User List';
$_['text_add']              = 'Add User';
$_['text_edit']             = 'Edit User';

// Column
$_['column_username']       = 'Username';
$_['column_status']         = 'Status';
$_['column_date_added']     = 'Date Added';
$_['column_action']         = 'Action';

// Entry
$_['entry_username']        = 'Username';
$_['entry_user_group']      = 'User Group';
$_['entry_password']        = 'Password';
$_['entry_confirm']         = 'Confirm';
$_['entry_firstname']       = 'First Name';
$_['entry_lastname']        = 'Last Name';
$_['entry_email']           = 'E-Mail';
$_['entry_image']           = 'Image';
$_['entry_status']          = 'Status';

// Error
$_['error_permission']      = 'Warning: You do not have permission to modify users!';
$_['error_account']         = 'Warning: You can not delete your own account!';
$_['error_exists_username'] = 'Warning: Username is already in use!';
$_['error_username']        = 'Username must be between 3 and 20 characters!';
$_['error_password']        = 'Password must be between 4 and 20 characters!';
$_['error_confirm']         = 'Password and password confirmation do not match!';
$_['error_firstname']       = 'First Name must be between 1 and 32 characters!';
$_['error_lastname']        = 'Last Name must be between 1 and 32 characters!';
$_['error_email']           = 'E-Mail Address does not appear to be valid!';
$_['error_exists_email']    = 'Warning: E-Mail Address is already registered!';
<?php
// Heading
$_['heading_title']     = '使用者管理';

// Text
$_['text_success']      = '成功:您已更新使用者帳號!';
$_['text_list']         = '使用者帳號清單';
$_['text_add']          = '新增使用者帳號';
$_['text_edit']         = '編輯使用者帳號';

// Column
$_['column_username']   = '使用者帳號';
$_['column_status']     = '狀態';
$_['column_date_added'] = '新增日期';
$_['column_action']     = '管理';

// Entry
$_['entry_username']    = '使用者帳號';
$_['entry_user_group']  = '帳號群組';
$_['entry_password']    = '密碼';
$_['entry_confirm']     = '確認密碼';
$_['entry_firstname']   = '名字';
$_['entry_lastname']    = '姓氏';
$_['entry_email']       = '信箱';
$_['entry_image']      	= '圖片';
$_['entry_status']      = '狀態';

// Error
$_['error_permission']  = '警告: 您沒有權限更改使用者帳號!';
$_['error_account']     = '警告: 您不能刪除自己的帳號!';
$_['error_exists']      = '警告: 使用者帳號已經存在!';
$_['error_username']    = '使用者帳號必須在 3 至 20 個字之間!';
$_['error_password']    = '密碼長度必須在 4 至 20 個字之間!';
$_['error_confirm']     = '密碼和確認密碼不一致!';
$_['error_firstname']   = '名字必須在 1 至 32 個字之間!';
$_['error_lastname']    = '姓氏必須在 1 至 32 個字之間!';
$_['error_email']           = 'E-Mail 帳號無效!';
$_['error_exists_email']    = '警告: E-Mail 帳號已經註冊過!';

原來就用『陣列』文字檔,就可以解決多語系問題,那麼簡單啊!

原理簡單-但你有沒有想過,為什麼?OPENCART要用這種文字檔格式,然後這種格式的文字檔,有沒有辦法直接拿去給Google翻譯系統翻譯呢?

答案是可以的-透過我寫的程式就辦的到。

本人最近在開發一支程式,就是自動把檔案丟給Google翻譯系統,很多人都知道有Google Cloud Translation 翻譯API,但一般人只會手工複製貼上或全網站翻譯,進階應用一般工程師都沒做過,我現在有100個檔案目錄分散成好幾個,翻譯完之後我要照原來的目錄結構建好,講到這你應該也不覺得這會很難,沒錯,難的地方到你串Google Cloud Translation 翻譯API後才會發現,我要翻譯的語句有幾萬行,難道我要發送一萬次的請求?

於是,想法1 :
我把幾千行拼成一篇文章發出去,這樣1萬行也只要發送10次請求就行了...但事與願違翻譯完之後,字全部連在一起...

於是,我嘗試第2個方法--
我們看到官方說明中的這一頁https://cloud.google.com/translate/docs/translating-text?hl=zh-tw 他說你要翻2句就這樣{
'q': 'Hello world',
'q': 'My name is Jeff',
'target': 'de'
}挖賽------這可嚇到我了--因為我從來不知道GET送值KEY名稱可以重複,立刻大膽的試了一下,真的可以寫&q=fuck&q=My name is Jeff是成立的,這跟我所知的常識不符。

於是我在自己的主機寫一個接收測試$_GET.!!!!!!我自己的主機不行啊.........好了!過程講再多你..........你不知成功之後的利益的話,相信你一定會不想把文章看完...開發過程講到這,我先講講利益.....

開發成功之後可以幹嘛?各位知道全世界最大的2大模板網站,上面賣的模板和插件都是英文的,各位沒看過台灣有任何賣模板賣插件的網站對吧。

而我就是想開 模板 和擴充插件市場,那好歹 從外國弄來模板和插件之後,要在地化,要中文化吧!

難道這事情要手工做,我手工做了幾次,平均一套要中文化一周以上。

又假設我開發好一個擴充插件是只有中文的,我為了賣給其他國家使用,那我就得要翻譯成6國語言,如果光靠人力去翻譯的話,我東西沒賣出去就先賠本了。

再假設我開商城,我已經知道使用OPENCART這套購物車系統,可以使用多國語言版,不過光是一件商品說明如果要使用6國語言,那麼你就得手工打6次。

反正用途很多, 我目前已經寫好一點點程式 也放上github

https://github.com/suffixbig/PHP-GoogleTranslate/


上一篇
第4天-WordPress Captcha外掛遭爆有後門,我們來談OC系統有無後門
下一篇
第6天-介紹一個OPENCART必裝的擴充模組-之1
系列文
一天介紹1個,開源購物車系統OPENCART的擴充插件33

1 則留言

1
cancelpc
iT邦新手 4 級 ‧ 2018-04-16 15:39:18

Url 參數 key 重複,傳回型態就是陣列。
跟 checkbox 複選是一樣的。
q["aaaa", "bbbb"]

我要留言

立即登入留言