mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-18 13:32:01 +02:00
46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
# Copyright 2023 ACSONE SA/NV
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
|
|
from collections import defaultdict
|
|
|
|
from accept_language import parse_accept_language
|
|
|
|
from odoo import api, models, tools
|
|
|
|
|
|
class ResLang(models.Model):
|
|
_inherit = "res.lang"
|
|
|
|
@api.model
|
|
@tools.ormcache("accept_language")
|
|
def _get_lang_from_accept_language(self, accept_language):
|
|
"""Get the language from the Accept-Language header.
|
|
|
|
:param accept_language: The Accept-Language header.
|
|
:return: The language code.
|
|
"""
|
|
if not accept_language:
|
|
return
|
|
parsed_accepted_langs = parse_accept_language(accept_language)
|
|
installed_locale_langs = set()
|
|
installed_locale_by_lang = defaultdict(list)
|
|
for lang_code, _name in self.get_installed():
|
|
installed_locale_langs.add(lang_code)
|
|
installed_locale_by_lang[lang_code.split("_")[0]].append(lang_code)
|
|
|
|
# parsed_acccepted_langs is sorted by priority (higher first)
|
|
for lang in parsed_accepted_langs:
|
|
# we first check if a locale (en_GB) is available into the list of
|
|
# available locales into Odoo
|
|
locale = None
|
|
if lang.locale in installed_locale_langs:
|
|
locale = lang.locale
|
|
# if no locale language is installed, we look for an available
|
|
# locale for the given language (en). We return the first one
|
|
# found for this language.
|
|
else:
|
|
locales = installed_locale_by_lang.get(lang.language)
|
|
if locales:
|
|
locale = locales[0]
|
|
if locale:
|
|
return locale
|