Campos multi-idioma en OpenERP

Llevo una temporada conectándome al canal de IRC de OpenERP (irc://irc.freenode.net/#openobject), es interesante porque siempre hay dudas nuevas para el que esté aprendiendo a programar en OpenERP, puedes ver como otros programadores solucionan los mismos problemas que tu has tenido… y además practicar inglés.

Hace un par de días un programador compartió un problema que tenía en el chat, si tienes un campo al que quieres añadir un sufijo que tienes en otro campo, y los dos campos están definidos como traducibles… ¿ como puedes hacer para combinar los dos campos en todos los idiomas disponibles?

Lo primero que tenemos que saber es que cuando llamamos a uno de los métodos del orm en el context le estamos pasando la información del idioma.

Por otro lado tenemos que tener en cuenta que los idiomas disponibles en nuestra instancia de OpenERP se encuentran en ‘res.lang’.

Así cuando hacemos una operación sobre un campo que tiene habilitada la traducción si le pasamos en el context la información del idioma sólo realizará la operación sobre ese idioma, y si no pasamos la información del idioma realizará la operación sobre el primer idioma (por defecto en_US).

Para hacer una operación sobre todos los idiomas en un campo, tendremos que realizar esa operación tantas veces como idiomas tengamos disponibles en ‘res.lang’, pasando en cada iteración el idioma en el context para realizar la operación.

En el siguiente código de ejemplo lo que hago es cambiar el nombre de un producto por nombre-nombre en todos los idiomas, por ejemplo en mi instalación de OpenERP tengo un producto con el nombre en español ‘prueba’ y en inglés ‘test’, después de pasar este código cambia el nombre en español por ‘prueba-prueba’ y en inglés ‘test-test’.


lang_obj = self.pool.get('res.lang')
user_obj = self.pool.get('res.user')
product_obj = self.pool.get('product.obj')

if context is None:
context = {}

# obtengo el idioma del context
previous_lang = context.get('lang')

# recorro todos los idiomas
lang_ids = lang_obj.search(cr, uid,[])
for lang in lang_obj.browse(cr,uid,lang_ids):

# guardo el idioma en el context
context['lang'] = lang.code

# obtengo en producto, pasando el nuevo context para que me devuelva en nombre en el idioma pasado
for product in product_obj.browse(cr,uid,ids, context):
# escribo el producto con los cambios, pasando el nuevo context para que escriba el nombre en el idioma pasado
product_obj.write(cr, uid, product.id, {'name':product.name+'-'+product.name}, context)

context['lang'] = previous_lang

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *