Skip to content

Commit ea84d9d

Browse files
authored
Replace more alternate characters in format_skeleton (#1122)
Replaces some additional characters which never appear in resource files before matching the skeleton. This replicates the behaviour of ICU.
1 parent d4069ee commit ea84d9d

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

babel/dates.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,6 +1890,14 @@ def match_skeleton(skeleton: str, options: Iterable[str], allow_different_fields
18901890

18911891
if 'z' in skeleton and not any('z' in option for option in options):
18921892
skeleton = skeleton.replace('z', 'v')
1893+
if 'k' in skeleton and not any('k' in option for option in options):
1894+
skeleton = skeleton.replace('k', 'H')
1895+
if 'K' in skeleton and not any('K' in option for option in options):
1896+
skeleton = skeleton.replace('K', 'h')
1897+
if 'a' in skeleton and not any('a' in option for option in options):
1898+
skeleton = skeleton.replace('a', '')
1899+
if 'b' in skeleton and not any('b' in option for option in options):
1900+
skeleton = skeleton.replace('b', '')
18931901

18941902
get_input_field_width = dict(t[1] for t in tokenize_pattern(skeleton) if t[0] == "field").get
18951903
best_skeleton = None

tests/test_dates.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,19 @@ def test_format_skeleton(timezone_getter):
619619
assert (dates.format_skeleton('EHm', dt, tzinfo=timezone_getter('Asia/Bangkok'), locale='th') == 'อา. 22:30 น.')
620620

621621

622+
@pytest.mark.parametrize(('skeleton', 'expected'), [
623+
('Hmz', 'Hmv'),
624+
('kmv', 'Hmv'),
625+
('Kmv', 'hmv'),
626+
('Hma', 'Hm'),
627+
('Hmb', 'Hm'),
628+
('zkKab', 'vHh'),
629+
])
630+
def test_match_skeleton_alternate_characters(skeleton, expected):
631+
# https://github.com/unicode-org/icu/blob/5e22f0076ec9b55056cd8a84e9ef370632f44174/icu4j/main/core/src/main/java/com/ibm/icu/text/DateIntervalInfo.java#L1090-L1102
632+
assert dates.match_skeleton(skeleton, (expected,)) == expected
633+
634+
622635
def test_format_timedelta():
623636
assert (dates.format_timedelta(timedelta(weeks=12), locale='en_US')
624637
== '3 months')

0 commit comments

Comments
 (0)