Internacionalización
Cada módulo puede proporcionar a sus propias traducciones en el directorio i18n, por tener archivos con el nombre Cada módulo puede proporcionar a sus propias traducciones en el directorio i18n, por tener archivos con el nombre LANG.po donde idioma es el código de región para el idioma o el idioma y el país combinación cuando difieren (por LANG.po donde idioma es el código de región para el idioma o el idioma y el país combinación cuando difieren (por ejemplo pt.po o pt_BR.po).
ejemplo pt.po o pt_BR.po). Las traducciones serán cargados automLas traducciones serán cargados autom áticamente por Odoo para todáticamente por Odoo para tod os los idiomasos los idiomas habilitados. Los desarrolladores utilizan siempre Inglés al crear un módulo, a continuación, exportar los términos del habilitados. Los desarrolladores utilizan siempre Inglés al crear un módulo, a continuación, exportar los términos del módulo utilizando característica de exportación gettext POT de Odoo (
módulo utilizando característica de exportación gettext POT de Odoo ( Ajustes Ajustes Las Las traducciones traducciones Importar //Importar Exportar
Exportar exportación exportación de de traduccióntraducción sin especificar un idioma), para crear el archivo POT plantilla de módulo, y sin especificar un idioma), para crear el archivo POT plantilla de módulo, y luego se derivan del traducidos archivos PO. Muchos de IDE tienen plugins o modos de edición y combinación de luego se derivan del traducidos archivos PO. Muchos de IDE tienen plugins o modos de edición y combinación de archivos / PO POT.
archivos / PO POT.
Tip Tip
Los archivos generados por objeto portátil Odoo se publican en
Los archivos generados por objeto portátil Odoo se publican en TransifexTransifex, por lo que es fácil de traducir el software., por lo que es fácil de traducir el software.
|- idea/ # The module directory |- idea/ # The module directory |- i18n/ # Translation files |- i18n/ # Translation files
| -
| - idea.pot # Translation Template (exported from Odoo)idea.pot # Translation Template (exported from Odoo) | - fr.po #
| - fr.po # French translationFrench translation | -
| - pt_BR.po # Brazilian Portuguese translationpt_BR.po # Brazilian Portuguese translation | (...)
Tip
Tip
Por defecto exportación POT de Odoo sólo extrae las etiquetas dentro de archivos XML o definiciones de campo en Por defecto exportación POT de Odoo sólo extrae las etiquetas dentro de archivos XML o definiciones de campo en el interior en el código Python, pero cualquier cadena de Python se puede traducir de esta manera por lo rodea con el interior en el código Python, pero cualquier cadena de Python se puede traducir de esta manera por lo rodea con la función
la funciónodoo._()odoo._() (por ejemplo (por ejemplo _("Label")_("Label")))
Ejercicio
Ejercicio
Traducir un módulo Traducir un módulo
Elegir un segundo idioma para la instalación de Odoo. Traducir el módulo utilizando las facilidades proporcionadas Elegir un segundo idioma para la instalación de Odoo. Traducir el módulo utilizando las facilidades proporcionadas por Odoo.
por Odoo. 1.
1. Crear Crear un un directoriodirectorio openacademy/i18n/openacademy/i18n/
2.
2. Instalar Instalar el el idioma idioma que que desee desee (( AdministracióAdministración n Las Las traducciones traducciones cargar cargar una una traducción traducción oficialoficial ) ) 3.
3. Sincronizar Sincronizar los los términos trtérminos traducibles aducibles (( Administración Administración Traducciones Traducciones Términos Términos de de AplicacionesAplicaciones Sincronizar Traducciones
Sincronizar Traducciones ) ) 4.
4. Crear una Crear una plantilla de plantilla de archivo de archivo de traducción mediante traducción mediante la exportación la exportación (( AdministracióAdministración n Traducciones Traducciones ->-> Importar
Importar / / Exportar Exportar exportación exportación traduccióntraducción ) sin especificar un idioma, salvo en ) sin especificar un idioma, salvo en openacademy/i18n/openacademy/i18n/
5.
5. Crear un Crear un archivo de archivo de traducción mediante traducción mediante la exportación la exportación (( Las Las traducciones traducciones Importar Importar / / ExportarExportar exportación Traducción Administración
exportación Traducción Administración ) ) y y la la especificación especificación de de un un idioma. idioma. GuardarloGuardarlo en
enopenacademy/i18n/openacademy/i18n/
6.
6. Abra el archivo Abra el archivo de traducción exportado de traducción exportado (con un editor (con un editor de texto de texto básico o un básico o un dedicado PO-editor de archivosdedicado PO-editor de archivos por ejemplo
por ejemplo PoeditPoedity traducir los términos que faltany traducir los términos que faltan 7. En
7. Enmodels.pymodels.py, añadir una instrucción de importación para la función, añadir una instrucción de importación para la función odoo._ odoo._ y marcar las cadenas faltantesy marcar las cadenas faltantes como traducible
como traducible 8.
8. Repita Repita los los pasos pasos 3-63-6
openacademy/models.py
openacademy/models.py
# -*- coding: utf-8 -*-# -*- coding: utf-8 -*-
from
from datetimedatetime importimport timedeltatimedelta from
from odooodoo importimport models,models, fields,fields, api,api, exceptions,exceptions, __ class
class CourseCourse(models(models..Model):Model): _name
_name == 'openacademy.course''openacademy.course'
default
default == dict(defaultdict(default oror {}){}) copied_count
copied_count == selfself..search_count(search_count( [(
[('name''name',, '=like''=like',, _(_(u"Copy of {}%"u"Copy of {}%"))..format(selfformat(self..name))])name))]) if
if notnot copied_count:copied_count: new_name
new_name == _(_(u"Copy of {}"u"Copy of {}"))..format(selfformat(self..name)name) else
else::
new_name
new_name == _(_(u"Copy of {} ({})"u"Copy of {} ({})"))..format(selfformat(self..name,name, copied_count)copied_count) default[
default['name''name']] == new_namenew_name return
return super(Course,super(Course, self)self)..copy(default)copy(default) if
if selfself..seatsseats << 00:: return
return {{ 'warning'
'warning':: {{ 'title'
'title':: _(_("Incorrect 'seats' value""Incorrect 'seats' value"),), 'message'
'message':: _(_("The number of available seats may not be negative""The number of available seats may not be negative"),), },
}, } } if
if selfself..seatsseats << len(selflen(self..attendee_ids):attendee_ids): return
return {{ 'warning'
'warning':: {{ 'title'
'title':: _(_("Too many attendees""Too many attendees"),), 'message'
'message':: _(_("Increase seats or remove excess attendees""Increase seats or remove excess attendees"),), },
}, } } def
def _check_instructor_not_in_attendees_check_instructor_not_in_attendees (self):(self): for
for rr inin self:self: if
if rr..instructor_idinstructor_id andand rr..instructor_idinstructor_id inin rr..attendee_ids:attendee_ids: raise