65 lines
2.7 KiB
Python
65 lines
2.7 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import models, tools, _
|
|
from odoo.addons.base.models.res_lang import LangDataDict, LangData
|
|
from odoo.exceptions import UserError
|
|
from odoo.http import request
|
|
|
|
|
|
class Lang(models.Model):
|
|
_inherit = "res.lang"
|
|
|
|
def write(self, vals):
|
|
if 'active' in vals and not vals['active']:
|
|
if self.env['website'].search_count([('language_ids', 'in', self._ids)], limit=1):
|
|
raise UserError(_("Cannot deactivate a language that is currently used on a website."))
|
|
return super(Lang, self).write(vals)
|
|
|
|
@tools.ormcache_context(keys=("website_id",))
|
|
def _get_frontend(self) -> LangDataDict:
|
|
""" Return the available languages for current request
|
|
:return: LangDataDict({code: LangData})
|
|
"""
|
|
if request and getattr(request, 'is_frontend', True):
|
|
# get languages while ignoring current language as the one in the context may be invalid
|
|
lang_ids = self.env['website'].get_current_website().with_context(lang=False).language_ids.sorted('name').ids
|
|
langs = [dict(self.env['res.lang']._get_data(id=id_)) for id_ in lang_ids]
|
|
es_419_exists = any(lang['code'] == 'es_419' for lang in langs)
|
|
already_shortened = []
|
|
for lang in langs:
|
|
code = lang['code']
|
|
short_code = code.split('_')[0]
|
|
# Always shorten one language for each group of languages.
|
|
# Special case for spanish, as es_419 is not a valid hreflang
|
|
# and es_419 is actually the new "generic" spanish, when it is
|
|
# in the available languages, it should be the one shortened.
|
|
if (
|
|
short_code not in already_shortened
|
|
and not (
|
|
short_code == 'es'
|
|
and code != 'es_419'
|
|
and es_419_exists
|
|
)
|
|
):
|
|
lang['hreflang'] = short_code
|
|
already_shortened.append(short_code)
|
|
else:
|
|
lang['hreflang'] = code.lower().replace('_', '-')
|
|
return LangDataDict({lang['code']: LangData(lang) for lang in langs})
|
|
|
|
return super()._get_frontend()
|
|
|
|
def action_activate_langs(self):
|
|
"""
|
|
Open wizard to install language(s), so user can select the website(s)
|
|
to translate in that language.
|
|
"""
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': _('Add languages'),
|
|
'view_mode': 'form',
|
|
'res_model': 'base.language.install',
|
|
'views': [[False, 'form']],
|
|
'target': 'new',
|
|
}
|