changeset e3431889bb9d in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=e3431889bb9d
description:
        Add ir.calendar for month and day

        This allows to replace time_locale and use the translation 
infrastructure
        instead. So it can be customized using the translation override or 
derivative
        languages.
        This provides also a standard base to modules that needs calendar month 
and
        day.

        issue7815
        review56451002
diffstat:

 CHANGELOG                     |    1 +
 trytond/ir/__init__.py        |    3 +
 trytond/ir/calendar_.py       |   59 ++++
 trytond/ir/calendar_.xml      |  103 +++++++
 trytond/ir/gen_time_locale.py |   57 ----
 trytond/ir/ir.xml             |    2 +
 trytond/ir/lang.py            |   42 ++-
 trytond/ir/lang.xml           |   36 ++
 trytond/ir/time_locale.py     |  588 ------------------------------------------
 trytond/ir/tryton.cfg         |    1 +
 trytond/ir/view/lang_form.xml |    4 +
 trytond/tests/test_ir.py      |   16 +-
 12 files changed, 246 insertions(+), 666 deletions(-)

diffs (1148 lines):

diff -r 3d392cbf6dfc -r e3431889bb9d CHANGELOG
--- a/CHANGELOG Mon Dec 31 15:36:49 2018 +0100
+++ b/CHANGELOG Tue Jan 01 15:47:23 2019 +0100
@@ -1,3 +1,4 @@
+* Add ir.calendar for month and day
 * Rename languages: hu_HU, it_IT and pt_BR into hu, it and pt
 * Define custom exceptions
 * Remove _error_messages, raise_user_error and raise_user_warning
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/__init__.py
--- a/trytond/ir/__init__.py    Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/ir/__init__.py    Tue Jan 01 15:47:23 2019 +0100
@@ -21,6 +21,7 @@
 from .trigger import *
 from .session import *
 from . import queue
+from . import calendar_
 from . import message
 
 
@@ -88,6 +89,8 @@
         Session,
         SessionWizard,
         queue.Queue,
+        calendar_.Month,
+        calendar_.Day,
         message.Message,
         module='ir', type_='model')
     Pool.register(
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/calendar_.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/trytond/ir/calendar_.py   Tue Jan 01 15:47:23 2019 +0100
@@ -0,0 +1,59 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from ..cache import Cache
+from ..model import ModelSQL, fields, Unique
+from ..transaction import Transaction
+
+
+class _Calendar(ModelSQL):
+    index = fields.Integer("Index", required=True)
+    name = fields.Char("Name", required=True, translate=True)
+    abbreviation = fields.Char("Abbreviation", required=True, translate=True)
+
+    @classmethod
+    def __setup__(cls):
+        super().__setup__()
+        t = cls.__table__()
+        cls.index.domain = [
+            ('index', '>=', cls._min_index),
+            ('index', '<=', cls._max_index),
+            ]
+        cls._order = [('index', 'ASC')]
+        cls._sql_constraints = [
+            ('index_unique', Unique(t, t.index),
+                "The index must by unique.")
+            ]
+
+    @classmethod
+    def locale(cls, language=None, field='name'):
+        transaction = Transaction()
+        if language is None:
+            language = transaction.language
+        elif isinstance(language, ModelSQL):
+            language = language.code
+        key = (language, field)
+        result = cls._cache_locale.get(key)
+        if not result:
+            with transaction.set_context(language=language):
+                records = cls.search([])
+            result = [None] * cls._min_index
+            result += [getattr(r, field) for r in records]
+            cls._cache_locale.set(key, result)
+        return result
+
+
+class Month(_Calendar):
+    "Month"
+    __name__ = 'ir.calendar.month'
+    _min_index = 1
+    _max_index = 12
+    _cache_locale = Cache('ir.calendar.month')
+
+
+class Day(_Calendar):
+    "Day"
+    __name__ = 'ir.calendar.day'
+    _min_index = 0
+    _max_index = 6
+    _cache_locale = Cache('ir.calendar.day')
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/calendar_.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/trytond/ir/calendar_.xml  Tue Jan 01 15:47:23 2019 +0100
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data group="1">
+        <record model="ir.calendar.month" id="January">
+            <field name="index" eval="1"/>
+            <field name="name">January</field>
+            <field name="abbreviation">Jan</field>
+        </record>
+        <record model="ir.calendar.month" id="February">
+            <field name="index" eval="2"/>
+            <field name="name">February</field>
+            <field name="abbreviation">Feb</field>
+        </record>
+        <record model="ir.calendar.month" id="March">
+            <field name="index" eval="3"/>
+            <field name="name">March</field>
+            <field name="abbreviation">Mar</field>
+        </record>
+        <record model="ir.calendar.month" id="April">
+            <field name="index" eval="4"/>
+            <field name="name">April</field>
+            <field name="abbreviation">Apr</field>
+        </record>
+        <record model="ir.calendar.month" id="May">
+            <field name="index" eval="5"/>
+            <field name="name">May</field>
+            <field name="abbreviation">May</field>
+        </record>
+        <record model="ir.calendar.month" id="June">
+            <field name="index" eval="6"/>
+            <field name="name">June</field>
+            <field name="abbreviation">Jun</field>
+        </record>
+        <record model="ir.calendar.month" id="July">
+            <field name="index" eval="7"/>
+            <field name="name">July</field>
+            <field name="abbreviation">Jul</field>
+        </record>
+        <record model="ir.calendar.month" id="August">
+            <field name="index" eval="8"/>
+            <field name="name">August</field>
+            <field name="abbreviation">Aug</field>
+        </record>
+        <record model="ir.calendar.month" id="September">
+            <field name="index" eval="9"/>
+            <field name="name">September</field>
+            <field name="abbreviation">Sep</field>
+        </record>
+        <record model="ir.calendar.month" id="October">
+            <field name="index" eval="10"/>
+            <field name="name">October</field>
+            <field name="abbreviation">Oct</field>
+        </record>
+        <record model="ir.calendar.month" id="November">
+            <field name="index" eval="11"/>
+            <field name="name">November</field>
+            <field name="abbreviation">Nov</field>
+        </record>
+        <record model="ir.calendar.month" id="December">
+            <field name="index" eval="12"/>
+            <field name="name">December</field>
+            <field name="abbreviation">Dec</field>
+        </record>
+
+        <record model="ir.calendar.day" id="Monday">
+            <field name="index" eval="0"/>
+            <field name="name">Monday</field>
+            <field name="abbreviation">Mon</field>
+        </record>
+        <record model="ir.calendar.day" id="Tuesday">
+            <field name="index" eval="1"/>
+            <field name="name">Tuesday</field>
+            <field name="abbreviation">Tue</field>
+        </record>
+        <record model="ir.calendar.day" id="Wednesday">
+            <field name="index" eval="2"/>
+            <field name="name">Wednesday</field>
+            <field name="abbreviation">Wed</field>
+        </record>
+        <record model="ir.calendar.day" id="Thursday">
+            <field name="index" eval="3"/>
+            <field name="name">Thursday</field>
+            <field name="abbreviation">Thu</field>
+        </record>
+        <record model="ir.calendar.day" id="Friday">
+            <field name="index" eval="4"/>
+            <field name="name">Friday</field>
+            <field name="abbreviation">Fri</field>
+        </record>
+        <record model="ir.calendar.day" id="Saturday">
+            <field name="index" eval="5"/>
+            <field name="name">Saturday</field>
+            <field name="abbreviation">Sat</field>
+        </record>
+        <record model="ir.calendar.day" id="Sunday">
+            <field name="index" eval="6"/>
+            <field name="name">Sunday</field>
+            <field name="abbreviation">Sun</field>
+        </record>
+    </data>
+</tryton>
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/gen_time_locale.py
--- a/trytond/ir/gen_time_locale.py     Mon Dec 31 15:36:49 2018 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-# This file is part of Tryton.  The COPYRIGHT file at the top level of
-# this repository contains the full copyright notices and license terms.
-import os
-import pprint
-import time
-
-from lxml import etree
-
-from . import locale
-
-
-def locale_strftime(lang):
-    time_locale = {
-        '%a': [],
-        '%A': [],
-        '%b': [None],
-        '%B': [None],
-        '%p': [],
-    }
-    locale.setlocale(locale.LC_ALL, locale.normalize(lang + '.UTF_8'))
-    t = list(time.gmtime())
-    for i in range(12):
-        t[1] = i + 1
-        for format in ('%b', '%B'):
-            time_locale[format].append(time.strftime(format,
-                t).decode('utf-8'))
-    for i in range(7):
-        t[6] = i
-        for format in ('%a', '%A'):
-            time_locale[format].append(time.strftime(format,
-                t).decode('utf-8'))
-    t[3] = 0
-    time_locale['%p'].append(time.strftime('%p', t).decode('utf-8'))
-    t[3] = 23
-    time_locale['%p'].append(time.strftime('%p', t).decode('utf-8'))
-    return time_locale
-
-
-if __name__ == '__main__':
-    base = os.path.dirname(__file__)
-    # Add en as it is not defined in lang.xml
-    time_locale = {
-        'en': locale_strftime('en'),
-        }
-    with open(os.path.join(base, 'lang.xml'), 'rb') as fp:
-        lang_xml = etree.parse(fp)
-        for el in lang_xml.xpath('//field[@name="code"]'):
-            lang = el.text[:2]
-            time_locale[lang] = locale_strftime(lang)
-    with open(os.path.join(base, 'time_locale.py'), 'w') as fp:
-        fp.write('''# -*- coding: utf-8 -*-
-# This file is part of Tryton.  The COPYRIGHT file at the top level of')
-# this repository contains the full copyright notices and license terms.')
-''')
-        fp.write('TIME_LOCALE = \\\n')
-        pp = pprint.PrettyPrinter(stream=fp)
-        pp.pprint(time_locale)
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/ir.xml
--- a/trytond/ir/ir.xml Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/ir/ir.xml Tue Jan 01 15:47:23 2019 +0100
@@ -11,6 +11,8 @@
             <field name="code">en</field>
             <field name="name">English</field>
             <field name="date">%m/%d/%Y</field>
+            <field name="am">AM</field>
+            <field name="pm">PM</field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">.</field>
             <field name="thousands_sep">,</field>
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/lang.py
--- a/trytond/ir/lang.py        Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/ir/lang.py        Tue Jan 01 15:47:23 2019 +0100
@@ -16,7 +16,6 @@
 from ..pool import Pool
 from ..exceptions import UserError
 from ..i18n import gettext
-from .time_locale import TIME_LOCALE
 
 Transaction.cache_keys.add('translate_name')
 
@@ -57,6 +56,9 @@
     # date
     date = fields.Char('Date', required=True)
 
+    am = fields.Char("AM")
+    pm = fields.Char("PM")
+
     # number
     grouping = fields.Char('Grouping', required=True)
     decimal_point = fields.Char('Decimal Separator', required=True)
@@ -473,21 +475,35 @@
 
         return s.replace('<', '').replace('>', '')
 
-    def strftime(self, datetime, format=None):
+    def strftime(self, value, format=None):
+        '''
+        Convert value to a string as specified by the format argument.
         '''
-        Convert datetime to a string as specified by the format argument.
-        '''
+        pool = Pool()
+        Month = pool.get('ir.calendar.month')
+        Day = pool.get('ir.calendar.day')
         if format is None:
             format = self.date
-        code = self.code[:2]
-        if code in TIME_LOCALE:
-            for f, i in (('%a', 6), ('%A', 6), ('%b', 1), ('%B', 1)):
-                format = format.replace(f,
-                        TIME_LOCALE[code][f][datetime.timetuple()[i]])
-            format = format.replace('%p',
-                TIME_LOCALE[code]['%p'][datetime.timetuple()[3] < 12 and 0
-                    or 1])
-        return datetime.strftime(format)
+        format = format.replace('%x', self.date)
+        if isinstance(value, datetime.date):
+            for f, i, klass in (('%A', 6, Day), ('%B', 1, Month)):
+                for field, f in [('name', f), ('abbreviation', f.lower())]:
+                    locale = klass.locale(self, field=field)
+                    format = format.replace(f, locale[value.timetuple()[i]])
+        if isinstance(value, datetime.time):
+            time = value
+        else:
+            try:
+                time = value.time()
+            except AttributeError:
+                time = None
+        if time:
+            if time < datetime.time(12):
+                p = self.am or 'AM'
+            else:
+                p = self.pm or 'PM'
+            format = format.replace('%p', p)
+        return value.strftime(format)
 
 
 def get_parent_language(code):
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/lang.xml
--- a/trytond/ir/lang.xml       Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/ir/lang.xml       Tue Jan 01 15:47:23 2019 +0100
@@ -9,6 +9,8 @@
             <field name="code">bg</field>
             <field name="name">Bulgarian</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -28,6 +30,8 @@
             <field name="code">ca</field>
             <field name="name">Català</field>
             <field name="date">%d/%m/%Y</field>
+            <field name="am">a. m.</field>
+            <field name="pm">p. m.</field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"> </field>
@@ -47,6 +51,8 @@
             <field name="code">cs</field>
             <field name="name">Czech</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"> </field>
@@ -66,6 +72,8 @@
             <field name="code">de</field>
             <field name="name">German</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -88,6 +96,8 @@
             <field name="code">es</field>
             <field name="name">Spanish</field>
             <field name="date">%d/%m/%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -107,6 +117,8 @@
             <field name="code">es_419</field>
             <field name="name">Spanish (Latin American)</field>
             <field name="date">%d/%m/%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">.</field>
             <field name="thousands_sep">,</field>
@@ -127,6 +139,8 @@
             <field name="name">Persian</field>
             <field name="direction">rtl</field>
             <field name="date">%Y/%m/%d</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 0]</field>
             <field name="decimal_point">.</field>
             <field name="thousands_sep">,</field>
@@ -146,6 +160,8 @@
             <field name="code">fr</field>
             <field name="name">French</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"> </field>
@@ -165,6 +181,8 @@
             <field name="code">hu</field>
             <field name="name">Hungarian</field>
             <field name="date">%Y-%m-%d</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -184,6 +202,8 @@
             <field name="code">it</field>
             <field name="name">Italian</field>
             <field name="date">%d/%m/%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -203,6 +223,8 @@
             <field name="code">lo</field>
             <field name="name">Lao</field>
             <field name="date">%d/%m/%Y</field>
+            <field name="am">AM</field>
+            <field name="pm">PM</field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">.</field>
             <field name="thousands_sep">,</field>
@@ -222,6 +244,8 @@
             <field name="code">lt</field>
             <field name="name">Lithuanian</field>
             <field name="date">%Y-%m-%d</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"> </field>
@@ -241,6 +265,8 @@
             <field name="code">nl</field>
             <field name="name">Dutch</field>
             <field name="date">%d-%m-%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -260,6 +286,8 @@
             <field name="code">pl</field>
             <field name="name">Polish</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"></field>
             <field name="mon_grouping">[3, 3, 0]</field>
@@ -278,6 +306,8 @@
             <field name="code">pt</field>
             <field name="name">Portuguese</field>
             <field name="date">%d-%m-%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"></field>
@@ -297,6 +327,8 @@
             <field name="code">ru</field>
             <field name="name">Russian</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep"> </field>
@@ -316,6 +348,8 @@
             <field name="code">sl</field>
             <field name="name">Slovenian</field>
             <field name="date">%d.%m.%Y</field>
+            <field name="am"></field>
+            <field name="pm"></field>
             <field name="grouping">[3, 3, 0]</field>
             <field name="decimal_point">,</field>
             <field name="thousands_sep">.</field>
@@ -335,6 +369,8 @@
             <field name="code">zh_CN</field>
             <field name="name">Chinese Simplified</field>
             <field name="date">%Y-%m-%d</field>
+            <field name="am">上午</field>
+            <field name="pm">下午</field>
             <field name="grouping">[3, 0]</field>
             <field name="decimal_point">.</field>
             <field name="thousands_sep">,</field>
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/time_locale.py
--- a/trytond/ir/time_locale.py Mon Dec 31 15:36:49 2018 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,588 +0,0 @@
-# -*- coding: utf-8 -*-
-# This file is part of Tryton.  The COPYRIGHT file at the top level of')
-# this repository contains the full copyright notices and license terms.')
-TIME_LOCALE = \
-{'bg': {'%A': ['\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a',
-               '\u0432\u0442\u043e\u0440\u043d\u0438\u043a',
-               '\u0441\u0440\u044f\u0434\u0430',
-               '\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a',
-               '\u043f\u0435\u0442\u044a\u043a',
-               '\u0441\u044a\u0431\u043e\u0442\u0430',
-               '\u043d\u0435\u0434\u0435\u043b\u044f'],
-        '%B': [None,
-               '\u044f\u043d\u0443\u0430\u0440\u0438',
-               '\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438',
-               '\u043c\u0430\u0440\u0442',
-               '\u0430\u043f\u0440\u0438\u043b',
-               '\u043c\u0430\u0439',
-               '\u044e\u043d\u0438',
-               '\u044e\u043b\u0438',
-               '\u0430\u0432\u0433\u0443\u0441\u0442',
-               '\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438',
-               '\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438',
-               '\u043d\u043e\u0435\u043c\u0432\u0440\u0438',
-               '\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438'],
-        '%a': ['\u043f\u043d',
-               '\u0432\u0442',
-               '\u0441\u0440',
-               '\u0447\u0442',
-               '\u043f\u0442',
-               '\u0441\u0431',
-               '\u043d\u0434'],
-        '%b': [None,
-               '\u044f\u043d\u0443',
-               '\u0444\u0435\u0432',
-               '\u043c\u0430\u0440',
-               '\u0430\u043f\u0440',
-               '\u043c\u0430\u0439',
-               '\u044e\u043d\u0438',
-               '\u044e\u043b\u0438',
-               '\u0430\u0432\u0433',
-               '\u0441\u0435\u043f',
-               '\u043e\u043a\u0442',
-               '\u043d\u043e\u0435',
-               '\u0434\u0435\u043a'],
-        '%p': ['', '']},
- 'ca': {'%A': ['dilluns',
-               'dimarts',
-               'dimecres',
-               'dijous',
-               'divendres',
-               'dissabte',
-               'diumenge'],
-        '%B': [None,
-               'gener',
-               'febrer',
-               'mar\xe7',
-               'abril',
-               'maig',
-               'juny',
-               'juliol',
-               'agost',
-               'setembre',
-               'octubre',
-               'novembre',
-               'desembre'],
-        '%a': ['dl', 'dt', 'dc', 'dj', 'dv', 'ds', 'dg'],
-        '%b': [None,
-               'gen',
-               'feb',
-               'mar',
-               'abr',
-               'mai',
-               'jun',
-               'jul',
-               'ago',
-               'set',
-               'oct',
-               'nov',
-               'des'],
-        '%p': ['', '']},
- 'cs': {'%A': ['Pond\u011bl\xed',
-               '\xdater\xfd',
-               'St\u0159eda',
-               '\u010ctvrtek',
-               'P\xe1tek',
-               'Sobota',
-               'Ned\u011ble'],
-        '%B': [None,
-               'leden',
-               '\xfanor',
-               'b\u0159ezen',
-               'duben',
-               'kv\u011bten',
-               '\u010derven',
-               '\u010dervenec',
-               'srpen',
-               'z\xe1\u0159\xed',
-               '\u0159\xedjen',
-               'listopad',
-               'prosinec'],
-        '%a': ['Po', '\xdat', 'St', '\u010ct', 'P\xe1', 'So', 'Ne'],
-        '%b': [None,
-               'led',
-               '\xfano',
-               'b\u0159e',
-               'dub',
-               'kv\u011b',
-               '\u010den',
-               '\u010dec',
-               'srp',
-               'z\xe1\u0159',
-               '\u0159\xedj',
-               'lis',
-               'pro'],
-        '%p': ['', '']},
- 'de': {'%A': ['Montag',
-               'Dienstag',
-               'Mittwoch',
-               'Donnerstag',
-               'Freitag',
-               'Samstag',
-               'Sonntag'],
-        '%B': [None,
-               'Januar',
-               'Februar',
-               'M\xe4rz',
-               'April',
-               'Mai',
-               'Juni',
-               'Juli',
-               'August',
-               'September',
-               'Oktober',
-               'November',
-               'Dezember'],
-        '%a': ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'],
-        '%b': [None,
-               'Jan',
-               'Feb',
-               'M\xe4r',
-               'Apr',
-               'Mai',
-               'Jun',
-               'Jul',
-               'Aug',
-               'Sep',
-               'Okt',
-               'Nov',
-               'Dez'],
-        '%p': ['', '']},
- 'en': {'%A': ['Monday',
-               'Tuesday',
-               'Wednesday',
-               'Thursday',
-               'Friday',
-               'Saturday',
-               'Sunday'],
-        '%B': [None,
-               'January',
-               'February',
-               'March',
-               'April',
-               'May',
-               'June',
-               'July',
-               'August',
-               'September',
-               'October',
-               'November',
-               'December'],
-        '%a': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-        '%b': [None,
-               'Jan',
-               'Feb',
-               'Mar',
-               'Apr',
-               'May',
-               'Jun',
-               'Jul',
-               'Aug',
-               'Sep',
-               'Oct',
-               'Nov',
-               'Dec'],
-        '%p': ['AM', 'PM']},
- 'es': {'%A': ['lunes',
-               'martes',
-               'mi\xe9rcoles',
-               'jueves',
-               'viernes',
-               's\xe1bado',
-               'domingo'],
-        '%B': [None,
-               'enero',
-               'febrero',
-               'marzo',
-               'abril',
-               'mayo',
-               'junio',
-               'julio',
-               'agosto',
-               'septiembre',
-               'octubre',
-               'noviembre',
-               'diciembre'],
-        '%a': ['lun', 'mar', 'mi\xe9', 'jue', 'vie', 's\xe1b', 'dom'],
-        '%b': [None,
-               'ene',
-               'feb',
-               'mar',
-               'abr',
-               'may',
-               'jun',
-               'jul',
-               'ago',
-               'sep',
-               'oct',
-               'nov',
-               'dic'],
-        '%p': ['', '']},
- 'fr': {'%A': ['lundi',
-               'mardi',
-               'mercredi',
-               'jeudi',
-               'vendredi',
-               'samedi',
-               'dimanche'],
-        '%B': [None,
-               'janvier',
-               'f\xe9vrier',
-               'mars',
-               'avril',
-               'mai',
-               'juin',
-               'juillet',
-               'ao\xfbt',
-               'septembre',
-               'octobre',
-               'novembre',
-               'd\xe9cembre'],
-        '%a': ['lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.', 'dim.'],
-        '%b': [None,
-               'janv.',
-               'f\xe9vr.',
-               'mars',
-               'avril',
-               'mai',
-               'juin',
-               'juil.',
-               'ao\xfbt',
-               'sept.',
-               'oct.',
-               'nov.',
-               'd\xe9c.'],
-        '%p': ['', '']},
- 'hu': {'%A': ['h\xe9tf\u0151',
-               'kedd',
-               'szerda',
-               'cs\xfct\xf6rt\xf6k',
-               'p\xe9ntek',
-               'szombat',
-               'vas\xe1rnap'],
-        '%B': [None,
-               'janu\xe1r',
-               'febru\xe1r',
-               'm\xe1rcius',
-               '\xe1prilis',
-               'm\xe1jus',
-               'j\xfanius',
-               'j\xfalius',
-               'augusztus',
-               'szeptember',
-               'okt\xf3ber',
-               'november',
-               'december'],
-        '%a': ['h', 'k', 'sze', 'cs', 'p', 'szo', 'v'],
-        '%b': [None,
-               'jan',
-               'febr',
-               'm\xe1rc',
-               '\xe1pr',
-               'm\xe1j',
-               'j\xfan',
-               'j\xfal',
-               'aug',
-               'szept',
-               'okt',
-               'nov',
-               'dec'],
-        '%p': ['', '']},
- 'it': {'%A': ['luned\xec',
-               'marted\xec',
-               'mercoled\xec',
-               'gioved\xec',
-               'venerd\xec',
-               'sabato',
-               'domenica'],
-        '%B': [None,
-               'gennaio',
-               'febbraio',
-               'marzo',
-               'aprile',
-               'maggio',
-               'giugno',
-               'luglio',
-               'agosto',
-               'settembre',
-               'ottobre',
-               'novembre',
-               'dicembre'],
-        '%a': ['lun', 'mar', 'mer', 'gio', 'ven', 'sab', 'dom'],
-        '%b': [None,
-               'gen',
-               'feb',
-               'mar',
-               'apr',
-               'mag',
-               'giu',
-               'lug',
-               'ago',
-               'set',
-               'ott',
-               'nov',
-               'dic'],
-        '%p': ['', '']},
- 'lo': {'%A': ['\u0e88\u0eb1\u0e99',
-               '\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99',
-               '\u0e9e\u0eb8\u0e94',
-               '\u0e9e\u0eb0\u0eab\u0eb1\u0e94',
-               '\u0eaa\u0eb8\u0e81',
-               '\u0ec0\u0eaa\u0ebb\u0eb2',
-               '\u0ead\u0eb2\u0e97\u0eb4\u0e94'],
-        '%B': [None,
-               '\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99',
-               '\u0e81\u0eb8\u0ea1\u0e9f\u0eb2',
-               '\u0ea1\u0eb5\u0e99\u0eb2',
-               '\u0ec0\u0ea1\u0eaa\u0eb2',
-               '\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2',
-               '\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2',
-               '\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94',
-               '\u0eaa\u0eb4\u0e87\u0eab\u0eb2',
-               '\u0e81\u0eb1\u0e99\u0e8d\u0eb2',
-               '\u0e95\u0eb8\u0ea5\u0eb2',
-               '\u0e9e\u0eb0\u0e88\u0eb4\u0e81',
-               '\u0e97\u0eb1\u0e99\u0ea7\u0eb2'],
-        '%a': ['\u0e88.',
-               '\u0e84.',
-               '\u0e9e.',
-               '\u0e9e\u0eab.',
-               '\u0eaa.',
-               '\u0eaa.',
-               '\u0ead\u0eb2.'],
-        '%b': [None,
-               '\u0ea1.\u0e81.',
-               '\u0e81.\u0e9e.',
-               '\u0ea1.\u0e99.',
-               '\u0ea1.\u0eaa.',
-               '\u0e9e.\u0e9e.',
-               '\u0ea1\u0eb4.\u0e96.',
-               '\u0e81.\u0ea5.',
-               '\u0eaa.\u0eab.',
-               '\u0e81.\u0e8d.',
-               '\u0e95.\u0ea5.',
-               '\u0e9e.\u0e88.',
-               '\u0e97.\u0ea7.'],
-        '%p': ['AM', 'PM']},
- 'lt': {'%A': ['Pirmadienis',
-               'Antradienis',
-               'Tre\u010diadienis',
-               'Ketvirtadienis',
-               'Penktadienis',
-               '\u0160e\u0161tadienis',
-               'Sekmadienis'],
-        '%B': [None,
-               'sausio',
-               'vasario',
-               'kovo',
-               'baland\u017eio',
-               'gegu\u017e\u0117s',
-               'bir\u017eelio',
-               'liepos',
-               'rugpj\u016b\u010dio',
-               'rugs\u0117jo',
-               'spalio',
-               'lapkri\u010dio',
-               'gruod\u017eio'],
-        '%a': ['Pr', 'An', 'Tr', 'Kt', 'Pn', '\u0160t', 'Sk'],
-        '%b': [None,
-               'Sau',
-               'Vas',
-               'Kov',
-               'Bal',
-               'Geg',
-               'Bir',
-               'Lie',
-               'Rgp',
-               'Rgs',
-               'Spa',
-               'Lap',
-               'Grd'],
-        '%p': ['', '']},
- 'nl': {'%A': ['maandag',
-               'dinsdag',
-               'woensdag',
-               'donderdag',
-               'vrijdag',
-               'zaterdag',
-               'zondag'],
-        '%B': [None,
-               'januari',
-               'februari',
-               'maart',
-               'april',
-               'mei',
-               'juni',
-               'juli',
-               'augustus',
-               'september',
-               'oktober',
-               'november',
-               'december'],
-        '%a': ['ma', 'di', 'wo', 'do', 'vr', 'za', 'zo'],
-        '%b': [None,
-               'jan',
-               'feb',
-               'mrt',
-               'apr',
-               'mei',
-               'jun',
-               'jul',
-               'aug',
-               'sep',
-               'okt',
-               'nov',
-               'dec'],
-        '%p': ['', '']},
- 'pt': {'%A': ['Segunda',
-               'Ter\xe7a',
-               'Quarta',
-               'Quinta',
-               'Sexta',
-               'S\xe1bado',
-               'Domingo'],
-        '%B': [None,
-               'Janeiro',
-               'Fevereiro',
-               'Mar\xe7o',
-               'Abril',
-               'Maio',
-               'Junho',
-               'Julho',
-               'Agosto',
-               'Setembro',
-               'Outubro',
-               'Novembro',
-               'Dezembro'],
-        '%a': ['Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'S\xe1b', 'Dom'],
-        '%b': [None,
-               'Jan',
-               'Fev',
-               'Mar',
-               'Abr',
-               'Mai',
-               'Jun',
-               'Jul',
-               'Ago',
-               'Set',
-               'Out',
-               'Nov',
-               'Dez'],
-        '%p': ['', '']},
- 'ru': {'%A': 
['\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a',
-               '\u0412\u0442\u043e\u0440\u043d\u0438\u043a',
-               '\u0421\u0440\u0435\u0434\u0430',
-               '\u0427\u0435\u0442\u0432\u0435\u0440\u0433',
-               '\u041f\u044f\u0442\u043d\u0438\u0446\u0430',
-               '\u0421\u0443\u0431\u0431\u043e\u0442\u0430',
-               
'\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435'],
-        '%B': [None,
-               '\u042f\u043d\u0432\u0430\u0440\u044c',
-               '\u0424\u0435\u0432\u0440\u0430\u043b\u044c',
-               '\u041c\u0430\u0440\u0442',
-               '\u0410\u043f\u0440\u0435\u043b\u044c',
-               '\u041c\u0430\u0439',
-               '\u0418\u044e\u043d\u044c',
-               '\u0418\u044e\u043b\u044c',
-               '\u0410\u0432\u0433\u0443\u0441\u0442',
-               '\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c',
-               '\u041e\u043a\u0442\u044f\u0431\u0440\u044c',
-               '\u041d\u043e\u044f\u0431\u0440\u044c',
-               '\u0414\u0435\u043a\u0430\u0431\u0440\u044c'],
-        '%a': ['\u041f\u043d',
-               '\u0412\u0442',
-               '\u0421\u0440',
-               '\u0427\u0442',
-               '\u041f\u0442',
-               '\u0421\u0431',
-               '\u0412\u0441'],
-        '%b': [None,
-               '\u044f\u043d\u0432',
-               '\u0444\u0435\u0432',
-               '\u043c\u0430\u0440',
-               '\u0430\u043f\u0440',
-               '\u043c\u0430\u0439',
-               '\u0438\u044e\u043d',
-               '\u0438\u044e\u043b',
-               '\u0430\u0432\u0433',
-               '\u0441\u0435\u043d',
-               '\u043e\u043a\u0442',
-               '\u043d\u043e\u044f',
-               '\u0434\u0435\u043a'],
-        '%p': ['', '']},
- 'sl': {'%A': ['ponedeljek',
-               'torek',
-               'sreda',
-               '\u010detrtek',
-               'petek',
-               'sobota',
-               'nedelja'],
-        '%B': [None,
-               'januar',
-               'februar',
-               'marec',
-               'april',
-               'maj',
-               'junij',
-               'julij',
-               'avgust',
-               'september',
-               'oktober',
-               'november',
-               'december'],
-        '%a': ['pon', 'tor', 'sre', '\u010det', 'pet', 'sob', 'ned'],
-        '%b': [None,
-               'jan',
-               'feb',
-               'mar',
-               'apr',
-               'maj',
-               'jun',
-               'jul',
-               'avg',
-               'sep',
-               'okt',
-               'nov',
-               'dec'],
-        '%p': ['', '']},
- 'zh': {'%A': ['\u661f\u671f\u4e00',
-               '\u661f\u671f\u4e8c',
-               '\u661f\u671f\u4e09',
-               '\u661f\u671f\u56db',
-               '\u661f\u671f\u4e94',
-               '\u661f\u671f\u516d',
-               '\u661f\u671f\u65e5'],
-        '%B': [None,
-               '\u4e00\u6708',
-               '\u4e8c\u6708',
-               '\u4e09\u6708',
-               '\u56db\u6708',
-               '\u4e94\u6708',
-               '\u516d\u6708',
-               '\u4e03\u6708',
-               '\u516b\u6708',
-               '\u4e5d\u6708',
-               '\u5341\u6708',
-               '\u5341\u4e00\u6708',
-               '\u5341\u4e8c\u6708'],
-        '%a': ['\u4e00',
-               '\u4e8c',
-               '\u4e09',
-               '\u56db',
-               '\u4e94',
-               '\u516d',
-               '\u65e5'],
-        '%b': [None,
-               '1\u6708',
-               '2\u6708',
-               '3\u6708',
-               '4\u6708',
-               '5\u6708',
-               '6\u6708',
-               '7\u6708',
-               '8\u6708',
-               '9\u6708',
-               '10\u6708',
-               '11\u6708',
-               '12\u6708'],
-        '%p': ['\u4e0a\u5348', '\u4e0b\u5348']}}
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/tryton.cfg
--- a/trytond/ir/tryton.cfg     Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/ir/tryton.cfg     Tue Jan 01 15:47:23 2019 +0100
@@ -17,4 +17,5 @@
     rule.xml
     module.xml
     trigger.xml
+    calendar_.xml
     message.xml
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/ir/view/lang_form.xml
--- a/trytond/ir/view/lang_form.xml     Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/ir/view/lang_form.xml     Tue Jan 01 15:47:23 2019 +0100
@@ -17,6 +17,10 @@
     <separator string="Date Formatting" colspan="6" id="date"/>
     <label name="date"/>
     <field name="date"/>
+    <label name="am"/>
+    <field name="am"/>
+    <label name="pm"/>
+    <field name="pm"/>
     <separator string="Numbers Formatting" colspan="6" id="number"/>
     <label name="grouping"/>
     <field name="grouping"/>
diff -r 3d392cbf6dfc -r e3431889bb9d trytond/tests/test_ir.py
--- a/trytond/tests/test_ir.py  Mon Dec 31 15:36:49 2018 +0100
+++ b/trytond/tests/test_ir.py  Tue Jan 01 15:47:23 2019 +0100
@@ -53,16 +53,16 @@
         "Test Lang.strftime"
         pool = Pool()
         Lang = pool.get('ir.lang')
+        lang = Lang.get('en')
         test_data = [
-            ((2016, 8, 3), 'en', '%d %B %Y', "03 August 2016"),
-            ((2016, 8, 3), 'fr', '%d %B %Y', "03 ao\xfbt 2016"),
-            ((2016, 8, 3), 'fr', '%d %B %Y', "03 ao\xfbt 2016"),
+            (datetime.date(2016, 8, 3), '%d %B %Y', "03 August 2016"),
+            (datetime.time(8, 20), '%I:%M %p', "08:20 AM"),
+            (datetime.datetime(2018, 11, 1, 14, 30), '%a %d %b %Y %I:%M %p',
+                "Thu 01 Nov 2018 02:30 PM"),
+            (datetime.date(2018, 11, 1), '%x', "11/01/2018"),
             ]
-        for date, code, format_, result in test_data:
-            lang = Lang.get(code)
-            self.assertEqual(
-                lang.strftime(datetime.date(*date), format_),
-                result)
+        for date, format_, result in test_data:
+            self.assertEqual(lang.strftime(date, format_), result)
 
 
 def suite():

Reply via email to