diff --git a/base_default_lang_translate/README.rst b/base_default_lang_translate/README.rst new file mode 100644 index 00000000..38929e87 --- /dev/null +++ b/base_default_lang_translate/README.rst @@ -0,0 +1,35 @@ +**This file is going to be generated by oca-gen-addon-readme.** + +*Manual changes will be overwritten.* + +Please provide content in the ``readme`` directory: + +* **DESCRIPTION.rst** (required) +* INSTALL.rst (optional) +* CONFIGURE.rst (optional) +* **USAGE.rst** (optional, highly recommended) +* DEVELOP.rst (optional) +* ROADMAP.rst (optional) +* HISTORY.rst (optional, recommended) +* **CONTRIBUTORS.rst** (optional, highly recommended) +* CREDITS.rst (optional) + +Content of this README will also be drawn from the addon manifest, +from keys such as name, authors, maintainers, development_status, +and license. + +A good, one sentence summary in the manifest is also highly recommended. + + +Automatic changelog generation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`HISTORY.rst` can be auto generated using `towncrier `_. + +Just put towncrier compatible changelog fragments into `readme/newsfragments` +and the changelog file will be automatically generated and updated when a new fragment is added. + +Please refer to `towncrier` documentation to know more. + +NOTE: the changelog will be automatically generated when using `/ocabot merge $option`. +If you need to run it manually, refer to `OCA/maintainer-tools README `_. diff --git a/base_default_lang_translate/__init__.py b/base_default_lang_translate/__init__.py new file mode 100644 index 00000000..5268169b --- /dev/null +++ b/base_default_lang_translate/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from . import models diff --git a/base_default_lang_translate/__manifest__.py b/base_default_lang_translate/__manifest__.py new file mode 100644 index 00000000..7b9c9b6d --- /dev/null +++ b/base_default_lang_translate/__manifest__.py @@ -0,0 +1,22 @@ +{ + "name": "Default Language Translation", + "summary": """ + This modules allows to select a default language + which is used for source terms in translations + """, + "version": "12.0.1.0.0", + "development_status": "Beta", + "category": "Uncategorized", + "website": "https://github.com/OCA/server-backend", + "author": "Le Filament, Mariano Ruiz, Odoo Community Association (OCA)", + "maintainers": ["remi-filament"], + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "base", + ], + "data": [ + "views/res_lang_views.xml", + ], +} diff --git a/base_default_lang_translate/i18n/base_default_lang_translate.pot b/base_default_lang_translate/i18n/base_default_lang_translate.pot new file mode 100644 index 00000000..fe048d44 --- /dev/null +++ b/base_default_lang_translate/i18n/base_default_lang_translate.pot @@ -0,0 +1,38 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_default_lang_translate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-08 08:47+0000\n" +"PO-Revision-Date: 2021-09-08 08:47+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_default_lang_translate +#: code:addons/base_default_lang_translate/models/res_lang.py:16 +#, python-format +msgid "Another language is already set by default" +msgstr "" + +#. module: base_default_lang_translate +#: model:ir.model,name:base_default_lang_translate.model_base +msgid "Base" +msgstr "" + +#. module: base_default_lang_translate +#: model:ir.model.fields,field_description:base_default_lang_translate.field_res_lang__is_default_lang +msgid "Default Language" +msgstr "" + +#. module: base_default_lang_translate +#: model:ir.model,name:base_default_lang_translate.model_res_lang +msgid "Languages" +msgstr "" + diff --git a/base_default_lang_translate/i18n/fr.po b/base_default_lang_translate/i18n/fr.po new file mode 100644 index 00000000..0799e4fd --- /dev/null +++ b/base_default_lang_translate/i18n/fr.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_default_lang_translate +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-08 08:47+0000\n" +"PO-Revision-Date: 2021-09-08 08:47+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_default_lang_translate +#: code:addons/base_default_lang_translate/models/res_lang.py:16 +#, python-format +msgid "Another language is already set by default" +msgstr "Une autre langue est déjà sélectionnée par défaut" + +#. module: base_default_lang_translate +#: model:ir.model,name:base_default_lang_translate.model_base +msgid "Base" +msgstr "" + +#. module: base_default_lang_translate +#: model:ir.model.fields,field_description:base_default_lang_translate.field_res_lang__is_default_lang +msgid "Default Language" +msgstr "Langue par défaut" + +#. module: base_default_lang_translate +#: model:ir.model,name:base_default_lang_translate.model_res_lang +msgid "Languages" +msgstr "Langues" diff --git a/base_default_lang_translate/models/__init__.py b/base_default_lang_translate/models/__init__.py new file mode 100644 index 00000000..83de9026 --- /dev/null +++ b/base_default_lang_translate/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from . import base +from . import res_lang diff --git a/base_default_lang_translate/models/base.py b/base_default_lang_translate/models/base.py new file mode 100644 index 00000000..bd546638 --- /dev/null +++ b/base_default_lang_translate/models/base.py @@ -0,0 +1,83 @@ +# Copyright 2021 Le Filament (https://le-filament.com) +# Copyright (C) 2004-2009 Tiny SPRL (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import api, models + + +class Base(models.AbstractModel): + _inherit = "base" + + @api.multi + def write(self, vals): + """ + This part of code comes from + https://bazaar.launchpad.net/~eoc/openobject-server/ + + 6.1-overwrite_changes_translatable_fields/revision/4377 + + When the main language in the company is not English, you cannot change + the value of a translatable field in the table if you not switch the + client interface to 'en_US', because the new value will be written + to ir_translation table instead of the table model. + + This complicates usability, and the default language for "model" values + hardcoded as 'en_US' should be configurable + (see https://bugs.launchpad.net/openobject-server/+bug/400256). + + With this patch, all changes made in selected default language will be + written in 'en_US' too (in the table model) if : + - vals are modified (it is later checked if vals are on + translatable fields) + - more than one language is installed + - default language is set + - current language = default language and not 'en_US' + Also, translations in the other languages are changed to to_translate + + """ + result = super().write(vals) + current_language = self.env.context.get("lang") + default_language = ( + self.env["res.lang"].search( + [("is_default_lang", "=", True), ("translatable", "=", True)], limit=1 + ) + or False + ) + if ( + vals + and len(self.env["res.lang"].get_installed()) > 1 + and default_language + and current_language == default_language.code + and current_language != "en_US" + ): + vals_en = {} + for field in vals: + if field in self._fields and self._fields[field].translate: + vals_en[field] = vals[field] + self._update_trans_status( + self._name, field, omit_langs=[default_language.code] + ) + if vals_en: + super().with_context(lang="en_US").write(vals_en) + return result + + def _update_trans_status( + self, model, field, omit_langs=None, status="to_translate" + ): + """ + This function updates translations for this model / field / record (self) + for all langs except omit_langs + setting the state to status + """ + langs = [code for code, _ in self.env["res.lang"].get_installed()] + Translation = self.env["ir.translation"] + translations = Translation.search( + [ + ("type", "in", ("model", "model_terms")), + ("name", "=", "%s,%s" % (model, field)), + ("res_id", "=", self.id), + ("lang", "in", langs), + ("lang", "not in", omit_langs), + ] + ) + for translation in translations: + translation.state = status diff --git a/base_default_lang_translate/models/res_lang.py b/base_default_lang_translate/models/res_lang.py new file mode 100644 index 00000000..085e14fb --- /dev/null +++ b/base_default_lang_translate/models/res_lang.py @@ -0,0 +1,16 @@ +# Copyright 2021 Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ResLang(models.Model): + _inherit = "res.lang" + + is_default_lang = fields.Boolean("Default Language", default=False) + + @api.constrains("is_default_lang") + def _check_default(self): + if self.search_count([("is_default_lang", "=", True)]) > 1: + raise ValidationError(_("Another language is already set by default")) diff --git a/base_default_lang_translate/readme/CONFIGURE.rst b/base_default_lang_translate/readme/CONFIGURE.rst new file mode 100644 index 00000000..9a28f038 --- /dev/null +++ b/base_default_lang_translate/readme/CONFIGURE.rst @@ -0,0 +1,9 @@ + +To configure this module, you need to: + +#. Go to Settings > Translations > Languages +#. Select the language you want to use as default (enter form view) +#. Edit, tick "By default", Save + +Note: only one language can be set as default. +Should you want to change your default language, you would have to first untick previous one. diff --git a/base_default_lang_translate/readme/CONTRIBUTORS.rst b/base_default_lang_translate/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..21060423 --- /dev/null +++ b/base_default_lang_translate/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Rémi - Le Filament (https://le-filament.com) +* Mariano Ruiz diff --git a/base_default_lang_translate/readme/DESCRIPTION.rst b/base_default_lang_translate/readme/DESCRIPTION.rst new file mode 100644 index 00000000..d578fefb --- /dev/null +++ b/base_default_lang_translate/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +This modules allows to select a default language which is used for source terms in translations. +Any update done with this default_language will be taken as source in translations +and written in object directly. +Also when updating a translatable term, all existing translations (but default language) will be set to to_translate + +This module is useless in case your main language is en_US or in case you have only 1 language installed +(in thoses cases, Odoo performs correctly). diff --git a/base_default_lang_translate/readme/USAGE.rst b/base_default_lang_translate/readme/USAGE.rst new file mode 100644 index 00000000..1bfc6250 --- /dev/null +++ b/base_default_lang_translate/readme/USAGE.rst @@ -0,0 +1,4 @@ +To use this module, you need to: + +#. Go to any model with translatable fields (e.g. product, survey, etc.) +#. Update a translatable field and Save, source term and object field in database will be set with your new value diff --git a/base_default_lang_translate/static/description/icon.png b/base_default_lang_translate/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/base_default_lang_translate/static/description/icon.png differ diff --git a/base_default_lang_translate/static/description/icon.svg b/base_default_lang_translate/static/description/icon.svg new file mode 100644 index 00000000..a7a26d09 --- /dev/null +++ b/base_default_lang_translate/static/description/icon.svg @@ -0,0 +1,79 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/base_default_lang_translate/views/res_lang_views.xml b/base_default_lang_translate/views/res_lang_views.xml new file mode 100644 index 00000000..ff26cf04 --- /dev/null +++ b/base_default_lang_translate/views/res_lang_views.xml @@ -0,0 +1,28 @@ + + + + + + res.lang.default.form + res.lang + + + + + + + + + + res.lang.default.tree + res.lang + + + + + + + + + +