本文主要介紹了odoo國際化翻譯使用的方法及示例
國際化翻譯方法
每個模塊的翻譯文件放在該模塊目錄下i18n目錄里。模塊內相關字符串一般用英語寫成,然后通過翻譯模板導出功能(Settings ‣ Translations ‣ Import/Export ‣ Export Translation)導出一個翻譯模板pot文件。翻譯人員使用翻譯軟件(poedit)進行翻譯后,產生對應語言po文件,再放入i18n目錄下供odoo加載。po文件的文件名規則一般由對應語言縮寫或語言_國家組成,如中文為zh.po或zh_CN.po
目錄結構例
|- idea/ # The module directory
|- i18n/ # Translation files
| - idea.pot # Translation Template (exported from Odoo)
| - fr.po # French translation
| - pt_BR.po # Brazilian Portuguese translation
| (...)
翻譯生成規則odoo默認對xml里的lable或py文件field里的string生成翻譯或通過odoo._()函數, 即gettext函數生成翻譯項。
翻譯示例
為odoogoedu翻譯中文
1 創建目錄odoogoedu/i18n/
2 加載中文語言 ( Administration ‣ Translations ‣ Load an Official Translation) 添加中文(后續更新請勾選覆蓋術語)
3 同步翻譯術語 (Administration ‣ Translations ‣ Application Terms ‣ Synchronize Translations)選擇中文生成對應的翻譯條目,供導出使用(同時更新導出pot和po數據)(注意,如果只是改了模塊中的翻譯字符串,不需要更新模塊,在這里同步即可,py文件需要重啟)
4 導出模塊翻譯模板 ( Administration ‣ Translations -> Import/Export ‣ Export Translation) 選擇空語言,模板
5 導出中文翻譯文件 ( Administration ‣ Translations ‣ Import/Export ‣ Export Translation) 每次導出前先同步一下翻譯術語
6 翻譯po文件
7 在model.py中使用_() 函數包裹需要翻譯的字符串重復2-6生成新的翻譯段
odoo12中Synchronize Translations變為Generate Missing Terms,可以直接導出中文模板在poedit里翻譯
odoogoedu/models.py
# -*- coding: utf-8 -*-
from datetime import timedelta
from odoo import models, fields, api, exceptions, _
class Course(models.Model):
_name = 'odoogoedu.course'
default = dict(default or {})
copied_count = self.search_count(
[('name', '=like', _(u"Copy of {}%").format(self.name))])
if not copied_count:
new_name = _(u"Copy of {}").format(self.name)
else:
new_name = _(u"Copy of {} ({})").format(self.name, copied_count)
default['name'] = new_name
return super(Course, self).copy(default)
if self.seats < 0:
return {
'warning': {
'title': _("Incorrect 'seats' value"),
'message': _("The number of available seats may not be negative"),
},
}
if self.seats < len(self.attendee_ids):
return {
'warning': {
'title': _("Too many attendees"),
'message': _("Increase seats or remove excess attendees"),
},
}
def _check_instructor_not_in_attendees(self):
for r in self:
if r.instructor_id and r.instructor_id in r.attendee_ids:
raise exceptions.ValidationError(_("A session's instructor can't be an attendee"))
補充說明
i18n(其來源是英文單詞 internationalization的首末字符i和n,18為中間的字符數)是“國際化”的簡稱。
翻譯軟件 https://poedit.net/
odoo官方模塊翻譯協作網站 https://www.transifex.com/odoo/public/
gettext簡介: GNU gettext是翻譯項目的重要一步,它提供了一個工作框架,由一些集成的工具和文檔組成,幫助程序員、翻譯人員和最終用戶實現程序的國際化和本地化。用 Gettext的方式實現多語言得到了廣泛的支持,著名的博客程序wordpress的國際化就是用的GNU gettext。大致原理: GNU gettext使用PO或MO文件來實現國際化和本地化。PO的意思是Portable Object,是一種文本結構,可以方便的由人們閱讀和修改。MO是Machine Object的簡寫,MO文件是PO文件的二進制形態。一般來說,一個PO或MO文件對應於一種語言,如果一個程序要支持多種語言,每一種語言都需要自己 的PO或MO文件。
如何獲得最好Odoo二次開發服務?星輝信息科技,專業Odoo二次開發公司
