顯示具有 internationalization 標籤的文章。 顯示所有文章
顯示具有 internationalization 標籤的文章。 顯示所有文章

2022年8月16日 星期二

淺談幾種程式語言的 I18N處理

i18n 來自於 internationalization,字母 i n 中間共有18的字母,也就是國際化的意思。

底下列舉幾個程式語言在多國語言處理的原理,

基本上就是要將原始程式碼需要翻譯的字串改成轉換為各國語言的程式碼,

這部份各程式語言大同小異,之前也有介紹過 Django 的i18n處理,

底下就來看看

淺談幾種程式語言的 I18N處理

JAVA部分 (參照原始網址)

尚未有語系相關設定的文字訊息

程式改寫多國語言後為下圖,原始碼分成三部分,最上部根據執行的參數選定要使用的屬性檔,中間部分決定選用的語言,最底下則分別印出該語言的訊息


Python部分 (參照原始網址)

自行加入語言檔案於 locale/zh_Hant/LC_MESSAGES/demo.po

msgid “這是程式字串的id (多半都以英文為基礎)”

msgstr “翻譯的文字放此



修改此 po檔案中的字串資料,再用命令 build.mo檔:

python msgfmt.py -o locale/zh_Hant /LC_MESSAGES/ i18n_demo.mo demo.po

原始碼:


最後使用命令

export LANG=cn && python i18n_demo.py

就可輸出相應語言的文字


C#部分 (參照原始網址)

要將屬性欄的 Localizable 打開,



為各個語言新增資源檔案,例如德文使用' MainForm.de-DE.resx '

需要有 resource manager 來轉換資源檔中的字串:

public class ResourceManager

{

    public static string GetString(string data, CultureInfo cultureInfo)

    {

        return CommonResource.ResourceManager.GetString(data, cultureInfo);

    }

}

再透過 resource manager 提供的方法將 Label的顯示文字改為目前的語言:

myDisplayLabel.Text = string.Format("{0}", ResourceManager.GetString(FIXED_TEXT, CultureInfo.CurrentUICulture));

結論

以上就是幾個程式語言關於 I18N的處理方式,

基本上大家的方式都差不多相對的只是做法上些許的差異,

當然這些例子僅是淺談下原理而已,

實作部分得看各個專案的情況不同複雜度也相對不同,

此處僅是讓大家對多國語言的處理有個基礎認識

2021年1月10日 星期日

Django 多語言 i18n 範例教學

Django是一個開放原始碼的Web應用框架,

同時也支援多語言 i18n 的使用,

這就是今天的主題

Django 多語言 i18n 範例教學

i18n 是什麼?

其實這個名字來自於 internationalization

字母 i 與 n 中間共有18的字母

也就是國際化的意思。

要在 Django 使用 i18n 需要經過幾個步驟,

要使用翻譯的字詞同樣也需要相應的 TAG 或語法。

此處使用 Django 2.2 版本作為範例,

不同版本的 Django 各有差異需要特別注意。

首先要到 settings 確認下列這些設定值是否正確
  • LANGUAGE_CODE = 'zh-Hant'
  • USE_I18N = True
  • USE_L10N = True
  • LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]
  • USE_TZ = True


接著找到 MIDDLEWARE 在 session 與 common 中間新增一行:

'django.middleware.locale.LocaleMiddleware',

如果要在 template 使用 i18n的話需要在 TEMPLATES 的 context_processors 新增

'django.template.context_processors.i18n',


如果需要限定支援的語言的話可新增

_ = lambda s: s
LANGUAGES = (
    ('en', ('English')),
    ('zh-hant', _('Traditional Chinese')),
)

最後就能夠到 console 以命令

python manage.py makemessages -l [語言]

來新增,

它會在上述的 LOCALE_PATHS 中新增該語言,

前往該語言的資料夾找到附檔名為 PO 的文件,

在 msgstr 新增或修改該字詞的翻譯,

最後再執行

python manage.py compilemessages -l zh_Hant 

即可完成翻譯。



此處以資料庫的說明文字作為範例,


執行結果如下,

ugettext_lazy()的字串會隨著語言的切換而改變,在 models, forms, model forms 中均使用此方法
ugettext()的字串只會隨著 settings 中的 LANGUAGE_CODE 而改變


i18n_patterns 提供了在 url 快速切換語言的方法,

需要在 urls.py 中加上 

from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns

urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
    path('admin/', admin.site.urls),
]

urlpatterns += i18n_patterns(
    path('', home, name='home'),
)

將需要快速切換的 url 放在 i18n_patterns 中,

就能讓使用者直接由 url 切換語言。

在 templates 使用 i18n 同樣是支援的,

只要該網頁有使用 i18n 就必須加上

{% load i18n %}

並且以

{% trans "target string" %}和{% blocktrans %} {% endblocktrans %}

這兩個 TAG 來定義要翻譯的文字

也能夠以 TAG 

{% language 'en' %}{% endlanguage %}

直接切換語言,

或者使用TAG

{% get_current_language as LANGUAGE_CODE %}

來取得目前使用的語言



其他尚有許多不同的應用,

就需要時間打磨了,

這就是今天的主題

Django 多語言 i18n 範例教學