Newer
Older
.. |coverage| image:: .badges/coverage.svg
:target: https://orus.io/xcg/odoo-modules/icuformat/-/pipelines?ref=branch/16.0
:alt: Coverage report
.. |pylint| image:: .badges/pylint.svg
:target: https://orus.io/xcg/odoo-modules/icuformat/-/pipelines?ref=branch/16.0
:alt: pylint score
.. Update the badge below depending on status
.. |maturity| image:: .badges/maturity.svg
:target: https://odoo-community.org/page/development-status
:alt: Alpha
.. |license| image:: .badges/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |black| image:: .badges/code_style-black-000000.svg
:target: https://github.com/psf/black
:alt: Black
.. |prettier| image:: .badges/code_style-prettier-ff69b4.svg
:target: https://github.com/prettier/prettier
:alt: Prettier
|coverage| |pylint| |maturity| |license| |black| |prettier|
Provides methods that encapsulates PyICU.
ICU provides handling of plural and many other things that are not present in the gettext implementation of Odoo.
This module provides icu_format that can be called from anywhere:
.. code-block:: python
from odoo.addons.icuformat import icu_format
icu_format("en", _("A message: {msg}"), {"msg": self.id})
There is also one that is linked to models and extract the language to use from the context, defaulting to the current user lang:
.. code-block:: python
self.icu_format(_("A message: {msg}"), {"msg": self.id})
The icu_format methods accepts various types in its dictionary, but some of them are converted to avoid errors in ICU:
- dates are converted to datetime.
- bool are converted to strings.
The module also add icu_format_translate to the list of method used in babel to generate the module catalogs.
It also adds ``TRANSLATORS:`` as a tag used to comment translated strings.
54
55
56
57
58
59
60
61
62
63
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
Example:
.. code-block:: python
# TRANSLATORS: b is a boolean, either True or False
self.icu_format_translate("{b,select,True{This is true.}other{This is false.}}", {"b": value}))
ICU provides a way to format a list of elements, it is also exposed:
.. code-block:: python
self.icu_list_format(["a", "b", "c"])
.. code-block:: python
from odoo.addons.icuformat import icu_list_format
icu_list_format("en_US", self.ids)
There is also a currency formatter helper:
.. code-block:: python
self.env.ref("base.EUR").icu_format(
_("Your total is {total, number, currency}"), {"total": 1.25}
)
self.currency_id.icu_format_translate(
"Your total is {total, number, currency}", {"total": 1.25}
)
There is also a logger to use ICU in log messages:
.. code-block:: python
from odoo.addons.icuformat import get_logger
_logger = get_logger(__name__)
_logger.info("Simple message")
_logger.info("Value: {value, number}", {"value": 1000})
To Do
-----
- provide a method that use the translated locale of a text. This is to avoid mixing translation and formatting. For example, a user expects “User joined the company in March 2021”, but not “User joined the company in mars 2021” where there is a mix of French formatting of the date while the message is not formatted.
- add number, time and date formatter.
Reference
---------
- `ICU User Guide <https://unicode-org.github.io/icu/userguide/>`_