Newer
Older
##############################################################################
#
# ICU Format, a module for Odoo
# Copyright © 2021, 2022 XCG Consulting (https://xcg-consulting.fr/)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import datetime
import logging
from typing import Dict, Mapping, Union
from icu import ICUError
from odoo import _, models
from ..icu_format import ICUFormatter, _icu_formatter_cache, icu_format, icu_list_format
_logger = logging.getLogger(__name__)
class BaseModel(models.AbstractModel):
"""Add methods to BaseModel to use icu formatting."""
_inherit = "base"
def icu_format_locale_kwargs(self) -> Mapping[str, str]:
"""Hook for some model to inject some information into the locale
kwargs dict"""
return {}
def icu_format(
self,
msg: str,
args: Dict[str, Union[int, str, datetime.date, datetime.datetime, bool, float]],
raise_exception: bool = False,
) -> str:
"""Provide a faster way to format the message, using the context lang,
or the user lang if there is no context.
"""
return icu_format(
self.env.context.get("lang") or self.env.user.lang,
msg,
args,
raise_exception,
locale_kwargs=self.icu_format_locale_kwargs(),
)
def icu_format_translate(
self,
untranslated_message: str,
args: Dict[str, Union[int, str, datetime.date, datetime.datetime, bool, float]],
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
raise_exception: bool = False,
) -> str:
"""Try to format and translate a message.
If the format of the translated message fails, try to format the
original message.
"""
msg = _(untranslated_message)
try:
return icu_format(
self.env.context.get("lang") or self.env.user.lang,
msg,
args,
raise_exception=True,
locale_kwargs=self.icu_format_locale_kwargs(),
)
except ICUError:
_logger.error(
"Error building message '%s'. Trying untranslated version",
msg,
exc_info=True,
)
return icu_format(
"C",
untranslated_message,
args,
raise_exception,
locale_kwargs=self.icu_format_locale_kwargs(),
)
def icu_list_format(self, list_data: list) -> str:
return icu_list_format(
self.env.context.get("lang") or self.env.user.lang, list_data
)
def get_icu_formatter(self, message: str) -> ICUFormatter:
return _icu_formatter_cache.get(
message,
self.env.context.get("lang") or self.env.user.lang,
locale_kwargs=self.icu_format_locale_kwargs(),
)