顯示具有 zh-Hant 標籤的文章。 顯示所有文章
顯示具有 zh-Hant 標籤的文章。 顯示所有文章

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 範例教學




2019年4月13日 星期六

Django專案初始設定


之前提到建立一個Django專案,

系統會在專案中建立數個檔案,

其檔案結構如下


/project
          |_______ manage.py
          |_______ /project
                                              |_______     _init_.py
                                               |_______     settings.py
                                               |_______     urls.py
                                              |_______     wsgi.py


由於IDE會自動幫忙產生所需要的檔案,

換成指令新建專案的話,

則是打

django-admin   startproject    project_name

來建立一個新專案,


# Internationalization# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'zh-TW'
TIME_ZONE = 'Asia/Taipei'

設定語言"zh-TW"可能會遇到錯誤如下



這時由於Django   1.7之後,

關於語言設定有更動,



繁體中文的話使用

zh-Hant

簡體中文使用

zh-Hans






建立專案之後,

就要根據設計的網站架構開始新增各元件,

這些元件簡稱為app,

每個專案可以有一個或多個app組成,

故這些app是可以套用到其他專案去使用的,

新增元件的指令也很簡單

python   manage.py    startapp    appname

建立成功會在專案資料夾中產生目錄名稱為appname的資料夾,

預設檔案也自動放置在其中





通常相同類型的資料都是放置在同一個資料夾的,

例如

templates   資料夾放置了網站所需的網頁樣板
static   資料夾通常放置css   ,   js   ,圖檔等等

建立的方法也很簡單

md   static

這些資料夾與上述的app通常是在同一層資料夾中




Django使用資料庫通常會將建立資料表的架構與版本記錄下來放置在migrations資料夾中

在修改code的時候,

如果有更動的資料庫的話,

就必須執行

python   manage.py   makemigrations

來重新產生migration資料檔

再透過

python    manage.py   migrate

根據上述的資料檔將其同步到資料庫中,

最後會在專案最上層根據設定產生資料庫檔案,


需要執行這兩個命令時,

多半是兩者都要執行





既然Django是設計網站的框架,

透過

python   manage.py   runserver

可在瀏覽器位址打上      http://127.0.0.1:8000       ,

就能看到目前設計的成果


由於目前沒任何設定,

執行看到的是底下提示畫面