Merge pull request #2234 from c0r73x/dev

Some Swedish additions
pull/2254/head
Åke 2019-08-02 07:31:59 +02:00 committed by GitHub
commit a140efe8f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 869 additions and 3 deletions

View File

@ -0,0 +1,131 @@
{
"decade_format": {
"1": {"match": "^1$", "format": "ett"},
"2": {"match": "^\\d$", "format": "{x}"},
"3": {"match": "^\\d\\d$", "format": "{xx}"},
"4": {"match": "^\\d0$", "format": "{x0}"},
"default": "{number}"
},
"hundreds_format": {
"1": {"match": "^1\\d{2}$", "format": "ett hundra"},
"2": {"match": "^\\d{3}$", "format": "{x_in_x00} hundra"},
"default": "{number}"
},
"thousand_format": {
"1": {"match": "^1[1-9]\\d{2}$", "format": "{xx_in_xx00} hundra"},
"2": {"match": "^1\\d{3}$", "format": "ett tusen"},
"3": {"match": "^\\d{4}$", "format": "{x_in_x000} tusen"},
"default": "{number}"
},
"year_format": {
"1": {"match": "^\\d\\d?$", "format": "{formatted_decade} {bc}"},
"2": {"match": "^\\d00$", "format": "{formatted_hundreds} {bc}"},
"3": {"match": "^\\d{3}$", "format": "{formatted_hundreds} {formatted_decade} {bc}"},
"4": {"match": "^(1\\d00)|([2-9]000)$", "format": "{formatted_thousand} {bc}"},
"5": {"match": "^(1\\d{3})|(\\d0\\d{2})$", "format": "{formatted_thousand} {formatted_decade} {bc}"},
"6": {"match": "^\\d{4}$", "format": "{formatted_thousand} {formatted_hundreds} {formatted_decade} {bc}"},
"default": "{year} {bc}",
"bc": "f.kr."
},
"date_format": {
"date_full": "{weekday}, den {day} {month}, {formatted_year}",
"date_full_no_year": "{weekday}, den {day} {month}",
"date_full_no_year_month": "{weekday}, den {day}",
"today": "i dag",
"tomorrow": "i morgon",
"yesterday": "i går"
},
"date_time_format": {
"date_time": "{formatted_date} klockan {formatted_time}"
},
"weekday": {
"0": "måndag",
"1": "tisdag",
"2": "onsdag",
"3": "torsdag",
"4": "fredag",
"5": "lördag",
"6": "söndag"
},
"date": {
"1": "förste",
"2": "andra",
"3": "tredje",
"4": "fjärde",
"5": "femte",
"6": "sjätte",
"7": "sjunde",
"8": "åttonde",
"9": "nionde",
"10": "tionde",
"11": "elfte",
"12": "tolfte",
"13": "trettionde",
"14": "fjortonde",
"15": "femtonde",
"16": "sextonde",
"17": "sjuttonde",
"18": "artonde",
"19": "nittonde",
"20": "tjugonde",
"21": "tjugoförste",
"22": "tjugoandre",
"23": "tjugotredje",
"24": "tjugofjärde",
"25": "tjugofemte",
"26": "tjugosjätte",
"27": "tjugosjunde",
"28": "tjugoåttonde",
"29": "tjugonionde",
"30": "trettionde",
"31": "trettioförste"
},
"month": {
"1": "januari",
"2": "februari",
"3": "mars",
"4": "april",
"5": "maj",
"6": "juni",
"7": "juli",
"8": "augusti",
"9": "september",
"10": "oktober",
"11": "november",
"12": "december"
},
"number": {
"0": "noll",
"1": "en",
"2": "två",
"3": "tre",
"4": "fyra",
"5": "fem",
"6": "sex",
"7": "sju",
"8": "åtta",
"9": "nio",
"10": "tio",
"11": "elva",
"12": "tolv",
"13": "tretton",
"14": "fjorton",
"15": "femton",
"16": "sexton",
"17": "sjutton",
"18": "arton",
"19": "nitton",
"20": "tjugo",
"30": "trettio",
"40": "fyrtio",
"50": "femtio",
"60": "sextio",
"70": "sjuttio",
"80": "åttio",
"90": "nitio",
"100": "hundra",
"1000": "tusen",
"2000": "tvåtusen"
}
}

View File

@ -0,0 +1,32 @@
{
"test_nice_year": {
"1": {"datetime_param": "2017, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "två tusen sjutton"},
"2": {"datetime_param": "1984, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "nitton hundra 84"},
"3": {"datetime_param": "1906, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "nitton hundra sex"},
"4": {"datetime_param": "1802, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "arton hundra två" },
"5": {"datetime_param": "806, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "åtta hundra sex" },
"6": {"datetime_param": "1800, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "arton hundra" },
"7": {"datetime_param": "1, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "ett" },
"8": {"datetime_param": "103, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "ett hundra tre" },
"9": {"datetime_param": "1000, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "ett tusen" },
"10": {"datetime_param": "2000, 1, 31, 13, 22, 3", "bc": "None", "assertEqual": "två tusen" },
"11": {"datetime_param": "99, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "99 f.kr." },
"12": {"datetime_param": "5, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "fem f.kr." },
"13": {"datetime_param": "3120, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "tre tusen ett hundra tjugo f.kr." },
"14": {"datetime_param": "3241, 1, 31, 13, 22, 3", "bc": "True", "assertEqual": "tre tusen två hundra 41 f.kr." }
},
"test_nice_date": {
"1": {"datetime_param": "2017, 1, 31, 0, 2, 3", "now": "None", "assertEqual": "tisdag, den trettioförste januari, två tusen sjutton"},
"2": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2017, 1, 1, 0, 2, 3", "assertEqual": "söndag, den fjärde februari, två tusen arton"},
"3": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 1, 1, 0, 2, 3", "assertEqual": "söndag, den fjärde februari"},
"4": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 1, 0, 2, 3", "assertEqual": "söndag, den fjärde"},
"5": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 3, 0, 2, 3", "assertEqual": "i morgon"},
"6": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 4, 0, 2, 3", "assertEqual": "i dag"},
"7": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 5, 0, 2, 3", "assertEqual": "i går"},
"8": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2018, 2, 6, 0, 2, 3", "assertEqual": "söndag, den fjärde februari"},
"9": {"datetime_param": "2018, 2, 4, 0, 2, 3", "now": "2019, 2, 6, 0, 2, 3", "assertEqual": "söndag, den fjärde februari, två tusen arton"}
},
"test_nice_date_time": {
"1": {"datetime_param": "2017, 1, 31, 13, 22, 3", "now": "None", "use_24hour": "False", "use_ampm": "True", "assertEqual": "tisdag, den trettioförste januari, två tusen sjutton klockan tjugotvå minuter över ett på eftermiddagen"}
}
}

View File

@ -285,6 +285,8 @@ def nice_number(number, lang=None, speech=True, denominators=None):
return nice_number_nl(number, speech, denominators)
elif lang_code == "da":
return nice_number_da(number, speech, denominators)
elif lang_code == "sv":
return nice_number_sv(number, speech, denominators)
# Default to the raw number for unsupported languages,
# hopefully the STT engine will pronounce understandably.
@ -327,6 +329,8 @@ def nice_time(dt, lang=None, speech=True, use_24hour=False,
return nice_time_da(dt, speech, use_24hour, use_ampm)
elif lang_code == "pt":
return nice_time_pt(dt, speech, use_24hour, use_ampm)
elif lang_code == "sv":
return nice_time_sv(dt, speech, use_24hour, use_ampm)
# TODO: Other languages
return str(dt)
@ -370,6 +374,8 @@ def pronounce_number(number, lang=None, places=2, short_scale=True,
return pronounce_number_da(number, places=places)
elif lang_code == "pt":
return pronounce_number_pt(number, places=places)
elif lang_code == "sv":
return pronounce_number_sv(number, places=places)
# Default to just returning the numeric value
return str(number)

View File

@ -16,6 +16,54 @@
#
from mycroft.util.lang.format_common import convert_to_mixed_fraction
from math import floor
months = ['januari', 'februari', 'mars', 'april', 'maj', 'juni',
'juli', 'augusti', 'september', 'oktober', 'november',
'december']
NUM_STRING_SV = {
0: 'noll',
1: 'en',
2: 'två',
3: 'tre',
4: 'fyra',
5: 'fem',
6: 'sex',
7: 'sju',
8: 'åtta',
9: 'nio',
10: 'tio',
11: 'elva',
12: 'tolv',
13: 'tretton',
14: 'fjorton',
15: 'femton',
16: 'sexton',
17: 'sjutton',
18: 'arton',
19: 'nitton',
20: 'tjugo',
30: 'trettio',
40: 'fyrtio',
50: 'femtio',
60: 'sextio',
70: 'sjuttio',
80: 'åttio',
90: 'nittio',
100: 'hundra'
}
NUM_POWERS_OF_TEN = [
'hundra',
'tusen',
'miljon',
'miljard',
'biljon',
'biljard',
'triljon',
'triljard'
]
FRACTION_STRING_SV = {
2: 'halv',
@ -39,6 +87,8 @@ FRACTION_STRING_SV = {
20: 'tjugondel'
}
EXTRA_SPACE = " "
def nice_number_sv(number, speech, denominators):
""" Swedish helper for nice_number
@ -79,8 +129,297 @@ def nice_number_sv(number, speech, denominators):
return_string = '{} och en {}'.format(whole, den_str)
else:
return_string = '{} och {} {}'.format(whole, num, den_str)
if num == 2:
return_string += 'a'
if num > 2:
if num > 1:
return_string += 'ar'
return return_string
def pronounce_number_sv(num, places=2):
"""
Convert a number to its spoken equivalent
For example, '5.2' would return 'five point two'
Args:
num(float or int): the number to pronounce (set limit below)
places(int): maximum decimal places to speak
Returns:
(str): The pronounced number
"""
def pronounce_triplet_sv(num):
result = ""
num = floor(num)
if num > 99:
hundreds = floor(num / 100)
if hundreds > 0:
if hundreds == 1:
result += 'ett' + 'hundra'
else:
result += NUM_STRING_SV[hundreds] + 'hundra'
num -= hundreds * 100
if num == 0:
result += '' # do nothing
elif num == 1:
result += 'ett'
elif num <= 20:
result += NUM_STRING_SV[num]
elif num > 20:
tens = num % 10
ones = num - tens
if ones > 0:
result += NUM_STRING_SV[ones]
if tens > 0:
result += NUM_STRING_SV[tens]
return result
def pronounce_fractional_sv(num, places):
# fixed number of places even with trailing zeros
result = ""
place = 10
while places > 0:
# doesn't work with 1.0001 and places = 2: int(
# num*place) % 10 > 0 and places > 0:
result += " " + NUM_STRING_SV[int(num * place) % 10]
place *= 10
places -= 1
return result
def pronounce_whole_number_sv(num, scale_level=0):
if num == 0:
return ''
num = floor(num)
result = ''
last_triplet = num % 1000
if last_triplet == 1:
if scale_level == 0:
if result != '':
result += '' + 'ett'
else:
result += 'en'
elif scale_level == 1:
result += 'ettusen' + EXTRA_SPACE
else:
result += 'en ' + NUM_POWERS_OF_TEN[scale_level] + EXTRA_SPACE
elif last_triplet > 1:
result += pronounce_triplet_sv(last_triplet)
if scale_level == 1:
result += 'tusen' + EXTRA_SPACE
if scale_level >= 2:
result += NUM_POWERS_OF_TEN[scale_level]
if scale_level >= 2:
result += 'er' + EXTRA_SPACE # MiljonER
num = floor(num / 1000)
scale_level += 1
return pronounce_whole_number_sv(num, scale_level) + result
result = ""
if abs(num) >= 1000000000000000000000000: # cannot do more than this
return str(num)
elif num == 0:
return str(NUM_STRING_SV[0])
elif num < 0:
return "minus " + pronounce_number_sv(abs(num), places)
else:
if num == int(num):
return pronounce_whole_number_sv(num)
else:
whole_number_part = floor(num)
fractional_part = num - whole_number_part
result += pronounce_whole_number_sv(whole_number_part)
if places > 0:
result += " komma"
result += pronounce_fractional_sv(fractional_part, places)
return result
def pronounce_ordinal_sv(num):
# ordinals for 1, 3, 7 and 8 are irregular
# this produces the base form, it will have to be adapted for genus,
# casus, numerus
ordinals = ["noll", "första", "andra", "tredje", "fjärde", "femte",
"sjätte", "sjunde", "åttonde", "nionde", "tionde"]
tens = int(floor(num / 10.0)) * 10
ones = num % 10
if num < 0 or num != int(num):
return num
if num == 0:
return ordinals[num]
result = ""
if num > 10:
result += pronounce_number_sv(tens).rstrip()
if ones > 0:
result += ordinals[ones]
else:
result += 'de'
return result
def nice_time_sv(dt, speech=True, use_24hour=False, use_ampm=False):
"""
Format a time to a comfortable human format
For example, generate 'five thirty' for speech or '5:30' for
text display.
Args:
dt (datetime): date to format (assumes already in local timezone)
speech (bool): format for speech (default/True) or display (False)=Fal
use_24hour (bool): output in 24-hour/military or 12-hour format
use_ampm (bool): include the am/pm for 12-hour format
Returns:
(str): The formatted time string
"""
if use_24hour:
# e.g. "03:01" or "14:22"
string = dt.strftime("%H:%M")
else:
if use_ampm:
# e.g. "3:01 AM" or "2:22 PM"
string = dt.strftime("%I:%M %p")
else:
# e.g. "3:01" or "2:22"
string = dt.strftime("%I:%M")
if not speech:
return string
# Generate a speakable version of the time
speak = ""
if use_24hour:
if dt.hour == 1:
speak += "ett" # 01:00 is "ett" not "en"
else:
speak += pronounce_number_sv(dt.hour)
if not dt.minute == 0:
if dt.minute < 10:
speak += ' noll'
if dt.minute == 1:
speak += ' ett'
else:
speak += " " + pronounce_number_sv(dt.minute)
return speak # ampm is ignored when use_24hour is true
else:
hour = dt.hour
if not dt.minute == 0:
if dt.minute < 30:
if dt.minute != 15:
speak += pronounce_number_sv(dt.minute)
else:
speak += 'kvart'
if dt.minute == 1:
speak += ' minut över '
elif dt.minute != 10 and dt.minute != 5 and dt.minute != 15:
speak += ' minuter över '
else:
speak += ' över '
elif dt.minute > 30:
if dt.minute != 45:
speak += pronounce_number_sv((60 - dt.minute))
else:
speak += 'kvart'
if dt.minute == 1:
speak += ' minut i '
elif dt.minute != 50 and dt.minute != 55 and dt.minute != 45:
speak += ' minuter i '
else:
speak += ' i '
hour = (hour + 1) % 12
elif dt.minute == 30:
speak += 'halv '
hour = (hour + 1) % 12
if hour == 0 and dt.minute == 0:
return "midnatt"
if hour == 12 and dt.minute == 0:
return "middag"
# TODO: "half past 3", "a quarter of 4" and other idiomatic times
if hour == 0:
speak += pronounce_number_sv(12)
elif hour <= 13:
if hour == 1 or hour == 13: # 01:00 and 13:00 is "ett"
speak += 'ett'
else:
speak += pronounce_number_sv(hour)
else:
speak += pronounce_number_sv(hour - 12)
if use_ampm:
if dt.hour > 11:
if dt.hour < 18:
# 12:01 - 17:59 nachmittags/afternoon
speak += " på eftermiddagen"
elif dt.hour < 22:
# 18:00 - 21:59 abends/evening
speak += " på kvällen"
else:
# 22:00 - 23:59 nachts/at night
speak += " på natten"
elif dt.hour < 3:
# 00:01 - 02:59 nachts/at night
speak += " på natten"
else:
# 03:00 - 11:59 morgens/in the morning
speak += " på morgonen"
return speak
def nice_response_sv(text):
# check for months and call nice_ordinal_sv declension of ordinals
# replace "^" with "hoch" (to the power of)
words = text.split()
for idx, word in enumerate(words):
if word.lower() in months:
text = nice_ordinal_sv(text)
if word == '^':
wordNext = words[idx + 1] if idx + 1 < len(words) else ""
if wordNext.isnumeric():
words[idx] = "upphöjt till"
text = " ".join(words)
return text
def nice_ordinal_sv(text):
# check for months for declension of ordinals before months
# depending on articles/prepositions
normalized_text = text
words = text.split()
for idx, word in enumerate(words):
wordNext = words[idx + 1] if idx + 1 < len(words) else ""
wordPrev = words[idx - 1] if idx > 0 else ""
if word[-1:] == ".":
if word[:-1].isdecimal():
if wordNext.lower() in months:
word = pronounce_ordinal_sv(int(word[:-1]))
if wordPrev.lower() in ["om", "den", "från", "till",
"(från", "(om", "till"]:
word += "n"
elif wordPrev.lower() not in ["den"]:
word += "r"
words[idx] = word
normalized_text = " ".join(words)
return normalized_text

View File

@ -0,0 +1,358 @@
# -*- coding: utf-8 -*-
#
# Copyright 2017 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import unittest
import datetime
from mycroft.util.format import nice_number
from mycroft.util.format import nice_time
from mycroft.util.format import pronounce_number
# from mycroft.util.lang.format_sv import nice_response_sv
from mycroft.util.lang.format_sv import pronounce_ordinal_sv
# fractions are not capitalized for now
NUMBERS_FIXTURE_sv = {
1.435634: '1.436',
2: '2',
5.0: '5',
1234567890: '1234567890',
12345.67890: '12345.679',
0.027: '0.027',
0.5: 'en halv',
1.333: '1 och en tredjedel',
2.666: '2 och 2 tredjedelar',
0.25: 'en fjärdedel',
1.25: '1 och en fjärdedel',
0.75: '3 fjärdedelar',
1.75: '1 och 3 fjärdedelar',
3.4: '3 och 2 femtedelar',
16.8333: '16 och 5 sjättedelar',
12.5714: '12 och 4 sjundedelar',
9.625: '9 och 5 åttondelar',
6.777: '6 och 7 niondelar',
3.1: '3 och en tiondel',
2.272: '2 och 3 elftedelar',
5.583: '5 och 7 tolftedelar',
8.384: '8 och 5 trettondelar',
0.071: 'en fjortondel',
6.466: '6 och 7 femtondelar',
8.312: '8 och 5 sextondelar',
2.176: '2 och 3 sjuttondelar',
200.722: '200 och 13 artondelar',
7.421: '7 och 8 nittondelar',
0.05: 'en tjugondel'
}
# class TestNiceResponse(unittest.TestCase):
# def test_replace_ordinal(self):
# self.assertEqual(nice_response_sv("det er den 31. maj"),
# "det er den enogtredifte maj")
# self.assertEqual(nice_response_sv("Det begynder den 31. maj"),
# "Det begynder den enogtrefte maj")
# self.assertEqual(nice_response_sv("den 31. mai"),
# "den enogtrefte maj")
# self.assertEqual(nice_response_sv("10 ^ 2"), "ti to")
class TestNiceNumberFormat(unittest.TestCase):
def test_convert_float_to_nice_number(self):
for number, number_str in NUMBERS_FIXTURE_sv.items():
self.assertEqual(nice_number(number, lang="sv-se"), number_str,
'should format {} as {} and not {}'.format(
number, number_str,
nice_number(number, lang="sv-se")))
def test_specify_danominator(self):
self.assertEqual(nice_number(5.5, lang="sv-se",
denominators=[1, 2, 3]), '5 och en halv',
'should format 5.5 as 5 und ein halb not {}'.format(
nice_number(5.5, denominators=[1, 2, 3])))
self.assertEqual(nice_number(2.333, lang="sv-se", denominators=[1, 2]),
'2.333',
'should format 2,333 as 2.333 not {}'.format(
nice_number(2.333, lang="sv-se",
denominators=[1, 2])))
def test_no_speech(self):
self.assertEqual(nice_number(6.777, speech=False),
'6 7/9',
'should format 6.777 as 6 7/9 not {}'.format(
nice_number(6.777, lang="sv-se", speech=False)))
self.assertEqual(nice_number(6.0, speech=False),
'6',
'should format 6.0 as 6 not {}'.format(
nice_number(6.0, lang="sv-se", speech=False)))
class TestPronounceOrdinal(unittest.TestCase):
def test_convert_int_sv(self):
self.assertEqual(pronounce_ordinal_sv(0),
"noll")
self.assertEqual(pronounce_ordinal_sv(1),
"första")
self.assertEqual(pronounce_ordinal_sv(3),
"tredje")
self.assertEqual(pronounce_ordinal_sv(5),
"femte")
self.assertEqual(pronounce_ordinal_sv(21),
"tjugoförsta")
self.assertEqual(pronounce_ordinal_sv(2000),
"tvåtusende")
self.assertEqual(pronounce_ordinal_sv(1000),
"ettusende")
# self.assertEqual(pronounce_ordinal_sv(123456),
# "ethundredetreogtyvetusindefirehundredeseksog\
# halvtresende")
class TestPronounceNumber(unittest.TestCase):
def test_convert_int_sv(self):
self.assertEqual(pronounce_number(123456789123456789, lang="sv-se"),
"etthundratjugotrebiljarder "
"fyrahundrafemtiosexbiljoner "
"sjuhundraåttioniomiljarder "
"etthundratjugotremiljoner "
"fyrahundrafemtiosextusen "
"sjuhundraåttionio")
self.assertEqual(pronounce_number(1, lang="sv-se"), "en")
self.assertEqual(pronounce_number(10, lang="sv-se"), "tio")
self.assertEqual(pronounce_number(15, lang="sv-se"), "femton")
self.assertEqual(pronounce_number(20, lang="sv-se"), "tjugo")
self.assertEqual(pronounce_number(27, lang="sv-se"), "tjugosju")
self.assertEqual(pronounce_number(30, lang="sv-se"), "trettio")
self.assertEqual(pronounce_number(33, lang="sv-se"), "trettiotre")
self.assertEqual(pronounce_number(71, lang="sv-se"), "sjuttioen")
self.assertEqual(pronounce_number(80, lang="sv-se"), "åttio")
self.assertEqual(pronounce_number(74, lang="sv-se"), "sjuttiofyra")
self.assertEqual(pronounce_number(79, lang="sv-se"), "sjuttionio")
self.assertEqual(pronounce_number(91, lang="sv-se"), "nittioen")
self.assertEqual(pronounce_number(97, lang="sv-se"), "nittiosju")
self.assertEqual(pronounce_number(300, lang="sv-se"), "trehundra")
self.assertEqual(pronounce_number(10000001, lang="sv-se"),
"tiomiljoner en")
def test_convert_negative_int_sv(self):
self.assertEqual(pronounce_number(-1, lang="sv-se"),
"minus en")
self.assertEqual(pronounce_number(-10, lang="sv-se"),
"minus tio")
self.assertEqual(pronounce_number(-15, lang="sv-se"),
"minus femton")
self.assertEqual(pronounce_number(-20, lang="sv-se"),
"minus tjugo")
self.assertEqual(pronounce_number(-27, lang="sv-se"),
"minus tjugosju")
self.assertEqual(pronounce_number(-30, lang="sv-se"),
"minus trettio")
self.assertEqual(pronounce_number(-33, lang="sv-se"),
"minus trettiotre")
def test_convert_dacimals_sv(self):
self.assertEqual(pronounce_number(1.1, lang="sv-se", places=1),
"en komma en")
self.assertEqual(pronounce_number(1.234, lang="sv-se"),
"en komma två tre")
self.assertEqual(pronounce_number(21.234, lang="sv-se"),
"tjugoen komma två tre")
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=1),
"tjugoen komma två")
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=0),
"tjugoen")
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=3),
"tjugoen komma två tre fyra")
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=4),
"tjugoen komma två tre fyra noll")
self.assertEqual(pronounce_number(21.234, lang="sv-se", places=5),
"tjugoen komma två tre fyra noll noll")
self.assertEqual(pronounce_number(-1.234, lang="sv-se"),
"minus en komma två tre")
self.assertEqual(pronounce_number(-21.234, lang="sv-se"),
"minus tjugoen komma två tre")
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=1),
"minus tjugoen komma två")
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=0),
"minus tjugoen")
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=3),
"minus tjugoen komma två tre fyra")
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=4),
"minus tjugoen komma två tre fyra noll")
self.assertEqual(pronounce_number(-21.234, lang="sv-se", places=5),
"minus tjugoen komma två tre fyra noll noll")
# def nice_time(dt, lang="sv-se", speech=True, use_24hour=False,
# use_ampm=False):
class TestNiceDateFormat_sv(unittest.TestCase):
def test_convert_times_sv(self):
dt = datetime.datetime(2017, 1, 31, 13, 22, 3)
self.assertEqual(nice_time(dt, lang="sv-se"),
"tjugotvå minuter över ett")
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"tjugotvå minuter över ett på eftermiddagen")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
"01:22")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_ampm=True),
"01:22 PM")
self.assertEqual(nice_time(dt, lang="sv-se",
speech=False, use_24hour=True),
"13:22")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True, use_ampm=True),
"13:22")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=True),
"tretton tjugotvå")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=False),
"tretton tjugotvå")
dt = datetime.datetime(2017, 1, 31, 13, 0, 3)
self.assertEqual(nice_time(dt, lang="sv-se"), "ett")
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"ett på eftermiddagen")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
"01:00")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_ampm=True),
"01:00 PM")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True),
"13:00")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True, use_ampm=True),
"13:00")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=True),
"tretton")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=False),
"tretton")
dt = datetime.datetime(2017, 1, 31, 13, 2, 3)
self.assertEqual(nice_time(dt, lang="sv-se"), "två minuter över ett")
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"två minuter över ett på eftermiddagen")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
"01:02")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_ampm=True),
"01:02 PM")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True),
"13:02")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True, use_ampm=True),
"13:02")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=True),
"tretton noll två")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=False),
"tretton noll två")
dt = datetime.datetime(2017, 1, 31, 0, 2, 3)
self.assertEqual(nice_time(dt, lang="sv-se"), "två minuter över tolv")
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"två minuter över tolv på natten")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
"12:02")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_ampm=True),
"12:02 AM")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True),
"00:02")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True, use_ampm=True),
"00:02")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=True),
"noll noll två")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=False),
"noll noll två")
dt = datetime.datetime(2017, 1, 31, 12, 15, 9)
self.assertEqual(nice_time(dt, lang="sv-se"), "kvart över tolv")
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"kvart över tolv på eftermiddagen")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
"12:15")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_ampm=True),
"12:15 PM")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True),
"12:15")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True, use_ampm=True),
"12:15")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=True),
"tolv femton")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=False),
"tolv femton")
dt = datetime.datetime(2017, 1, 31, 19, 40, 49)
self.assertEqual(nice_time(dt, lang="sv-se"), "tjugo minuter i åtta")
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"tjugo minuter i åtta på kvällen")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False),
"07:40")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_ampm=True),
"07:40 PM")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True),
"19:40")
self.assertEqual(nice_time(dt, lang="sv-se", speech=False,
use_24hour=True, use_ampm=True),
"19:40")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=True),
"nitton fyrtio")
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True,
use_ampm=False),
"nitton fyrtio")
dt = datetime.datetime(2017, 1, 31, 1, 15, 00)
self.assertEqual(nice_time(dt, lang="sv-se", use_24hour=True),
"ett femton")
dt = datetime.datetime(2017, 1, 31, 1, 35, 00)
self.assertEqual(nice_time(dt, lang="sv-se"),
"tjugofem minuter i två")
dt = datetime.datetime(2017, 1, 31, 1, 45, 00)
self.assertEqual(nice_time(dt, lang="sv-se"), "kvart i två")
dt = datetime.datetime(2017, 1, 31, 4, 50, 00)
self.assertEqual(nice_time(dt, lang="sv-se"), "tio i fem")
dt = datetime.datetime(2017, 1, 31, 5, 55, 00)
self.assertEqual(nice_time(dt, lang="sv-se"), "fem i sex")
dt = datetime.datetime(2017, 1, 31, 5, 30, 00)
self.assertEqual(nice_time(dt, lang="sv-se", use_ampm=True),
"halv sex på morgonen")
if __name__ == "__main__":
unittest.main()