From bd95f542addb4b1abb121bf5c38c2eafce336343 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 11 Aug 2011 18:39:33 +0200 Subject: [PATCH 1/7] [imp] setup i18n bzr revid: nicolas.vanhoren@openerp.com-20110811163933-lcs6zv2e3kn8b09j --- addons/base/controllers/main.py | 16 +++++++++++++ addons/base/po/base.pot | 23 ++++++++++++++++++ addons/base/po/fr.po | 23 ++++++++++++++++++ babel.cfg | 13 +++++++++++ gen_translations.sh | 41 +++++++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+) create mode 100644 addons/base/po/base.pot create mode 100644 addons/base/po/fr.po create mode 100644 babel.cfg create mode 100755 gen_translations.sh diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index aaf89853cad..155c50a449a 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -18,6 +18,7 @@ import openerpweb import openerpweb.ast import openerpweb.nonliterals +from babel.messages.pofile import read_po # Should move to openerpweb.Xml2Json class Xml2Json: @@ -156,6 +157,21 @@ class WebClient(openerpweb.Controller): 'css': css } return r + + @openerpweb.jsonrequest + def translations(self, addon_name, lang): + f_name = os.path.join(openerpweb.path_addons, addon_name, "po", lang + ".po") + with open(f_name) as t_file: + po = read_po(t_file) + + transl = {"messages":[]} + + for x in po: + if x.id: + transl["messages"].append({'id': x.id, 'string': x.string}) + + return transl + class Database(openerpweb.Controller): _cp_path = "/base/database" diff --git a/addons/base/po/base.pot b/addons/base/po/base.pot new file mode 100644 index 00000000000..1609924cac3 --- /dev/null +++ b/addons/base/po/base.pot @@ -0,0 +1,23 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2011. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2011-08-09 17:30+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: addons/base/static/src/js/core.js:11 +msgid "I am a sweet chicken." +msgstr "" + diff --git a/addons/base/po/fr.po b/addons/base/po/fr.po new file mode 100644 index 00000000000..c1483c0e9ca --- /dev/null +++ b/addons/base/po/fr.po @@ -0,0 +1,23 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# niv , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2011-08-09 17:30+0200\n" +"PO-Revision-Date: 2011-08-09 17:31+0200\n" +"Last-Translator: niv \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: addons/base/static/src/js/core.js:11 +msgid "I am a sweet chicken." +msgstr "Je suis un gentil poulet." diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 00000000000..bcfd3572f3e --- /dev/null +++ b/babel.cfg @@ -0,0 +1,13 @@ +## Extraction from Python source files +#[python: **.py] +## Extraction from Genshi HTML and text templates +#[genshi: **/templates/**.html] +#ignore_tags = script,style +#include_attrs = alt title summary +#[genshi: **/templates/**.txt] +#template_class = genshi.template:TextTemplate +#encoding = ISO-8819-15 +## Extraction from JavaScript files +[javascript: **.js] +[javascript: **.xml] + diff --git a/gen_translations.sh b/gen_translations.sh new file mode 100755 index 00000000000..9c3a14e2dcc --- /dev/null +++ b/gen_translations.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +usage() +{ +cat << EOF +usage: $0 -a +usage: $0 DIR OUTPUT_FILE + +OPTIONS: + -a recreate the .pot file for all addons + -h print this message +EOF +exit 0 +} + +do_all= + +while getopts "a" opt +do + case "$opt" in + a) + do_all=true;; + h) + usage;; + \?) + usage;; + esac +done + +shift $((OPTIND-1)) + +if [ -n "$do_all" ] +then + echo "Extracting all the translations" + $0 addons/base/static/src/ addons/base/po/base.pot +elif [ -n "$2" ] +then + pybabel extract -F babel.cfg -o $2 -k _t --no-default-keywords $1 +else + usage +fi From 313dcc6f45f1098326a94fa8bdc19facb205b53f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 11:54:49 +0200 Subject: [PATCH 2/7] [imp] improvements to python-side translations gathering method bzr revid: nicolas.vanhoren@openerp.com-20110812095449-m1u7hwh9583n769t --- addons/base/controllers/main.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 83a1a94e90b..99b8ff49ef4 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -159,18 +159,23 @@ class WebClient(openerpweb.Controller): return r @openerpweb.jsonrequest - def translations(self, addon_name, lang): - f_name = os.path.join(openerpweb.path_addons, addon_name, "po", lang + ".po") - with open(f_name) as t_file: - po = read_po(t_file) - - transl = {"messages":[]} - - for x in po: - if x.id: - transl["messages"].append({'id': x.id, 'string': x.string}) - - return transl + def translations(self, mods, lang): + transs = {} + for addon_name in mods: + transl = {"messages":[]} + transs[addon_name] = transl + f_name = os.path.join(openerpweb.path_addons, addon_name, "po", lang + ".po") + if not os.path.exists(f_name): + continue + try: + with open(f_name) as t_file: + po = read_po(t_file) + except: + continue + for x in po: + if x.id: + transl["messages"].append({'id': x.id, 'string': x.string}) + return transs class Database(openerpweb.Controller): From 64571fa4ab444b899629d57ccfe54e875ddaaf59 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 12:19:52 +0200 Subject: [PATCH 3/7] [imp] refactoring of Session to not inherit Widget anymore bzr revid: nicolas.vanhoren@openerp.com-20110812101952-qw12p8xhdfa3kmzu --- addons/base/static/src/js/boot.js | 1 + addons/base/static/src/js/chrome.js | 2 +- addons/base/static/src/js/core.js | 31 +++++++++++++++++------------ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/addons/base/static/src/js/boot.js b/addons/base/static/src/js/boot.js index 3d1d1e75e7c..2791bf2bc27 100644 --- a/addons/base/static/src/js/boot.js +++ b/addons/base/static/src/js/boot.js @@ -53,6 +53,7 @@ *---------------------------------------------------------*/ openerp.base = function(instance) { + openerp.base._t = function(x) { return x; }; openerp.base.core(instance); openerp.base.formats(instance); openerp.base.chrome(instance); diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 7e7f5ae6ab6..49d2099c948 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -681,7 +681,7 @@ openerp.base.WebClient = openerp.base.Widget.extend({ } this.$element.html(QWeb.render("Interface", params)); - this.session = new openerp.base.Session(this,"oe_errors"); + this.session = new openerp.base.Session(); this.loading = new openerp.base.Loading(this,"oe_loading"); this.crashmanager = new openerp.base.CrashManager(this); this.crashmanager.start(); diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 859c96645a1..7f294775410 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -305,16 +305,8 @@ openerp.base.Registry = openerp.base.Class.extend( /** @lends openerp.base.Regis } }); -/** - * Utility class that any class is allowed to extend to easy common manipulations. - * - * It provides rpc calls, callback on all methods preceded by "on_" or "do_" and a - * logging facility. - */ -openerp.base.SessionAware = openerp.base.Class.extend({ - init: function(session) { - this.session = session; - +openerp.base.CallbackEnabled = openerp.base.Class.extend({ + init: function() { // Transform on_* method into openerp.base.callbacks for (var name in this) { if(typeof(this[name]) == "function") { @@ -325,6 +317,19 @@ openerp.base.SessionAware = openerp.base.Class.extend({ } } } + } +}); + +/** + * Utility class that any class is allowed to extend to easy common manipulations. + * + * It provides rpc calls, callback on all methods preceded by "on_" or "do_" and a + * logging facility. + */ +openerp.base.SessionAware = openerp.base.CallbackEnabled.extend({ + init: function(session) { + this._super(); + this.session = session; }, /** * Performs a JSON-RPC call @@ -611,15 +616,15 @@ openerp.base.OldWidget = openerp.base.Widget.extend({ } }); -openerp.base.Session = openerp.base.Widget.extend( /** @lends openerp.base.Session# */{ +openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.base.Session# */{ /** * @constructs * @param element_id to use for exception reporting * @param server * @param port */ - init: function(parent, element_id, server, port) { - this._super(parent, element_id); + init: function(server, port) { + this._super(); this.server = (server == undefined) ? location.hostname : server; this.port = (port == undefined) ? location.port : port; this.rpc_mode = (server == location.hostname) ? "ajax" : "jsonp"; From eca2d44bba1cc81a4854381beea00a935ee8a1eb Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 17:17:36 +0200 Subject: [PATCH 4/7] [imp] added translation database bzr revid: nicolas.vanhoren@openerp.com-20110812151736-ycx4jejdj0rpep5j --- addons/base/controllers/main.py | 4 +-- addons/base/static/src/js/boot.js | 1 - addons/base/static/src/js/core.js | 55 ++++++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 0379628fa1e..08c1851b85e 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -159,7 +159,7 @@ class WebClient(openerpweb.Controller): return r @openerpweb.jsonrequest - def translations(self, mods, lang): + def translations(self, req, mods, lang): transs = {} for addon_name in mods: transl = {"messages":[]} @@ -175,7 +175,7 @@ class WebClient(openerpweb.Controller): for x in po: if x.id: transl["messages"].append({'id': x.id, 'string': x.string}) - return transs + return {"modules": transs} class Database(openerpweb.Controller): diff --git a/addons/base/static/src/js/boot.js b/addons/base/static/src/js/boot.js index 2791bf2bc27..3d1d1e75e7c 100644 --- a/addons/base/static/src/js/boot.js +++ b/addons/base/static/src/js/boot.js @@ -53,7 +53,6 @@ *---------------------------------------------------------*/ openerp.base = function(instance) { - openerp.base._t = function(x) { return x; }; openerp.base.core(instance); openerp.base.formats(instance); openerp.base.chrome(instance); diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index c8647170ba5..2c1bcb3e76d 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -563,6 +563,38 @@ openerp.base.OldWidget = openerp.base.Widget.extend({ } }); +openerp.base.TranslationDataBase = openerp.base.Class.extend({ + init: function() { + this.db = {}; + }, + set_bundle: function(translation_bundle) { + var self = this; + this.db = {}; + _.each(translation_bundle.modules, function(mod, name) { + var tmp = self.db[name] = {}; + _.each(mod.messages, function(message) { + tmp[message.id] = message.string; + }); + }); + }, + build_translation_function: function(addon_name) { + var self = this; + var fcnt = function(str) { + var tmp = self.get(addon_name, str); + return tmp === undefined ? str : tmp; + } + fcnt.database = this; + return fcnt; + }, + get: function(addon_name, key) { + if (this.db[addon_name] && this.db[addon_name].messages[key]) + this.db[addon_name].message[key]; + return undefined; + } +}); + +openerp.base._t = new openerp.base.TranslationDataBase().build_translation_function(); + openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.base.Session# */{ /** * @constructs @@ -786,15 +818,19 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b var self = this; this.rpc('/base/session/modules', {}, function(result) { self.module_list = result; - var modules = self.module_list.join(','); - if(self.debug || true) { - self.rpc('/base/webclient/csslist', {"mods": modules}, self.do_load_css); - self.rpc('/base/webclient/jslist', {"mods": modules}, self.do_load_js); - } else { - self.do_load_css(["/base/webclient/css?mods="+modules]); - self.do_load_js(["/base/webclient/js?mods="+modules]); - } - openerp._modules_loaded = true; + self.rpc('/base/webclient/translations', {mods: ["base"].concat(result), lang: "fr"}) + .then(function(transs) { + openerp.base._t.database.set_bundle(transs); + var modules = self.module_list.join(','); + if(self.debug || true) { + self.rpc('/base/webclient/csslist', {"mods": modules}, self.do_load_css); + self.rpc('/base/webclient/jslist', {"mods": modules}, self.do_load_js); + } else { + self.do_load_css(["/base/webclient/css?mods="+modules]); + self.do_load_js(["/base/webclient/js?mods="+modules]); + } + openerp._modules_loaded = true; + }); }); }, do_load_css: function (files) { @@ -832,6 +868,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b openerp[mod] = {}; // init module mod if(openerp._openerp[mod] != undefined) { + openerp._openerp[mod]._T = openerp.base._t.database.build_translation_function(mod); openerp._openerp[mod](openerp); this.module_loaded[mod] = true; } From 7342931a847e98d246d95f242a86907733dc8025 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 17:34:15 +0200 Subject: [PATCH 5/7] [imp] removed multi-module functionnality bzr revid: nicolas.vanhoren@openerp.com-20110812153415-2u4irohduvv3yfsm --- addons/base/static/src/js/core.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 2c1bcb3e76d..f4c29617cea 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -570,25 +570,29 @@ openerp.base.TranslationDataBase = openerp.base.Class.extend({ set_bundle: function(translation_bundle) { var self = this; this.db = {}; - _.each(translation_bundle.modules, function(mod, name) { - var tmp = self.db[name] = {}; + var modules = _.keys(translation_bundle.modules); + if (_.include(modules, "base")) { + modules = _.without(modules, "base").concat(["base"]); + } + _.each(modules, function(name) { + var mod = translation_bundle.modules[name]; _.each(mod.messages, function(message) { - tmp[message.id] = message.string; + self.db[message.id] = message.string; }); }); }, - build_translation_function: function(addon_name) { + build_translation_function: function() { var self = this; var fcnt = function(str) { - var tmp = self.get(addon_name, str); + var tmp = self.get(str); return tmp === undefined ? str : tmp; } fcnt.database = this; return fcnt; }, - get: function(addon_name, key) { - if (this.db[addon_name] && this.db[addon_name].messages[key]) - this.db[addon_name].message[key]; + get: function(key) { + if (this.db[key]) + return this.db[key]; return undefined; } }); @@ -868,7 +872,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b openerp[mod] = {}; // init module mod if(openerp._openerp[mod] != undefined) { - openerp._openerp[mod]._T = openerp.base._t.database.build_translation_function(mod); + openerp._openerp[mod]._T = openerp.base._t.database.build_translation_function(); openerp._openerp[mod](openerp); this.module_loaded[mod] = true; } From e63f70d9b02192760417f8d85186c17bb91ff1b9 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 17:49:15 +0200 Subject: [PATCH 6/7] [imp] used the user language bzr revid: nicolas.vanhoren@openerp.com-20110812154915-n7o666qfrc99aas8 --- addons/base/controllers/main.py | 2 ++ addons/base/static/src/js/core.js | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 08c1851b85e..d4d420590ab 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -272,10 +272,12 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def login(self, req, db, login, password): req.session.login(db, login, password) + ctx = req.session.get_context() return { "session_id": req.session_id, "uid": req.session._uid, + "context": ctx } @openerpweb.jsonrequest diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index f4c29617cea..c4609ba3ba7 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -615,6 +615,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.db = ""; this.login = ""; this.password = ""; + this.user_context= {}; this.uid = false; this.session_id = false; this.module_list = []; @@ -741,6 +742,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.rpc("/base/session/login", params, function(result) { self.session_id = result.session_id; self.uid = result.uid; + self.user_context = result.context; self.session_save(); self.on_session_valid(); if (success_callback) @@ -758,6 +760,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.session_id = this.get_cookie('session_id'); this.db = this.get_cookie('db'); this.login = this.get_cookie('login'); + this.user_context = this.get_cookie("user_context"); // we should do an rpc to confirm that this session_id is valid and if it is retrieve the information about db and login // then call on_session_valid this.on_session_valid(); @@ -770,6 +773,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.set_cookie('session_id', this.session_id); this.set_cookie('db', this.db); this.set_cookie('login', this.login); + this.set_cookie('user_context', this.user_context); }, logout: function() { delete this.uid; @@ -822,7 +826,9 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b var self = this; this.rpc('/base/session/modules', {}, function(result) { self.module_list = result; - self.rpc('/base/webclient/translations', {mods: ["base"].concat(result), lang: "fr"}) + self.rpc('/base/webclient/translations',{ + mods: ["base"].concat(result), + lang: self.user_context.lang}) .then(function(transs) { openerp.base._t.database.set_bundle(transs); var modules = self.module_list.join(','); From 6301669581dceedd84683d51c361a5dba785e3a8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 09:54:05 +0200 Subject: [PATCH 7/7] [imp] improvements to TranslationDatabase + small translations in forms bzr revid: nicolas.vanhoren@openerp.com-20110816075405-o46ytaiw5sqkwgjw --- addons/base/po/base.pot | 15 ++++++++++++--- addons/base/po/{fr.po => fr_FR.po} | 16 +++++++++++++--- addons/base/static/src/js/core.js | 18 ++++++++++++------ addons/base/static/src/js/form.js | 10 ++++++---- 4 files changed, 43 insertions(+), 16 deletions(-) rename addons/base/po/{fr.po => fr_FR.po} (60%) diff --git a/addons/base/po/base.pot b/addons/base/po/base.pot index 1609924cac3..84f7ebfe6db 100644 --- a/addons/base/po/base.pot +++ b/addons/base/po/base.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-08-09 17:30+0200\n" +"POT-Creation-Date: 2011-08-16 09:44+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,16 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.4\n" -#: addons/base/static/src/js/core.js:11 -msgid "I am a sweet chicken." +#: addons/base/static/src/js/form.js:1459 +msgid "   Search More..." +msgstr "" + +#: addons/base/static/src/js/form.js:1472 +#, python-format +msgid "   Create \"%s\"" +msgstr "" + +#: addons/base/static/src/js/form.js:1478 +msgid "   Create and Edit..." msgstr "" diff --git a/addons/base/po/fr.po b/addons/base/po/fr_FR.po similarity index 60% rename from addons/base/po/fr.po rename to addons/base/po/fr_FR.po index c1483c0e9ca..08905cac036 100644 --- a/addons/base/po/fr.po +++ b/addons/base/po/fr_FR.po @@ -18,6 +18,16 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: addons/base/static/src/js/core.js:11 -msgid "I am a sweet chicken." -msgstr "Je suis un gentil poulet." +#: addons/base/static/src/js/form.js:1459 +msgid "   Search More..." +msgstr "   Chercher plus..." + +#: addons/base/static/src/js/form.js:1472 +#, python-format +msgid "   Create \"%s\"" +msgstr "   Créer \"%s\"" + +#: addons/base/static/src/js/form.js:1478 +msgid "   Create and Edit..." +msgstr "   Créer et éditer..." + diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index c4609ba3ba7..8efae36863a 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -570,15 +570,20 @@ openerp.base.TranslationDataBase = openerp.base.Class.extend({ set_bundle: function(translation_bundle) { var self = this; this.db = {}; - var modules = _.keys(translation_bundle.modules); + var modules = _.keys(translation_bundle.modules).sort(); if (_.include(modules, "base")) { - modules = _.without(modules, "base").concat(["base"]); + modules = ["base"].concat(_.without(modules, "base")); } _.each(modules, function(name) { - var mod = translation_bundle.modules[name]; - _.each(mod.messages, function(message) { + self.add_module_translation(translation_bundle.modules[name]); + }); + }, + add_module_translation: function(mod) { + var self = this; + _.each(mod.messages, function(message) { + if (self.db[message.id] === undefined) { self.db[message.id] = message.string; - }); + } }); }, build_translation_function: function() { @@ -826,9 +831,10 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b var self = this; this.rpc('/base/session/modules', {}, function(result) { self.module_list = result; + var lang = self.user_context.lang; self.rpc('/base/webclient/translations',{ mods: ["base"].concat(result), - lang: self.user_context.lang}) + lang: lang}) .then(function(transs) { openerp.base._t.database.set_bundle(transs); var modules = self.module_list.join(','); diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 4e7876b1768..6eeff025e1f 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1,4 +1,6 @@ openerp.base.form = function (openerp) { + +var _t = openerp.base._t; openerp.base.views.add('form', 'openerp.base.FormView'); openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormView# */{ @@ -1454,7 +1456,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ // search more... if more results that max if (values.length > self.limit) { values = values.slice(0, self.limit); - values.push({label: "   Search More...", action: function() { + values.push({label: _t("   Search More..."), action: function() { dataset.name_search(search_val, self.build_domain(), 'ilike' , false, function(data) { self._change_int_value(null); @@ -1467,13 +1469,13 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ if (search_val.length > 0 && !_.include(raw_result, search_val) && (!self.value || search_val !== self.value[1])) { - values.push({label: '   Create "' + - $('').text(search_val).html() + '"', action: function() { + values.push({label: _.sprintf(_t('   Create "%s"'), + $('').text(search_val).html()), action: function() { self._quick_create(search_val); }}); } // create... - values.push({label: "   Create and Edit...", action: function() { + values.push({label: _t("   Create and Edit..."), action: function() { self._change_int_value(null); self._search_create_popup("form", undefined, {"default_name": search_val}); }});