From d59ca8c464330ba79db2827880de198962f27ab5 Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Fri, 2 Jan 2026 12:22:17 +0500
Subject: [PATCH 1/7] Update Russian ClearSpeak and unicode rules
Improved Russian translations in ClearSpeak_Rules.yaml for mathematical terms related to fractions and exponents, ensuring more accurate and natural phrasing. Updated unicode-full.yaml to refine translations for the Apple logo, arrow symbols, and unknown character descriptions.
---
Rules/Languages/ru/ClearSpeak_Rules.yaml | 32 ++++++++++++------------
Rules/Languages/ru/unicode-full.yaml | 12 ++++-----
2 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/Rules/Languages/ru/ClearSpeak_Rules.yaml b/Rules/Languages/ru/ClearSpeak_Rules.yaml
index 50dd8fcb..f6d4871e 100644
--- a/Rules/Languages/ru/ClearSpeak_Rules.yaml
+++ b/Rules/Languages/ru/ClearSpeak_Rules.yaml
@@ -185,7 +185,7 @@
if: "$ClearSpeak_Fractions='OverEndFrac' or ($ClearSpeak_Fractions='EndFrac' and not( ($ClearSpeak_Fractions='Auto' or $ClearSpeak_Fractions='Ordinal' or $ClearSpeak_Fractions='EndFrac') and *[1][*[1][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and *[2][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))] ] and *[2][*[1][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or text()<20)] and *[2][self::m:mn][not(contains(., '.')) and ($ClearSpeak_Fractions='Ordinal' or (2<= text() and text()<=10))] ] ) )"
then:
- pause: short
- - t: "конец фракции" # phrase(7 over 8 'end fraction')
+ - t: "конец дроби" # phrase(7 over 8 'end fraction')
- pause: short
- # fraction with text or numbers followed by text in both numerator and denominator
@@ -213,28 +213,28 @@
if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='OverEndFrac'"
then:
- pause: short
- - t: "конец фракции" # phrase(7 over 8 'end fraction')
+ - t: "конец дроби" # phrase(7 over 8 'end fraction')
- pause: short
- name: default
tag: fraction
match: "."
replace:
- - ot: "квадратный тут 25" # phrase(5 is 'the' square toot of 25)
- - t: "фракция с числителем" # phrase(the 'fraction with numerator' 6)
+ - ot: "квадратный корень из 25" # phrase(5 is 'the' square root of 25)
+ - t: "дробь с числителем" # phrase(the 'fraction with numerator' 6)
- test:
if: not(IsNode(*[1], 'simple'))
then: [pause: medium]
- x: "*[1]"
- pause: medium
- - t: "и знаменатель" # phrase(the fraction with numerator 5 'and denominator' 8)
+ - t: "и знаменателем" # phrase(the fraction with numerator 5 'and denominator' 8)
- x: "*[2]"
- pause: long
- test:
if: "$ClearSpeak_Fractions='EndFrac' or $ClearSpeak_Fractions='GeneralEndFrac'"
then:
- pause: short
- - t: "конечной фракцией" # phrase(the fraction with 3 over 4 'end fraction')
+ - t: "конец дроби" # phrase(the fraction with 3 over 4 'end fraction')
- pause: short
# rules for functions raised to a power
@@ -263,7 +263,7 @@
- test:
if: "*[2][.='2']"
then: [t: "квадрат"] # phrase(25 equals 5 'squared')
- else: [t: "кубиками"] # phrase(625 equals 5 'cubed')
+ else: [t: "куб"] # phrase(625 equals 5 'cubed')
- name: function-power
tag: power
@@ -289,7 +289,7 @@
- "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]"
replace:
- x: "*[1]"
- - t: "поднято до показателя" # phrase(5 'raised to the exponent' x plus 1)
+ - t: "возведено в степень" # phrase(5 'raised to the exponent' x plus 1)
- pause: short
- x: "*[2]"
- pause: short
@@ -318,7 +318,7 @@
replace:
- x: "*[1]"
- bookmark: "*[2]/@id"
- - t: "кубик" # phrase(5 'cubed' equals 125)
+ - t: "куб" # phrase(5 'cubed' equals 125)
- name: simple-integer
tag: power
@@ -332,7 +332,7 @@
else: {x: "*[2]"}
- test:
if: "$ClearSpeak_Exponents != 'Ordinal'"
- then: [t: "власти"] # phrase(2 raised to the 'power' 7)
+ then: [t: "степени"] # phrase(2 raised to the 'power' 7)
- name: simple-negative-integer
tag: power
@@ -346,7 +346,7 @@
- x: "*[2]"
- test:
if: "$ClearSpeak_Exponents != 'Ordinal'"
- then: [t: "власти"] # phrase(2 raised to the 'power' 7)
+ then: [t: "степени"] # phrase(2 raised to the 'power' 7)
- name: simple-var
tag: power
@@ -358,7 +358,7 @@
- pronounce: [{text: "-th"}, {ipa: "θ"}, {sapi5: "th"}, {eloquence: "T"}]
- test:
if: "$ClearSpeak_Exponents != 'Ordinal'"
- then: [t: "власти"] # phrase(2 raised to the 'power' 7)
+ then: [t: "степени"] # phrase(2 raised to the 'power' 7)
# match nested exponent, where the nested exponent is has the power 2 or 3 (n below)
# [xxx]^n, - [xxx]^n, [xxx] var^n, -[xxx] var^n
@@ -383,9 +383,9 @@
- " ]"
replace:
- x: "*[1]"
- - t: "поднят до" # phrase(x 'raised to the' second power)
+ - t: "возведено в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- - t: "сила" # phrase(x raised to the second 'power')
+ - t: "степень" # phrase(x raised to the second 'power')
- # - [xxx]^n
name: nested-negative-squared-or-cubed
@@ -404,9 +404,9 @@
- " ]"
replace:
- x: "*[1]"
- - t: "поднят до" # phrase(x 'raised to the' second power)
+ - t: "возведено в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- - t: "сила" # phrase(x raised to the second 'power')
+ - t: "степень" # phrase(x raised to the second 'power')
- # [xxx] var^n
name: nested-var-squared-or-cubed
diff --git a/Rules/Languages/ru/unicode-full.yaml b/Rules/Languages/ru/unicode-full.yaml
index de912201..255b24c3 100644
--- a/Rules/Languages/ru/unicode-full.yaml
+++ b/Rules/Languages/ru/unicode-full.yaml
@@ -3584,7 +3584,7 @@
- "": [t: "правый топ"] # 0xf8fc (en: 'right brace top', google translation)
- "": [t: "правая скоба середина"] # 0xf8fd (en: 'right brace mid', google translation)
- "": [t: "правое скоба дно"] # 0xf8fe (en: 'right brace bottom', google translation)
- - "": [t: "логотип яблока"] # 0xf8ff (en: 'apple logo', google translation)
+ - "": [t: "логотип apple"] # 0xf8ff (en: 'apple logo', google translation)
- "ff": [t: "фф"] # 0xfb00 (en: 'ff', google translation)
- "fi": [t: "фигура"] # 0xfb01 (en: 'fi', google translation)
- "fl": [t: "флорида"] # 0xfb02 (en: 'fl', google translation)
@@ -3638,9 +3638,9 @@
- else: [t: "разделение"] # (en: 'divides', google translation)
- "~": [t: "тилде"] # 0xff5e (en: 'tilde', google translation)
- "¬": [t: "нет"] # 0xffe2 (en: 'not', google translation)
- - "←": [t: "левая стрелка"] # 0xffe9 (en: 'left arrow', google translation)
- - "↑": [t: "вверх стрелка"] # 0xffea (en: 'up arrow', google translation)
- - "→": [t: "правая стрелка"] # 0xffeb (en: 'right arrow', google translation)
- - "↓": [t: "вниз стрелка"] # 0xffec (en: 'down arrow', google translation)
+ - "←": [t: "стрелка влево"] # 0xffe9 (en: 'left arrow', google translation)
+ - "↑": [t: "стрелка вверх"] # 0xffea (en: 'up arrow', google translation)
+ - "→": [t: "стрелка вправо"] # 0xffeb (en: 'right arrow', google translation)
+ - "↓": [t: "стрелка вниз"] # 0xffec (en: 'down arrow', google translation)
- "": [t: "неизвестный или отсутствующий объект"] # 0xfffc (en: 'unknown or missing object', google translation)
- - "�": [t: "неизвестный или отсутствующий персонаж"] # 0xfffd (en: 'unknown or missing character', google translation)
+ - "�": [t: "неизвестный или отсутствующий символ"] # 0xfffd (en: 'unknown or missing character', google translation)
From fea42d6850867deb7898c09cedecf6da33d2e862 Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Fri, 2 Jan 2026 12:34:18 +0500
Subject: [PATCH 2/7] Update Russian math terminology translations
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Replaces several Russian translations for mathematical terms with more accurate or standard equivalents, such as changing 'реальные числа' to 'действительные числа' and 'негативных' to 'отрицательных'. Also updates the translation for 'imaginary part' to 'комплексная часть'.
---
Rules/Languages/ru/SharedRules/general.yaml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Rules/Languages/ru/SharedRules/general.yaml b/Rules/Languages/ru/SharedRules/general.yaml
index cb95e515..730eb11e 100644
--- a/Rules/Languages/ru/SharedRules/general.yaml
+++ b/Rules/Languages/ru/SharedRules/general.yaml
@@ -13,7 +13,7 @@
- test:
- if: "*[2][.='+']"
then: [t: "положительных"] # phrase(set of all 'positive' integers less than 10)
- else: [t: "негативных"] # phrase(set of all 'negative' integers less than minus 10)
+ else: [t: "отрицательных"] # phrase(set of all 'negative' integers less than minus 10)
- bookmark: "*[1]/@id"
- test:
- if: "*[1][.='ℂ']"
@@ -23,7 +23,7 @@
- else_if: "*[1][.='ℚ']"
then: [t: "рациональные числа"] # phrase('rational numbers' are the fraction of 2 integers)
- else_if: "*[1][.='ℝ']"
- then: [t: "реальные числа"] # phrase('real numbers' can be both positive and negative)
+ then: [t: "действительные числа"] # phrase('real numbers' can be both positive and negative)
- else_if: "*[1][.='ℤ']"
then: [t: "целые числа"] # phrase(positive 'integers' are natural numbers above 0)
else: [x: "*[1][text()]"] # shouldn't happen
@@ -63,7 +63,7 @@
- else_if: ".='ℚ'"
then: [t: "рациональные числа"] # phrase('the rational numbers' are the fraction of 2 integers)
- else_if: ".='ℝ'"
- then: [t: "реальные числа"] # phrase('the real numbers' can be both positive and negative)
+ then: [t: "действительные числа"] # phrase('the real numbers' can be both positive and negative)
- else_if: ".='ℤ'"
then: [t: "целые числа"] # phrase('the integers' are natural numbers above 0)
else: [x: "text()"] # shouldn't happen
@@ -73,14 +73,14 @@
match: "."
replace:
- bookmark: "@id"
- - t: "реальная часть" # phrase('the real part' of a complex number does not include the imaginary part)
+ - t: "действительная часть" # phrase('the real part' of a complex number does not include the imaginary part)
- name: imaginary-part
tag: imaginary-part
match: "."
replace:
- bookmark: "@id"
- - t: "воображаемая часть" # phrase('the imaginary part' is part of a complex number)
+ - t: "комплексная часть" # phrase('the imaginary part' is part of a complex number)
# rules on scripted vertical bars ('evaluated at')
- name: evaluated-at-2
From c2935174c31fc70596a6ba918dc425de519eedac Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Fri, 2 Jan 2026 13:10:59 +0500
Subject: [PATCH 3/7] Update Russian Unicode symbol translations
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Improved and corrected Russian translations for various Unicode symbols in unicode-full.yaml and unicode.yaml. Changes include more accurate mathematical and typographical terms, such as replacing 'dot dot dot' with 'точка точка точка', updating power-related terms to 'степени', and refining translations for punctuation and mathematical operators.
---
Rules/Languages/ru/unicode-full.yaml | 22 +++++++++++-----------
Rules/Languages/ru/unicode.yaml | 24 ++++++++++++------------
2 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/Rules/Languages/ru/unicode-full.yaml b/Rules/Languages/ru/unicode-full.yaml
index 255b24c3..4224bf75 100644
--- a/Rules/Languages/ru/unicode-full.yaml
+++ b/Rules/Languages/ru/unicode-full.yaml
@@ -306,7 +306,7 @@
# must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn'
# speak '…' as 'and so on...' unless expr starts with '…'
- "../*[1][.='…']"
- then: [t: "точка точка дот"] # (en: 'dot dot dot', google translation)
+ then: [t: "точка точка точка"] # (en: 'dot dot dot', google translation)
else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn'
if: "count(following-sibling::*) = 0"
then: [t: "и так далее"] # (en: 'and so on', google translation)
@@ -319,7 +319,7 @@
- "‴": [t: "тройной штрих"] # 0x2034 (en: 'triple prime')
- "‵": [t: "обратный штрих"] # 0x2035 (en: 'reversed prime')
- "‶": [t: "обратный двойной штрих"] # 0x2036 (en: 'reversed double prime')
- - "‷": [t: "обратный тройной простой"] # 0x2037 (en: 'reversed triple prime', google translation)
+ - "‷": [t: "обратный тройной штрих"] # 0x2037 (en: 'reversed triple prime', google translation)
- "‸": [t: "в"] # 0x2038 (en: 'to the', google translation)
- "‹": [t: "одиночный левый угол угла цитата"] # 0x2039 (en: 'single left pointing angle quote mark', google translation)
- "›": [t: "одиночный правый угол цитата цитата"] # 0x203a (en: 'single right pointing angle quote mark', google translation)
@@ -331,20 +331,20 @@
- "‿": [t: "под галстуком"] # 0x203F (en: 'under tie', google translation)
- "⁀": [t: "галстук"] # 0x2040 (en: 'tie', google translation)
- "⁎": [t: "низкий звездочка"] # 0x204e (en: 'low asterisk', google translation)
- - "⁏": [t: "обратный полуколон"] # 0x204f (en: 'reversed semicolon', google translation)
+ - "⁏": [t: "обратная точка с запятой"] # 0x204f (en: 'reversed semicolon', google translation)
- "⁐": [t: "закрыть"] # 0x2050 (en: 'close up', google translation)
- "⁑": [t: "две вертикальные звездочки"] # 0x2051 (en: 'two vertical asterisks', google translation)
- "⁒": [t: "коммерческий минус знак"] # 0x2052 (en: 'commercial minus sign', google translation)
- "⁗": [t: "четырехкратный prime"] # 0x2057 (en: 'quadruple prime', google translation)
- "": [t: ""] # 0x2060
- - "⁰": [t: "к нулевой власти"] # 0x2070 (en: 'to the zeroth power', google translation)
+ - "⁰": [t: "к нулевой степени"] # 0x2070 (en: 'to the zeroth power', google translation)
- "ⁱ": [t: "к силе эйхт"] # 0x2071 (en: 'to the eihth power', google translation)
- - "⁴": [t: "к четвертой силе"] # 0x2074 (en: 'to the fourth power', google translation)
- - "⁵": [t: "к пятой силе"] # 0x2075 (en: 'to the fifth power', google translation)
- - "⁶": [t: "к шестой силе"] # 0x2076 (en: 'to the sixth power', google translation)
- - "⁷": [t: "к седьмой власти"] # 0x2077 (en: 'to the seventh power', google translation)
- - "⁸": [t: "к ath power"] # 0x2078 (en: 'to the eighth power', google translation)
- - "⁹": [t: "к девятой силе"] # 0x2079 (en: 'to the ninth power', google translation)
+ - "⁴": [t: "к четвёртой степени"] # 0x2074 (en: 'to the fourth power', google translation)
+ - "⁵": [t: "к пятой степени"] # 0x2075 (en: 'to the fifth power', google translation)
+ - "⁶": [t: "к шестой степени"] # 0x2076 (en: 'to the sixth power', google translation)
+ - "⁷": [t: "к седьмой степении"] # 0x2077 (en: 'to the seventh power', google translation)
+ - "⁸": [t: "к восьмой степени"] # 0x2078 (en: 'to the eighth power', google translation)
+ - "⁹": [t: "к девятой степени"] # 0x2079 (en: 'to the ninth power', google translation)
- "⁺": [t: "superscript plus sign"] # 0x207a (google translation)
- "⁻": [t: "superscript минус"] # 0x207b (en: 'superscript minus', google translation)
- "⁼": [t: "superscript equals sign"] # 0x207c (google translation)
@@ -875,7 +875,7 @@
then: [t: "является"] # (en: 'is', google translation)
- t: "приблизительно равно или равно" # (en: 'approximately equal or equal to')
- "≋": [t: "тройная тильда"] # 0x224b (en: 'triple tilde')
- - "≌": [t: "все равно"] # 0x224c (en: 'are all equal to')
+ - "≌": [t: "конгруэнтно"] # 0x224c (en: 'are all equal to')
- "≍": # 0x224d
- test:
if: "$Verbosity!='Terse'"
diff --git a/Rules/Languages/ru/unicode.yaml b/Rules/Languages/ru/unicode.yaml
index 2b791563..ba904886 100644
--- a/Rules/Languages/ru/unicode.yaml
+++ b/Rules/Languages/ru/unicode.yaml
@@ -73,9 +73,9 @@
else: [t: "восклицательный знак"] # 0x21 (en: 'exclamation point', google translation)
else: [t: "факториал"] # 0x21 (en: 'factorial', google translation)
- - "\"": [t: "цитата"] # 0x22 (en: 'quotation mark', google translation)
+ - "\"": [t: "кавычка"] # 0x22 (en: 'quotation mark', google translation)
- "#": [t: "число"] # 0x23 (en: 'number', google translation)
- - "$": [t: "доллары"] # 0x24 (en: 'dollars', google translation)
+ - "$": [t: "доллар"] # 0x24 (en: 'dollars', google translation)
- "%": [t: "процент"] # 0x25 (en: 'percent')
- "&": [t: "ampersand"] # 0x26 (google translation)
- "'": [t: "штрих"] # 0x27 (en: 'apostrophe')
@@ -99,8 +99,8 @@
- "*": # 0x2a
test:
if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']"
- then: [t: "звезда"] # 0x2a (en: 'star', google translation)
- else: [t: "раз"] # 0x2a (en: 'times', google translation)
+ then: [t: "звёздочка"] # 0x2a (en: 'star', google translation)
+ else: [t: "умножить"] # 0x2a (en: 'times', google translation)
- "+": [t: "плюс"] # 0x2b (en: 'plus')
- ",": # 0x2c
# the following deals with the interaction of "," with "…" which sometimes wants the ',' to be silent
@@ -128,7 +128,7 @@
else: [t: "точка"] # (en: 'dot', google translation)
- "/": [t: "разделить на"] # 0x2f (en: 'divided by')
- ":": [t: "двоеточие"] # 0x3a (en: 'colon')
- - ";": [t: "полуколон"] # 0x3b (en: 'semicolon', google translation)
+ - ";": [t: "точка с запятой"] # 0x3b (en: 'semicolon', google translation)
- "<": # 0x3c
- test:
if: "$Verbosity!='Terse'"
@@ -215,7 +215,7 @@
- "×": # 0xd7
- test:
if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'"
- then: [t: "раз"] # (en: 'times', google translation)
+ then: [t: "умножить"] # (en: 'times', google translation)
else_test:
if: $ClearSpeak_MultSymbolX = 'By'
then: [t: "к"] # (en: 'by', google translation)
@@ -292,7 +292,7 @@
# must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn'
# speak '…' as 'and so on...' unless expr starts with '…'
- "../*[1][.='…']"
- then: [t: "точка точка дот"] # (en: 'dot dot dot', google translation)
+ then: [t: "точка точка точка"] # (en: 'dot dot dot', google translation)
else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn'
if: "count(following-sibling::*) = 0"
then: [t: "и так далее"] # (en: 'and so on', google translation)
@@ -320,7 +320,7 @@
- "ℋℛℓ": # 0x210b
- t: "сценарий" # (en: 'script', google translation)
- spell: "translate('.', 'ℋℛℓ', 'HRl')"
- - "ℎ": [t: "планка постоянная"] # 0x210e (en: 'planck constant', google translation)
+ - "ℎ": [t: "постоянная планка"] # 0x210e (en: 'planck constant', google translation)
- "ℜ": # 0x211c
- t: "фрактур" # (en: 'fraktur', google translation)
- spell: "'R'"
@@ -333,15 +333,15 @@
- spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')"
- "←": [t: "стрелка влево"] # 0x2190 (en: 'leftwards arrow', google translation)
- - "↑": [t: "вверх стрелой"] # 0x2191 (en: 'upwards arrow', google translation)
+ - "↑": [t: "стрелка вверх"] # 0x2191 (en: 'upwards arrow', google translation)
- "→": # 0x2192
- test:
if: "ancestor::*[2][self::m:limit]"
then: [t: "подходы"] # (en: 'approaches', google translation)
- else: [t: "правая стрелка"] # (en: 'right arrow', google translation)
+ else: [t: "стрелка вправо"] # (en: 'right arrow', google translation)
- - "↓": [t: "вниз стрелы"] # 0x2193 (en: 'downwards arrow', google translation)
- - "⇒": [t: "права двойная стрелка"] # 0x21d2 (en: 'rightwards double arrow', google translation)
+ - "↓": [t: "стрелка вниз"] # 0x2193 (en: 'downwards arrow', google translation)
+ - "⇒": [t: "двойная стрелка вправо"] # 0x21d2 (en: 'rightwards double arrow', google translation)
- "∀": [t: "для всех"] # 0x2200 (en: 'for all')
- "∂": # 0x2202
- test:
From f34729a3aeb636cd79cde081334adcd9195f92d2 Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Fri, 20 Feb 2026 02:10:20 +0300
Subject: [PATCH 4/7] Improve Russian ClearSpeak translations
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Update Russian ClearSpeak rules and shared language resources: adjust terminology, grammar and verbosity across multiple rule files. Key changes include: proper Russian translations for roots (e.g. "конец корня"), powers/exponents ("степень", "возведено в степень", "в" for '^' connectors), fractions ("дробь"), sets/interval wording ("множество", "включая"), navigation labels (use "строка"/"к началу строки"/"к концу строки", "лево"/"текущий"), Unicode symbol names (more natural bracket/brace/tilde/caret terms), log and calculus terms ("логарифм", "натуральный логарифм", "ротор"), intent mappings and function names localized, and fixes to ordinal/plural forms and other lexical corrections. Affected files: Rules/Languages/ru/ClearSpeak_Rules.yaml, Rules/Languages/ru/SharedRules/calculus.yaml, Rules/Languages/ru/SharedRules/default.yaml, Rules/Languages/ru/definitions.yaml, Rules/Languages/ru/navigate.yaml, Rules/Languages/ru/unicode.yaml.
---
Rules/Languages/ru/ClearSpeak_Rules.yaml | 96 ++++++++++----------
Rules/Languages/ru/SharedRules/calculus.yaml | 4 +-
Rules/Languages/ru/SharedRules/default.yaml | 10 +-
Rules/Languages/ru/definitions.yaml | 80 ++++++++--------
Rules/Languages/ru/navigate.yaml | 34 +++----
Rules/Languages/ru/unicode.yaml | 46 +++++-----
6 files changed, 135 insertions(+), 135 deletions(-)
diff --git a/Rules/Languages/ru/ClearSpeak_Rules.yaml b/Rules/Languages/ru/ClearSpeak_Rules.yaml
index f6d4871e..610e3ba3 100644
--- a/Rules/Languages/ru/ClearSpeak_Rules.yaml
+++ b/Rules/Languages/ru/ClearSpeak_Rules.yaml
@@ -34,7 +34,7 @@
replace:
- test:
if: "$Verbosity!='Terse'"
- then: [t: "а"] # phrase('the' square root of 25)
+ then: [t: ""] # phrase('the' square root of 25)
- test:
if: $ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd'
then:
@@ -53,7 +53,7 @@
- if: "$ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'"
then:
- pause: short
- - t: "end root" # phrase(the square root of x 'end root')
+ - t: "конец корня" # phrase(the square root of x 'end root')
- pause: medium
- else_if: "IsNode(*[1], 'simple')"
then: [pause: short]
@@ -65,7 +65,7 @@
replace:
- test:
if: "$Verbosity!='Terse'"
- then: [t: "квадратный корень 36"] # phrase(6 is 'the' square root of 36)
+ then: [t: ""] # phrase(6 is 'the' square root of 36)
- test:
if: $ClearSpeak_Roots = 'PosNegSqRoot' or $ClearSpeak_Roots = 'PosNegSqRootEnd'
then:
@@ -82,7 +82,7 @@
- if: "*[2][.='2']"
then: [t: "квадратный корень"] # phrase(5 is the 'square root' of 25)
- else_if: "*[2][.='3']"
- then: [t: "корень куба"] # phrase(5 is the 'cube root' of 625)
+ then: [t: "кубический корень"] # phrase(5 is the 'cube root' of 625)
- else: [x: "ToOrdinal(*[2])", t: "корень"] # phrase(the square 'root' of 25)
else:
- test:
@@ -100,7 +100,7 @@
if: $ClearSpeak_Roots = 'RootEnd' or $ClearSpeak_Roots = 'PosNegSqRootEnd'
then:
- pause: short
- - t: "end root" # phrase(start the fifth root of x 'end root')
+ - t: "конец корня" # phrase(start the fifth root of x 'end root')
- pause: medium
else_test:
if: IsNode(*[1], 'simple')
@@ -136,7 +136,7 @@
BaseNode(*[1])[contains(@data-intent-property, ':unit') or (self::m:mrow and self::*[3][contains(@data-intent-property, ':unit')])]"
replace:
- x: "*[1]"
- - t: "перемещение" # phrase('5 meters 'per' second)
+ - t: "в" # phrase('5 meters 'per' second)
- x: "*[2]"
- name: common-fraction
@@ -175,7 +175,7 @@
then:
- test:
if: "$Verbosity!='Terse'"
- then: [ot: "а"]
+ then: [ot: ""]
- t: "дробь" # phrase(the 'fraction' with 3 over 4)
- x: "*[1]"
- t: "над" # phrase(the fraction 3 'over' 4)
@@ -220,7 +220,7 @@
tag: fraction
match: "."
replace:
- - ot: "квадратный корень из 25" # phrase(5 is 'the' square root of 25)
+ - ot: "" # phrase(5 is 'the' square root of 25)
- t: "дробь с числителем" # phrase(the 'fraction with numerator' 6)
- test:
if: not(IsNode(*[1], 'simple'))
@@ -262,8 +262,8 @@
- bookmark: "*[2]/@id"
- test:
if: "*[2][.='2']"
- then: [t: "квадрат"] # phrase(25 equals 5 'squared')
- else: [t: "куб"] # phrase(625 equals 5 'cubed')
+ then: [t: "в квадрате"] # phrase(25 equals 5 'squared')
+ else: [t: "в кубе"] # phrase(625 equals 5 'cubed')
- name: function-power
tag: power
@@ -272,13 +272,13 @@
replace:
- test:
if: "$Verbosity!='Terse'"
- then: [t: "а"] # phrase('the' third power of 2)
+ then: [t: ""] # phrase('the' third power of 2)
- bookmark: "*[2]/@id"
- test:
if: "*[2][self::m:mn][not(contains(., '.'))]"
then: [x: "ToOrdinal(*[2])"]
else: [x: "*[2]"]
- - t: "сила" # phrase(the third 'power of' 6)
+ - t: "степень" # phrase(the third 'power of' 6)
- pause: short
- x: "*[1]"
@@ -293,14 +293,14 @@
- pause: short
- x: "*[2]"
- pause: short
- - t: "конечный показатель" # phrase(5 raised to the exponent x plus 1 'end exponent')
+ - t: "конец показателя" # phrase(5 raised to the exponent x plus 1 'end exponent')
- name: AfterPower-default
tag: power
match: "$ClearSpeak_Exponents = 'AfterPower'"
replace:
- x: "*[1]"
- - t: "поднялся на власть" # phrase(x is 'raised to the power' 4)
+ - t: "возведено в степень" # phrase(x is 'raised to the power' 4)
- x: "*[2]"
- pause: short
@@ -310,7 +310,7 @@
replace:
- x: "*[1]"
- bookmark: "*[2]/@id"
- - t: "квадрат" # phrase(7 'squared' equals 49)
+ - t: "в квадрате" # phrase(7 'squared' equals 49)
- name: cubed
tag: power
@@ -318,14 +318,14 @@
replace:
- x: "*[1]"
- bookmark: "*[2]/@id"
- - t: "куб" # phrase(5 'cubed' equals 125)
+ - t: "в кубе" # phrase(5 'cubed' equals 125)
- name: simple-integer
tag: power
match: "*[2][self::m:mn][not(contains(., '.'))]"
replace:
- x: "*[1]"
- - t: "до" # phrase(2 raised 'to the' power 7)
+ - t: "в" # phrase(2 raised 'to the' power 7)
- test:
if: "*[2][.>0]"
then: {x: "ToOrdinal(*[2])"}
@@ -342,7 +342,7 @@
- " ]"
replace:
- x: "*[1]"
- - t: "до" # phrase(2 raised 'to the' power 7)
+ - t: "в" # phrase(2 raised 'to the' power 7)
- x: "*[2]"
- test:
if: "$ClearSpeak_Exponents != 'Ordinal'"
@@ -353,7 +353,7 @@
match: "*[2][self::m:mi][string-length(.)=1]"
replace:
- x: "*[1]"
- - t: "до" # phrase(3 raised 'to the' power 7)
+ - t: "в" # phrase(3 raised 'to the' power 7)
- x: "*[2]"
- pronounce: [{text: "-th"}, {ipa: "θ"}, {sapi5: "th"}, {eloquence: "T"}]
- test:
@@ -383,7 +383,7 @@
- " ]"
replace:
- x: "*[1]"
- - t: "возведено в" # phrase(x 'raised to the' second power)
+ - t: "в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- t: "степень" # phrase(x raised to the second 'power')
@@ -404,7 +404,7 @@
- " ]"
replace:
- x: "*[1]"
- - t: "возведено в" # phrase(x 'raised to the' second power)
+ - t: "в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- t: "степень" # phrase(x raised to the second 'power')
@@ -427,9 +427,9 @@
- " ]"
replace:
- x: "*[1]"
- - t: "поднят до" # phrase(x 'raised to the' second power)
+ - t: "в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- - t: "сила" # phrase(x raised to the second 'power')
+ - t: "степень" # phrase(x raised to the second 'power')
- # -[xxx] var^n
name: nested-negative-var-squared-or-cubed
@@ -452,9 +452,9 @@
- " ]"
replace:
- x: "*[1]"
- - t: "поднят до" # phrase(x 'raised to the' second power)
+ - t: "в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- - t: "сила" # phrase(x raised to the second 'power')
+ - t: "степень" # phrase(x raised to the second 'power')
- name: default-exponent-power
tag: power
@@ -462,20 +462,20 @@
- "*[2][self::m:power or self::m:power or self::m:mrow[m:power]]"
replace:
- x: "*[1]"
- - t: "поднят до экспонента" # phrase(x is 'raised to the exponent')
+ - t: "возведено в степень" # phrase(x is 'raised to the exponent')
- pause: short
- x: "*[2]"
- pause: short
- - t: "конечный показатель" # phrase(and now 'end exponent' has been reached)
+ - t: "конец показателя" # phrase(and now 'end exponent' has been reached)
- name: default
tag: power
match: "."
replace:
- x: "*[1]"
- - t: "поднят до" # phrase(x 'raised to the' second power)
+ - t: "возведено в" # phrase(x 'raised to the' second power)
- x: "*[2]"
- - t: "сила" # phrase(x raised to the second 'power')
+ - t: "степень" # phrase(x raised to the second 'power')
#
# Some rules on mrows
@@ -484,11 +484,11 @@
name: ClearSpeak-absolute-value
tag: absolute-value
match: "."
- variables: [WordToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', 'cardinality', 'absolute value')"]
+ variables: [WordToSay: "IfThenElse($ClearSpeak_AbsoluteValue = 'Cardinality', ', 'мощность', 'модуль')"]
replace:
- test:
if: "$Verbosity!='Terse'"
- then: [t: "а"] # phrase('the' absolute value of 25)
+ then: [t: ""] # phrase('the' absolute value of 25)
- x: "$WordToSay"
- t: "из" # phrase(the absolute value 'of' 25)
- x: "*[1]"
@@ -506,24 +506,24 @@
replace:
- test:
- if: "count(*)=0"
- then: [t: "пустой набор"] # phrase('the empty set')
+ then: [t: "пустое множество"] # phrase('the empty set')
- else_if: "count(*)=2"
then:
- test:
if: "$Verbosity!='Terse'"
then: [t: "а"] # phrase('the' empty set)
- - t: "пустой набор" # phrase(the 'empty set')
+ - t: "пустое множество" # phrase(the 'empty set')
- else_if: "count(*[1]/*)=3 and *[1]/*[2][self::m:mo][.=':' or .='|' or .='∣']"
then:
- test:
if: "$Verbosity!='Terse'"
then: [t: "а"] # phrase('the' set of all integers)
- - t: "набор чисел" # phrase(this is a 'set of' numbers)
+ - t: "множество" # phrase(this is a 'set of' numbers)
- test:
if: $ClearSpeak_Sets != 'woAll'
then: [t: "всех"] # phrase(the set of 'all' integers)
- x: "*[1]/*[1]"
- - t: "так что" # phrase(the set S 'such that' x is less than y)
+ - t: "таких, что" # phrase(the set S 'such that' x is less than y)
- x: "*[1]/*[3]"
else:
- test:
@@ -532,7 +532,7 @@
- test:
if: "$Verbosity!='Terse'"
then: [t: "а"] # phrase('the' set of integers)
- - t: "набор" # phrase(this is a 'set' of integers)
+ - t: "множество" # phrase(this is a 'set' of integers)
- x: "*[1]"
- # intervals are controlled by a ClearSpeak Preference -- parens/brackets don't have to match, so we avoid IsBracketed
@@ -557,7 +557,7 @@
- test:
if: "starts-with(name(.), 'open')"
then: [t: "не"] # phrase(the interval from a to b 'not' including b)
- - t: "в том числе " # phrase(the interval from a to b not 'including' b)
+ - t: "включая " # phrase(the interval from a to b not 'including' b)
- x: "*[1]"
# logic to deal with [not] arg #1
- test:
@@ -590,7 +590,7 @@
- "count(*[1]/*)=1 and count(*)=2"
replace:
- x: "*[1]/*[1]/*" # mtable/mtr/mtd
- - t: "выберите" # phrase(the binomial coefficient n 'choose' m)
+ - t: "по" # phrase(the binomial coefficient n 'choose' m)
- x: "*[2]/*[1]/*"
- name: ClearSpeak-default
@@ -599,7 +599,7 @@
variables: [NextLineIsContinuedRow: "following-sibling::*[1][contains(@data-intent-property, ':continued-row:')]"]
replace:
- pause: medium
- - t: "ряд" # phrase(the first 'row' of a matrix)
+ - t: "строка" # phrase(the first 'row' of a matrix)
- x: "count(preceding-sibling::*)+1"
- test:
if: .[self::m:mlabeledtr]
@@ -626,19 +626,19 @@
if: "$log_is_simple"
then_test:
- if: "*[1][.='log']"
- then: [t: "log"] # phrase(the 'log' of x)
+ then: [t: "логарифм"] # phrase(the 'log' of x)
- else_if: $ClearSpeak_Log = 'LnAsNaturalLog'
- then: [t: "натуральный журнал"] # phrase(the 'natural log' of the product of 2 numbers)
+ then: [t: "натуральный логарифм"] # phrase(the 'natural log' of the product of 2 numbers)
else: [spell: "'ln'"]
else:
- test:
if: "$Verbosity!='Terse' and not(log_is_simple)"
- then: [t: "а"] # phrase('the' square root of 25)
+ then: [t: ""] # phrase('the' square root of 25)
- test:
- if: "*[1][.='log']"
- then: [t: "бревно"]
+ then: [t: "логарифм"]
- else_if: $ClearSpeak_Log = 'LnAsNaturalLog'
- then: [t: "естественный журнал"] # phrase(the 'natural log' of x)
+ then: [t: "натуральный логарифм"] # phrase(the 'natural log' of x)
else: [spell: "'ln'"]
- t: "из" # phrase(the natural log 'of' x)
- pause: short
@@ -661,19 +661,19 @@
- if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'"
then: [t: "случай"] # phrase(this is the first 'case' of three cases)
- else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None'" # already dealt with Auto/Case
- then: [t: "линия"] # phrase(this is the first 'line' of three lines)
+ then: [t: "строка"] # phrase(this is the first 'line' of three lines)
- else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'"
then: [t: "ограничение"] # phrase(this is the first 'constraint' of three constraints)
- else_if: "$ClearSpeak_MultiLineLabel = 'Equation'"
then: [t: "уравнение"] # phrase(this is the first 'equation' of three equations)
- else_if: "$ClearSpeak_MultiLineLabel = 'Row'"
- then: [t: "ряд"] # phrase(this is the first 'row' of three rows)
+ then: [t: "строка"] # phrase(this is the first 'row' of three rows)
- else_if: "$ClearSpeak_MultiLineLabel = 'Step'"
then: [t: "шаг"] # phrase(this is the first 'step' of three steps)
# else 'None -- don't say anything'
- test:
- if: "$LineCount != 1"
- then: [ct: "s"] # plural # phrase(shown by the letter 's')
+ then: [ct: "ов"] # plural # phrase(shown by the letter 's')
- pause: short
- x: "*"
- pause: long
@@ -691,7 +691,7 @@
- if: "($ClearSpeak_MultiLineLabel = 'Auto' and parent::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'"
then: [t: "случае"] # phrase(in this 'case' x is not equal to y)
- else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line'" # already dealt with Auto/Case
- then: [t: "линия"] # phrase(the straight 'line' between x and y)
+ then: [t: "строка"] # phrase(the straight 'line' between x and y)
- else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'"
then: [t: "ограничение"] # phrase(there is a 'constraint' on possible values)
- else_if: "$ClearSpeak_MultiLineLabel = 'Equation'"
diff --git a/Rules/Languages/ru/SharedRules/calculus.yaml b/Rules/Languages/ru/SharedRules/calculus.yaml
index a5ad70a0..07e06205 100644
--- a/Rules/Languages/ru/SharedRules/calculus.yaml
+++ b/Rules/Languages/ru/SharedRules/calculus.yaml
@@ -10,7 +10,7 @@
then:
- test:
if: "$Verbosity!='Terse'"
- then: [t: "из"] # phrase(function 'of' one variable) -- note OneCore voices spell out "div"
+ then: [t: "от"] # phrase(function 'of' one variable) -- note OneCore voices spell out "div"
- test:
if: "not(IsNode(*[1], 'leaf'))"
then: [pause: short]
@@ -33,7 +33,7 @@
tag: curl
match: "count(*) = 1"
replace:
- - t: "керл" # phrase(the 'curl of' a field)
+ - t: "ротор" # phrase(the 'curl of' a field)
- test:
if: "$Verbosity!='Terse'"
then: [t: "из"] # phrase(function 'of' one variable) -- note OneCore voices spell out "div"
diff --git a/Rules/Languages/ru/SharedRules/default.yaml b/Rules/Languages/ru/SharedRules/default.yaml
index fa8293ab..eb3dda3c 100644
--- a/Rules/Languages/ru/SharedRules/default.yaml
+++ b/Rules/Languages/ru/SharedRules/default.yaml
@@ -87,7 +87,7 @@
- "not(ancestor::*[name() != 'mrow'][1]/self::m:fraction)" # FIX: can't test for mrow -- what should be used???
replace:
- x: "*[1]"
- - t: "фракция x " # phrase("the fraction x 'over' y")
+ - t: "дробь x " # phrase("the fraction x 'over' y")
- x: "*[2]"
- pause: short
@@ -101,7 +101,7 @@
- test:
if: "not(IsNode(*[1],'leaf'))"
then: [pause: short]
- - t: "фракция x " # phrase("the fraction x 'over' y")
+ - t: "дробь x " # phrase("the fraction x 'over' y")
- test:
if: "not(IsNode(*[2],'leaf'))"
then: [pause: short]
@@ -109,7 +109,7 @@
- pause: short
- test:
if: "$Impairment = 'Blindness'"
- then: [t: "начало фракции x над y "] # phrase("start of fraction x over y 'end over'")
+ then: [t: "начало дроби x над y "] # phrase("start of fraction x over y 'end over'")
- pause: medium
@@ -419,7 +419,7 @@
- test:
if: count(*)=1
then: [t: "строкой"] # phrase(the table with 1 'row')
- else: [t: "рядами"] # phrase(the table with 3 'rows')
+ else: [t: "строками"] # phrase(the table with 3 'rows')
- t: "и " # phrase(the table with 3 rows 'and' 4 columns)
- x: "count(*[1]/*)"
- test:
@@ -436,7 +436,7 @@
match: "."
replace:
- pause: medium
- - t: "ряд" # phrase(the first 'row' of a matrix)
+ - t: "строка" # phrase(the first 'row' of a matrix)
- x: "count(preceding-sibling::*)+1"
- test:
if: .[self::m:mlabeledtr]
diff --git a/Rules/Languages/ru/definitions.yaml b/Rules/Languages/ru/definitions.yaml
index 5da10e97..bf3ec83b 100644
--- a/Rules/Languages/ru/definitions.yaml
+++ b/Rules/Languages/ru/definitions.yaml
@@ -10,44 +10,44 @@
# for readability, spaces can be used around any of the delimiter characters
# Note: if there are multiple fixities, the first one is used if the fixity is not given in the intent
- IntentMappings: {
- "indexed-by": "infix= ; sub; end sub: end sub: end subscript",
+ "indexed-by": "infix= ; индекс; конец индекса: конец индекса: конец индекса",
"modified-variable": "silent= ",
- "say-super": "infix=super: superscript: superscript", # used with 'mo' for superscripts (e.g, "<")
+ "say-super": "infix=верхний индекс: верхний индекс: верхний индекс", # used with 'mo' for superscripts (e.g, "<")
"skip-super": "silent=", # used with 'mo' for superscripts (e.g, "*")
- "absolute-value": "function= ; absolute value: the absolute value: the absolute value; end absolute value",
- "binomial": "infix=binomial; choose; end binomial",
- # "closed-interval": "other=closed-interval; from,to; end closed-interval",
- "greatest-common-divisor": "function=gcd: the gcd: the greatest common divisor",
- "imaginary-part": "function=imaginary part, the imaginary part, the imaginary part",
- "least-common-multiple": "function=lcm:the lcm:the least common multiple",
- # "large-op": "infix=over || other=from,to",
- "limit": "prefix=limit as: the limit as: the limit as",
- "lim-sup": "prefix=lim sup as: the limit superior as: the limit superior as",
- "lim-inf": "prefix=lim inf as: the limit inferior as : the limit inferior as",
- "logarithm-with-base": "prefix=log base: the log base: the log base",
- "natural-logarithm": "function=l n: natural log: natural log",
- "minus": "infix=minus || prefix=negative",
- "plus": "infix=plus || prefix=positive",
+ "absolute-value": "function= ; модуль: модуль: модуль; конец модуля",
+ "binomial": "infix=бином; по; конец бинома",
+ # "closed-interval": "other=closed-interval; от,до; end closed-interval",
+ "greatest-common-divisor": "function=нод: нод: наибольший общий делитель",
+ "imaginary-part": "function=мнимая часть, мнимая часть, мнимая часть",
+ "least-common-multiple": "function=нок:нок:наименьшее общее кратное",
+ # "large-op": "infix=над || other=от,до",
+ "limit": "prefix=придел при: придел при: придел при",
+ "lim-sup": "prefix=верхний предел при: верхний предел при: верхний предел при",
+ "lim-inf": "prefix=нижний предел при: нижний предел при: нижний предел при",
+ "logarithm-with-base": "prefix=логарифм по основанию: логарифм по основанию: логарифм по основанию",
+ "natural-logarithm": "function=l n: натуральный логарифм: натуральный логарифм",
+ "minus": "infix=минус || prefix=отрицательное",
+ "plus": "infix=плюс || prefix=положительное",
# "pochhammer": "infix=permutations of", # arguments are in reverse order, so can't work here
- "real-part": "function=the real part",
-
- "transpose": "postfix=transpose || function=transpose",
- "norm": "function=; norm: norm: norm; end norm",
- "trace": "function=;trace : trace: the trace; end trace",
- "dimension": "function=; dimension : dimension: the dimension; end dimension",
- "homomorphism": "function= ; homomorphism : homomorphism: the homomorphism; end homomorphism",
- "kernel": "function= ; kernel : kernel: the kernel; end kernel",
- "vector": "function= ; vector || prefix=vector",
- "cross-product": "infix=cross: cross product: cross product",
- "dot-product": "infix=dot: dot product: dot:dot product",
-
- "divergence": "function= ; dihv: divergence: divergence; end divergence",
- "curl": "function= ; curl; end curl",
- "gradient": "function= ; del: gradient: gradient; end gradient",
- "laplacian": "function=lahplahsian", # speech engines don't do a good job with "laplacian"
-
- "chemistry-concentration": "function= ; concentration: concentration of: the concentration of; end concentration",
+ "real-part": "function=действительная часть",
+
+ "transpose": "postfix=транспонирование || function=транспонированная",
+ "norm": "function=; норма: норма: норма; конец нормы",
+ "trace": "function=;след : след: след; конец следа",
+ "dimension": "function=; размерность : размерность: размерность; конец размерности",
+ "homomorphism": "function= ; гомоморфизм : гомоморфизм: гомоморфизм; конец гомоморфизма",
+ "kernel": "function= ; ядро : ядро: ядро; конец ядра",
+ "vector": "function= ; вектор || prefix=вектор",
+ "cross-product": "infix=векторное произведение: векторное произведение: векторное произведение",
+ "dot-product": "infix=скалярное произведение: скалярное произведение: скалярное произведение",
+
+ "divergence": "function= ; дивергенция: дивергенция: дивергенция; конец дивергенции",
+ "curl": "function= ; ротор; конец ротора",
+ "gradient": "function= ; градиент: градиент: градиент; конец градиента",
+ "laplacian": "function=лапласиан", # speech engines don't do a good job with "laplacian"
+
+ "chemistry-concentration": "function= ; концентрация: концентрация: концентрация; конец концентрации",
}
# Names of functions that in terse mode don't say "of" (or it's equivalent in other languages)
@@ -307,25 +307,25 @@
]
- NumbersOrdinalOnes: [
-«ноль», «первый», «второй», «третий», «четвертый», «пятый», «шестой», «седьмой», «восьмой», «девятый»,
+«нулевой», «первый», «второй», «третий», «четвертый», «пятый», «шестой», «седьмой», «восьмой», «девятый»,
«десятый», «одиннадцатый», «двенадцатый», «тринадцатый», «четырнадцатый», «пятнадцатый», «шестнадцатый»,
«семнадцатый», «восемнадцатый», «девятнадцатый»
]
- NumbersOrdinalPluralOnes: [
-«ноль», «первый», «секунды», «терции», «четвертые», «пятые», «шестые», «седьмые», «восьмые», «девятые»,
+«нулевые», «первые», «вторые», «третьи», «четвертые», «пятые», «шестые», «седьмые», «восьмые», «девятые»,
«десятые», «одиннадцатые», «двенадцатые», «тринадцатые», «четырнадцатые», «пятнадцатые», «шестнадцатые»,
«семнадцатые», «восемнадцатые», «девятнадцатые»
]
# stop when regularity begins
- NumbersOrdinalFractionalOnes: [
-«ноль», «первый», «половина»
+«нулевая», «первая», «вторая»
]
# stop when regularity begins
- NumbersOrdinalFractionalPluralOnes: [
-«нули», «первые», «половинки»
+«нулевых», «первых», «вторых»
]
@@ -354,8 +354,8 @@
]
- NumbersOrdinalPluralHundreds: [
-"", "сотые", "две сотых", "три сотых", "четыре сотых", "пять сотых",
-« шесть сотых», «семь сотых», «восемь сотых», «девять сотых»
+"", "сотые", "двухсотые", "трёхсотые", "четырёхсотые", "пятисотые",
+« шестисотые», «семисотые», «восьмисотые», «девятисотые»
]
diff --git a/Rules/Languages/ru/navigate.yaml b/Rules/Languages/ru/navigate.yaml
index 449e1291..7f35caa9 100644
--- a/Rules/Languages/ru/navigate.yaml
+++ b/Rules/Languages/ru/navigate.yaml
@@ -79,13 +79,13 @@
- else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Next'"
then: [t: "право"] # phrase(move to the 'right')
- else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Previous'"
- then: [t: "левый"] # phrase(move to the 'left')
+ then: [t: "лево"] # phrase(move to the 'left')
- else_if: "substring($NavCommand, string-length($Prefix)+1) = 'Current'"
- then: [t: "нынешним"] # phrase(who is the 'current' president)
+ then: [t: "текущий"] # phrase(who is the 'current' president)
- else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineStart'"
- then: [t: "на начало линии"] # phrase(move 'to start of line')
+ then: [t: "к началу строки"] # phrase(move 'to start of line')
- else_if: "substring($NavCommand, string-length($Prefix)+1) = 'LineEnd'"
- then: [t: "к концу линии"] # phrase(move 'to end of line')
+ then: [t: "к концу строки"] # phrase(move 'to end of line')
- pause: "medium"
- set_variables: [MatchCounter: "1"]
@@ -118,7 +118,7 @@
- test:
if: "count($Child2D/preceding-sibling::*)=0"
then: [t: "корень"] # phrase(the cube 'root' of x)
- else: [t: "корневой индекс"] # phrase(the 'root index' of x is 3)
+ else: [t: "индекс корня"] # phrase(the 'root index' of x is 3)
- pause: "medium"
- name: into-or-out-of-msub
@@ -128,7 +128,7 @@
- x: "$Move2D"
- test:
if: "count($Child2D/preceding-sibling::*)=0"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
else: [t: "sepcript"] # phrase(x with 'subscript' 2)
- pause: "medium"
@@ -139,7 +139,7 @@
- x: "$Move2D"
- test:
if: "not($Child2D/preceding-sibling::*)"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
else: [t: "superscript"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...)
- pause: "medium"
@@ -150,7 +150,7 @@
- x: "$Move2D"
- test:
- if: "not($Child2D/preceding-sibling::*)"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
- else_if: "count($Child2D/preceding-sibling::*)=1"
then: [t: "sepcript"] # phrase(x with 'subscript' 2)
else: [t: "superscript"] # phrase(x with 'superscript' 2) # FIX: it would be better to use the word used when reading (power, exponent, ...)
@@ -163,7 +163,7 @@
- x: "$Move2D"
- test:
if: "count($Child2D/preceding-sibling::*)=0"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
else: [t: "нижний предел"] # phrase(the 'lower limit' of the function is zero)
- pause: "medium"
@@ -174,7 +174,7 @@
- x: "$Move2D"
- test:
if: "count($Child2D/preceding-sibling::*)=0"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
else: [t: "верхний предел"] # phrase(the 'upper limit' of the function is zero)
- pause: "medium"
@@ -185,7 +185,7 @@
- x: "$Move2D"
- test:
- if: "count($Child2D/preceding-sibling::*)=0"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
- else_if: "count($Child2D/preceding-sibling::*)=1"
then: [t: "нижний предел"] # phrase(the 'lower limit' of the function is zero)
else: [t: "верхний предел"] # phrase(the 'upper limit' of the function is zero)
@@ -205,7 +205,7 @@
- x: "$Move2D"
- test:
- if: "$NumPrecedingSiblings=0"
- then: [t: "база"] # phrase(the 'base' of the power)
+ then: [t: "основание"] # phrase(the 'base' of the power)
- else_if: "$Child2D/preceding-sibling::*[self::m:mprescripts]" # are we before mprescripts and hence are postscripts
then:
- test: # in postscripts -- base shifts by one
@@ -564,12 +564,12 @@
then:
- test:
- if: "$NavCommand = 'MoveStart'"
- then: [t: "перейти на начало математики"] # phrase('move to start of math')
+ then: [t: "перейти к началу математики"] # phrase('move to start of math')
- else_if: "$NavCommand = 'MoveLineStart'"
- then: [t: "перейти на начало линии"] # phrase('move to start of line')
+ then: [t: "перейти к началу строки"] # phrase('move to start of line')
- else_if: "$NavCommand = 'MoveEnd'"
then: [t: "перейти к концу математики"] # phrase('move to end of math')
- else: [t: "перейти к концу линии"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line')
+ else: [t: "перейти к концу строки"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line')
- pause: "medium"
- test:
if: "$NavCommand = 'MoveStart' or $NavCommand = 'MoveLineStart'"
@@ -608,8 +608,8 @@
then:
- test:
if: "$NavCommand = 'MoveLineStart'"
- then: [t: "перейти на начало линии"] # phrase('move to start of line')
- else: [t: "перейти к концу линии"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line')
+ then: [t: "перейти к началу строки"] # phrase('move to start of line')
+ else: [t: "перейти к концу строки"] # "$NavCommand = 'MoveLineEnd'" # phrase('move to end of line')
- pause: "medium"
- test:
if: "self::m:mrow or @data-from-mathml = 'mrow'"
diff --git a/Rules/Languages/ru/unicode.yaml b/Rules/Languages/ru/unicode.yaml
index ba904886..5c53278a 100644
--- a/Rules/Languages/ru/unicode.yaml
+++ b/Rules/Languages/ru/unicode.yaml
@@ -84,17 +84,17 @@
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
then_test:
if: "$Verbosity='Terse'"
- then: [t: "открыть"] # 0x28 (en: 'open', google translation)
- else: [t: "открытая скобка"] # 0x28 (en: 'open paren', google translation)
- else: [t: "левая скобка"] # 0x28 (en: 'left paren', google translation)
+ then: [t: "открытая"] # 0x28 (en: 'open', google translation)
+ else: [t: "открывающая круглая скобка"] # 0x28 (en: 'open paren', google translation)
+ else: [t: "левая круглая скобка"] # 0x28 (en: 'left paren', google translation)
- ")": # 0x29
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
then_test:
if: "$Verbosity='Terse'"
- then: [t: "закрывать"] # 0x29 (en: 'close', google translation)
- else: [t: "закрыть скобку"] # 0x29 (en: 'close paren', google translation)
- else: [t: "правильная скобка"] # 0x29 (en: 'right paren', google translation)
+ then: [t: "закрытая"] # 0x29 (en: 'close', google translation)
+ else: [t: "закрывающая круглая скобка"] # 0x29 (en: 'close paren', google translation)
+ else: [t: "правая круглая скобка"] # 0x29 (en: 'right paren', google translation)
- "*": # 0x2a
test:
@@ -150,26 +150,26 @@
- "[": # 0x5b
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
- then: [t: "открытый кронштейн"] # (en: 'open bracket', google translation)
- else: [t: "левый кронштейн"] # (en: 'left bracket', google translation)
- - "\\": [t: "обратная черта"] # 0x5c (en: 'back slash', google translation)
+ then: [t: "открывающая квадратная скобка"] # (en: 'open bracket', google translation)
+ else: [t: "левая квадратная скобка"] # (en: 'left bracket', google translation)
+ - "\\": [t: "обратная косая черта"] # 0x5c (en: 'back slash', google translation)
- "]": # 0x5d
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
- then: [t: "близкий кронштейн"] # (en: 'close bracket', google translation)
- else: [t: "правый кронштейн"] # (en: 'right bracket', google translation)
+ then: [t: "закрывающая квадратная скобка"] # (en: 'close bracket', google translation)
+ else: [t: "правая квадратная скобка"] # (en: 'right bracket', google translation)
- "^": # 0x5e
- test:
if: "parent::m:modified-variable or parent::m:mover"
then: [t: "шляп"] # (en: 'hat', google translation)
- else: [t: "каретка"] # (en: 'caret', google translation)
+ else: [t: "крышка"] # (en: 'caret', google translation)
- "_": [t: "под баром"] # 0x5f (en: 'under bar', google translation)
- "`": [t: "могила"] # 0x60 (en: 'grave', google translation)
- "{": # 0x7b
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
- then: [t: "открытая скоба"] # (en: 'open brace', google translation)
- else: [t: "оставленный скоба"] # (en: 'left brace', google translation)
+ then: [t: "открывающая фигурная скобка"] # (en: 'open brace', google translation)
+ else: [t: "левая фигурная скобка"] # (en: 'left brace', google translation)
- "|": # 0x7c
# note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets'
- with:
@@ -192,10 +192,10 @@
- "}": # 0x7d
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
- then: [t: "близкая скоба"] # (en: 'close brace', google translation)
- else: [t: "правая скоба"] # (en: 'right brace', google translation)
+ then: [t: "закрывающая фигурная скобка"] # (en: 'close brace', google translation)
+ else: [t: "правая фигурная скобка"] # (en: 'right brace', google translation)
- - "~": [t: "тилде"] # 0x7e (en: 'tilde', google translation)
+ - "~": [t: "тилда"] # 0x7e (en: 'tilde', google translation)
- " ": # 0xa0
- test:
# could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution?
@@ -244,7 +244,7 @@
if: "$SpeechOverrides_CapitalLetters = ''"
then_test:
if: "$Impairment = 'Blindness'"
- then: [t: "пропусков"] # (en: 'cap', google translation)
+ then: [t: "большая"] # (en: 'cap', google translation)
else: [x: "$SpeechOverrides_CapitalLetters"]
- pitch:
value: "$CapitalLetters_Pitch"
@@ -296,7 +296,7 @@
else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn'
if: "count(following-sibling::*) = 0"
then: [t: "и так далее"] # (en: 'and so on', google translation)
- else: [t: "и так далее"] # (en: 'and so on up to', google translation)
+ else: [t: "и так далее до"] # (en: 'and so on up to', google translation)
- "": # 0x2061
- test:
@@ -315,8 +315,8 @@
- t: "тройной штрих" # (en: 'double-struck')
- spell: "translate('.', 'ℂℕℚℝℤ', 'CNQRZ')"
- - "℃": [t: "градусы по цельсию"] # 0x2103 (en: 'degrees celsius', google translation)
- - "℉": [t: "степени фаренгейт"] # 0x2109 (en: 'degrees fahrenheit', google translation)
+ - "℃": [t: "градусы цельсия"] # 0x2103 (en: 'degrees celsius', google translation)
+ - "℉": [t: "градусы фаренгейта"] # 0x2109 (en: 'degrees fahrenheit', google translation)
- "ℋℛℓ": # 0x210b
- t: "сценарий" # (en: 'script', google translation)
- spell: "translate('.', 'ℋℛℓ', 'HRl')"
@@ -329,7 +329,7 @@
- "K": [t: "кельвин"] # 0x212a (en: 'kelvin', google translation)
- "Å": [t: "ангстры"] # 0x212b (en: 'angstroms', google translation)
- "ⅆⅇⅈⅉ": # 0x2146-9
- - t: "дважды поразил курсив" # (en: 'double-struck italic', google translation)
+ - t: "двойной курсив" # (en: 'double-struck italic', google translation)
- spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')"
- "←": [t: "стрелка влево"] # 0x2190 (en: 'leftwards arrow', google translation)
@@ -337,7 +337,7 @@
- "→": # 0x2192
- test:
if: "ancestor::*[2][self::m:limit]"
- then: [t: "подходы"] # (en: 'approaches', google translation)
+ then: [t: "достигает"] # (en: 'approaches', google translation)
else: [t: "стрелка вправо"] # (en: 'right arrow', google translation)
- "↓": [t: "стрелка вниз"] # 0x2193 (en: 'downwards arrow', google translation)
From 3f96c7a853b9b7b680a1581084d989562a807167 Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Fri, 20 Feb 2026 06:18:06 +0300
Subject: [PATCH 5/7] Fixed unicode.yaml file
This commitadds fixes at Russian translation of Unicode symbols list.
---
Rules/Languages/ru/unicode.yaml | 146 ++++++++++++++++----------------
1 file changed, 73 insertions(+), 73 deletions(-)
diff --git a/Rules/Languages/ru/unicode.yaml b/Rules/Languages/ru/unicode.yaml
index 5c53278a..3fe44005 100644
--- a/Rules/Languages/ru/unicode.yaml
+++ b/Rules/Languages/ru/unicode.yaml
@@ -30,7 +30,7 @@
if: "$SpeechOverrides_CapitalLetters = ''"
then_test:
if: "$Impairment = 'Blindness'"
- then: [t: "пропусков"] # (en: 'cap', google translation)
+ then: [t: "большая"] # (en: 'cap', google translation)
else: [x: "$SpeechOverrides_CapitalLetters"]
- pitch:
value: "$CapitalLetters_Pitch"
@@ -53,7 +53,7 @@
if: "$SpeechOverrides_CapitalLetters = ''"
then_test:
if: "$Impairment = 'Blindness'"
- then: [t: "пропусков"] # (en: 'cap', google translation)
+ then: [t: "большая"] # (en: 'cap', google translation)
else: [x: "$SpeechOverrides_CapitalLetters"]
- pitch:
value: "$CapitalLetters_Pitch"
@@ -69,22 +69,22 @@
if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]"
then_test:
if: "$Verbosity = 'Terse'"
- then: [t: "хлопнуть"] # 0x21 (en: 'bang', google translation)
+ then: [t: "восклицательный знак"] # 0x21 (en: 'bang', google translation)
else: [t: "восклицательный знак"] # 0x21 (en: 'exclamation point', google translation)
else: [t: "факториал"] # 0x21 (en: 'factorial', google translation)
- "\"": [t: "кавычка"] # 0x22 (en: 'quotation mark', google translation)
- - "#": [t: "число"] # 0x23 (en: 'number', google translation)
+ - "#": [t: "номер"] # 0x23 (en: 'number', google translation)
- "$": [t: "доллар"] # 0x24 (en: 'dollars', google translation)
- "%": [t: "процент"] # 0x25 (en: 'percent')
- - "&": [t: "ampersand"] # 0x26 (google translation)
+ - "&": [t: "амперсанд"] # 0x26 (google translation)
- "'": [t: "штрих"] # 0x27 (en: 'apostrophe')
- "(": # 0x28
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
then_test:
if: "$Verbosity='Terse'"
- then: [t: "открытая"] # 0x28 (en: 'open', google translation)
+ then: [t: "скобка открывается"] # 0x28 (en: 'open', google translation)
else: [t: "открывающая круглая скобка"] # 0x28 (en: 'open paren', google translation)
else: [t: "левая круглая скобка"] # 0x28 (en: 'left paren', google translation)
- ")": # 0x29
@@ -92,7 +92,7 @@
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
then_test:
if: "$Verbosity='Terse'"
- then: [t: "закрытая"] # 0x29 (en: 'close', google translation)
+ then: [t: "скобка закрывается"] # 0x29 (en: 'close', google translation)
else: [t: "закрывающая круглая скобка"] # 0x29 (en: 'close paren', google translation)
else: [t: "правая круглая скобка"] # 0x29 (en: 'right paren', google translation)
@@ -114,7 +114,7 @@
# except if expression starts with '…'
- "../*[1][.='…'] "
then:
- - T: "comma" # (en: 'comma', google translation)
+ - T: "запятая" # (en: 'comma', google translation)
- test:
if: "$Verbosity != Terse"
then: [pause: short]
@@ -132,21 +132,21 @@
- "<": # 0x3c
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "меньше" # (en: 'less than')
- "=": # 0x3d
- test:
if: "$Verbosity!='Terse'"
- then: [t: "равен"] # (en: 'is equal to', google translation)
+ then: [t: "равно"] # (en: 'is equal to', google translation)
else: [t: "равно"] # (en: 'equals')
- ">": # 0x3e
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "больше" # (en: 'greater than')
- - "?": [t: "знак вопроса"] # 0x3f (en: 'question mark', google translation)
- - "@": [t: "на знаке"] # 0x40 (en: 'at sign', google translation)
+ - "?": [t: "вопросительный знак"] # 0x3f (en: 'question mark', google translation)
+ - "@": [t: "собака"] # 0x40 (en: 'at sign', google translation)
- "[": # 0x5b
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
@@ -161,10 +161,10 @@
- "^": # 0x5e
- test:
if: "parent::m:modified-variable or parent::m:mover"
- then: [t: "шляп"] # (en: 'hat', google translation)
+ then: [t: "крышка"] # (en: 'hat', google translation)
else: [t: "крышка"] # (en: 'caret', google translation)
- - "_": [t: "под баром"] # 0x5f (en: 'under bar', google translation)
- - "`": [t: "могила"] # 0x60 (en: 'grave', google translation)
+ - "_": [t: "подчёркивание"] # 0x5f (en: 'under bar', google translation)
+ - "`": [t: "гравис"] # 0x60 (en: 'grave', google translation)
- "{": # 0x7b
- test:
if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak'
@@ -179,14 +179,14 @@
- if: "$SpeechStyle != 'ClearSpeak'"
then_test:
if: "$DefaultToGiven"
- then: [t: "данный"] # (en: 'given', google translation)
+ then: [t: "при условии"] # (en: 'given', google translation)
else: [t: "вертикальная черта"] # (en: 'vertical line')
- else_if: "not(preceding-sibling::*) or not(following-sibling::*)"
- then: [t: "вертикальная линия"] # (en: 'vertical line', google translation)
+ then: [t: "вертикальная черта"] # (en: 'vertical line', google translation)
- else_if: "$ClearSpeak_VerticalLine = 'SuchThat'"
- then: [t: "так что"] # (en: 'such that', google translation)
+ then: [t: "такой, что"] # (en: 'such that', google translation)
- else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven"
- then: [t: "данный"] # (en: 'given', google translation)
+ then: [t: "при условии"] # (en: 'given', google translation)
- else: [t: "вертикальная черта"] # (en: 'divides')
- "}": # 0x7d
@@ -195,7 +195,7 @@
then: [t: "закрывающая фигурная скобка"] # (en: 'close brace', google translation)
else: [t: "правая фигурная скобка"] # (en: 'right brace', google translation)
- - "~": [t: "тилда"] # 0x7e (en: 'tilde', google translation)
+ - "~": [t: "тильда"] # 0x7e (en: 'tilde', google translation)
- " ": # 0xa0
- test:
# could be mtext in mtd or mtext in an mrow that is a concatenation of mtd's. Is there a better solution?
@@ -203,10 +203,10 @@
then: [t: "пустой"] # want to say something for fraction (etc) with empty child (en: 'empty', google translation)
else: [t: ""]
- - "¬": [t: "нет"] # 0xac (en: 'not', google translation)
+ - "¬": [t: "не"] # 0xac (en: 'not', google translation)
- "°": [t: "градусы"] # 0xb0 (en: 'degrees', google translation)
- "±": [t: "плюс минус"] # 0xb1 (en: 'plus or minus')
- - "´": [t: "острый"] # 0xb4 (en: 'acute', google translation)
+ - "´": [t: "акут"] # 0xb4 (en: 'acute', google translation)
- "·": # 0xB7
- test:
if: "$SpeechStyle = 'LiteralSpeak' or not($SpeechStyle = 'ClearSpeak' and $ClearSpeak_MultSymbolDot = 'Auto')"
@@ -221,14 +221,14 @@
then: [t: "к"] # (en: 'by', google translation)
else: [t: "умножить"] # (en: 'cross')
- "÷": [t: "разделить на"] # 0xf7 (en: 'divided by')
- - "̀": [t: "могильный акцент украшения"] # 0x300 (en: 'grave accent embellishment', google translation)
- - "́": [t: "острый акцентный украшение"] # 0x301 (en: 'acute accent embellishment', google translation)
- - "̂": [t: "окружающий акцент украшения"] # 0x302 (en: 'circumflex accent embellishment', google translation)
- - "̃": [t: "тильде украшает"] # 0x303 (en: 'tilde embellishment', google translation)
- - "̄": [t: "макрон украшает"] # 0x304 (en: 'macron embellishment', google translation)
- - "̅": [t: "вручительская варенья"] # 0x305 (en: 'overbar embellishment', google translation)
+ - "̀": [t: "знак грависа"] # 0x300 (en: 'grave accent embellishment', google translation)
+ - "́": [t: "акут"] # 0x301 (en: 'acute accent embellishment', google translation)
+ - "̂": [t: "циркумфлекс"] # 0x302 (en: 'circumflex accent embellishment', google translation)
+ - "̃": [t: "тильда"] # 0x303 (en: 'tilde embellishment', google translation)
+ - "̄": [t: "макрон"] # 0x304 (en: 'macron embellishment', google translation)
+ - "̅": [t: "надчёркивание"] # 0x305 (en: 'overbar embellishment', google translation)
- "̆": [t: "бреве"] # 0x306 (en: 'breve', google translation)
- - "̇": [t: "точка над украшением"] # 0x307 (en: 'dot above embellishment', google translation)
+ - "̇": [t: "точка сверху"] # 0x307 (en: 'dot above embellishment', google translation)
# Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong
- "Α-Ω":
@@ -278,13 +278,13 @@
- "ω": [t: "омега"] # 0x3c9 (en: 'omega')
- "ϕ": [t: "фи"] # 0x3d5 (en: 'phi')
- "ϖ": [t: "пи"] # 0x3d6 (en: 'pi')
- - "ϵ": [t: "полулунный эпсилон"] # 0x3f5 (en: 'epsilon')
- - "϶": [t: "обратный полулунный эпсилон"] # 0x3f6 (en: 'reversed epsilon')
+ - "ϵ": [t: "эпсилон"] # 0x3f5 (en: 'epsilon')
+ - "϶": [t: "обратный эпсилон"] # 0x3f6 (en: 'reversed epsilon')
- - "–": [t: "en dash"] # 0x2013 (google translation)
- - "—": [t: "em dash"] # 0x2014 (google translation)
- - "―": [t: "горизонтальный батончик"] # 0x2015 (en: 'horizontal bar', google translation)
- - "‖": [t: "двойная вертикальная линия"] # 0x2016 (en: 'double vertical line', google translation)
+ - "–": [t: "короткое тире"] # 0x2013 (google translation)
+ - "—": [t: "длинное тире"] # 0x2014 (google translation)
+ - "―": [t: "горизонтальная черта"] # 0x2015 (en: 'horizontal bar', google translation)
+ - "‖": [t: "двойная вертикальная черта"] # 0x2016 (en: 'double vertical line', google translation)
- "…": # 0x2026
test:
if:
@@ -303,7 +303,7 @@
# skip saying "of" when Terse and a trig function, when it is a shape (does this happen?), or we are in :literal mode
if: "not($Verbosity='Terse' and preceding-sibling::*[1][IsInDefinition(., 'TrigFunctionNames')]) and not(preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')]) and
not(@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')])"
- then: [t: "из"] # (en: 'of', google translation)
+ then: [t: "от"] # (en: 'of', google translation)
- "": [t: ""] # 0x2062
- "": [t: ""] # 0x2063
- "": [t: "и"] # 0x2064 (en: 'and', google translation)
@@ -312,22 +312,22 @@
- "‴": [t: "тройной штрих"] # 0x2034 (en: 'triple prime')
- "ℂℕℚℝℤ": # here we rely on this running through the table again to speak "cap xxx"
- - t: "тройной штрих" # (en: 'double-struck')
+ - t: "двойное" # (en: 'double-struck')
- spell: "translate('.', 'ℂℕℚℝℤ', 'CNQRZ')"
- "℃": [t: "градусы цельсия"] # 0x2103 (en: 'degrees celsius', google translation)
- "℉": [t: "градусы фаренгейта"] # 0x2109 (en: 'degrees fahrenheit', google translation)
- "ℋℛℓ": # 0x210b
- - t: "сценарий" # (en: 'script', google translation)
+ - t: "рукописное" # (en: 'script', google translation)
- spell: "translate('.', 'ℋℛℓ', 'HRl')"
- - "ℎ": [t: "постоянная планка"] # 0x210e (en: 'planck constant', google translation)
+ - "ℎ": [t: "постоянная Планка"] # 0x210e (en: 'planck constant', google translation)
- "ℜ": # 0x211c
- - t: "фрактур" # (en: 'fraktur', google translation)
+ - t: "готическая" # (en: 'fraktur', google translation)
- spell: "'R'"
- "Ω": [t: "ом"] # 0x2126 (en: 'ohms', google translation)
- "K": [t: "кельвин"] # 0x212a (en: 'kelvin', google translation)
- - "Å": [t: "ангстры"] # 0x212b (en: 'angstroms', google translation)
+ - "Å": [t: "ангстрем"] # 0x212b (en: 'angstroms', google translation)
- "ⅆⅇⅈⅉ": # 0x2146-9
- t: "двойной курсив" # (en: 'double-struck italic', google translation)
- spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')"
@@ -337,7 +337,7 @@
- "→": # 0x2192
- test:
if: "ancestor::*[2][self::m:limit]"
- then: [t: "достигает"] # (en: 'approaches', google translation)
+ then: [t: "стремится к"] # (en: 'approaches', google translation)
else: [t: "стрелка вправо"] # (en: 'right arrow', google translation)
- "↓": [t: "стрелка вниз"] # 0x2193 (en: 'downwards arrow', google translation)
@@ -346,7 +346,7 @@
- "∂": # 0x2202
- test:
if: "$Verbosity='Terse'"
- then: [t: "частично"] # (en: 'partial', google translation)
+ then: [t: "частная производная"] # (en: 'partial', google translation)
else: [t: "частный дифференциал"] # (en: 'partial derivative')
- "∃": [t: "существует"] # 0x2203 (en: 'there exists')
- "∄": [t: "не существует"] # 0x2204 (en: 'there does not exist')
@@ -354,7 +354,7 @@
- "∆": # 0x2206
- test:
if: "$Verbosity!='Terse'"
- then: [t: "а"] # (en: 'the', google translation)
+ then: [t: ""] # (en: 'the', google translation)
- t: "инкремент" # (en: 'laplacian of')
- "∈": # 0x2208
- test:
@@ -362,7 +362,7 @@
then:
- test:
if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "принадлежит" # (en: 'an element of')
# Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option
else_test:
@@ -377,7 +377,7 @@
- else: [t: "принадлежит"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to')
else_test:
- if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member'
- then: [t: "является членом"] # (en: 'is a member of', google translation)
+ then: [t: "член"] # (en: 'is a member of', google translation)
- else_if: $ClearSpeak_SetMemberSymbol = 'Element'
then: [t: "элемент"] # (en: 'is an element of', google translation)
- else_if: $ClearSpeak_SetMemberSymbol = 'In'
@@ -390,7 +390,7 @@
then:
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "не принадлежит" # (en: 'not an element of')
# Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option
else_test:
@@ -405,7 +405,7 @@
- else: [t: "не принадлежит"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'not belonging to')
else_test:
- if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member'
- then: [t: "не является членом"] # (en: 'is not a member of', google translation)
+ then: [t: "не член"] # (en: 'is not a member of', google translation)
- else_if: $ClearSpeak_SetMemberSymbol = 'Element'
then: [t: "не элемент"] # (en: 'is not an element of', google translation)
- else_if: $ClearSpeak_SetMemberSymbol = 'In'
@@ -417,7 +417,7 @@
then:
- test:
if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "малое принадлежит" # (en: 'an element of')
# Several options for speaking elements in ClearSpeak -- they split between being inside a set or not and then the option
else_test:
@@ -432,7 +432,7 @@
- else: [t: "малое принадлежит"] # $ClearSpeak_SetMemberSymbol = 'Belongs' (en: 'belonging to')
else_test:
- if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member'
- then: [t: "является членом"] # (en: 'is a member of', google translation)
+ then: [t: "член"] # (en: 'is a member of', google translation)
- else_if: $ClearSpeak_SetMemberSymbol = 'Element'
then: [t: "элемент"] # (en: 'is an element of', google translation)
- else_if: $ClearSpeak_SetMemberSymbol = 'In'
@@ -443,33 +443,33 @@
- "∑": [t: "эн-арная сумма"] # 0x2211 (en: 'sum')
- "−": [t: "минус"] # 0x2212 (en: 'minus')
- "∓": [t: "минус плюс"] # 0x2213 (en: 'minus or plus')
- - "∗": [t: "оператор звёздочка"] # 0x2217 (en: 'times')
- - "∘": [t: "кольцо"] # 0x2218 (en: 'composed with')
+ - "∗": [t: "звёздочка"] # 0x2217 (en: 'times')
+ - "∘": [t: "композиция"] # 0x2218 (en: 'composed with')
- "√": # 0x221a
- test:
if: "$Verbosity!='Terse'"
- then: [t: "а"] # (en: 'the', google translation)
+ then: [t: ""] # (en: 'the', google translation)
- t: "квадратный корень" # (en: 'square root of')
- "∝": # 0x221d
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "пропорционально" # (en: 'proportional to')
- "∞": [t: "бесконечность"] # 0x221e (en: 'infinity')
- - "∟": [t: "правый угол"] # 0x221f (en: 'right angle')
+ - "∟": [t: "прямой угол"] # 0x221f (en: 'right angle')
- "∠": [t: "угол"] # 0x2220 (en: 'angle')
- - "∡": [t: "измеримый угол"] # 0x2221 (en: 'measured angle')
+ - "∡": [t: "измеренный угол"] # 0x2221 (en: 'measured angle')
- "∣": [t: "делит"] # 0x2223 (en: 'divides')
- "∤": [t: "не делит"] # 0x2224 (en: 'does not divide')
- "∥": # 0x2225
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "параллельно" # (en: 'parallel to')
- "∦": # 0x2226
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "не параллельно" # (en: 'not parallel to')
- "∧": [t: "логическое и"] # 0x2227 (en: 'and')
- "∨": [t: "логическое или"] # 0x2228 (en: 'or')
@@ -482,7 +482,7 @@
- "∶": # 0x2236
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "отношение" # (en: 'to')
- "∷": [t: "пропорция"] # 0x2237 (en: 'as')
- "∼": [t: "тильда"] # 0x223c (en: 'varies with')
@@ -490,28 +490,28 @@
- "∾": # 0x223e
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
- - t: "перевёрнутая плавная s" # (en: 'most positive')
+ then: [t: ""] # (en: 'is', google translation)
+ - t: "изогнутая s" # (en: 'most positive')
- "∿": [t: "синусоидальная волна"] # 0x223f (en: 'sine wave')
- "≠": # 0x2260
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "не равно" # (en: 'not equal to')
- "≡": # 0x2261
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "тождественно равно" # (en: 'identical to')
- "≤": # 0x2264
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
- - t: "less than or equal to"
+ then: [t: ""] # (en: 'is', google translation)
+ - t: "меньше или равно"
- "≥": # 0x2265
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "больше или равно" # (en: 'greater than or equal to')
- "≦": [t: "меньше над равно"] # 0x2266 (en: 'less than over equal to')
- "≧": [t: "больше над равно"] # 0x2267 (en: 'greater than over equal to')
@@ -520,30 +520,30 @@
- "⊂": # 0x2282
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является а"] # (en: 'is a', google translation)
+ then: [t: ""] # (en: 'is a', google translation)
- t: "подмножество" # (en: 'subset of')
- "⊃": # 0x2283
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является а"] # (en: 'is a', google translation)
+ then: [t: ""] # (en: 'is a', google translation)
- t: "надмножество" # (en: 'superset of')
- "⊄": # 0x2284
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "не подмножество" # (en: 'not a subset of')
- "⊅": # 0x2285
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является"] # (en: 'is', google translation)
+ then: [t: ""] # (en: 'is', google translation)
- t: "не надмножество" # (en: 'not a superset of')
- "⊆": # 0x2286
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является а"] # (en: 'is a', google translation)
+ then: [t: ""] # (en: 'is a', google translation)
- t: "подмножество или равно" # (en: 'subset of or equal to')
- "⊇": # 0x2287
- test:
if: "$Verbosity!='Terse'"
- then: [t: "является а"] # (en: 'is a', google translation)
+ then: [t: ""] # (en: 'is a', google translation)
- t: "надмножество или равно" # (en: 'superset of or equal to')
From 107b3c3df8ae46f3e4ef653e98a0f4e9e30744d7 Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Fri, 20 Feb 2026 08:33:38 +0300
Subject: [PATCH 6/7] Update of unicode-full
This commit includes fixed Russian translations of Unicode symbols at unicode-full.yaml file.
---
Rules/Languages/ru/unicode-full.yaml | 1186 +++++++++++++-------------
1 file changed, 590 insertions(+), 596 deletions(-)
diff --git a/Rules/Languages/ru/unicode-full.yaml b/Rules/Languages/ru/unicode-full.yaml
index 4224bf75..cd76b611 100644
--- a/Rules/Languages/ru/unicode-full.yaml
+++ b/Rules/Languages/ru/unicode-full.yaml
@@ -2,621 +2,74 @@
- "¢": [t: "центы"] # 0xa2 (en: 'cents', google translation)
- - "£": [t: "фунт"] # 0xa3 (en: 'pounds', google translation)
- - "¤": [t: "валютный знак"] # 0xa4 (en: 'currency sign', google translation)
- - "¥": [t: "иена"] # 0xa5 (en: 'yen', google translation)
- - "¦": [t: "сломанный бар"] # 0xa6 (en: 'broken bar', google translation)
- - "§": [t: "раздел"] # 0xa7 (en: 'section', google translation)
- - "¨": [t: "двойная точка"] # 0xa8 (en: 'double dot', google translation)
+ - "£": [t: "фунты"] # 0xa3 (en: 'pounds', google translation)
+ - "¤": [t: "знак валюты"] # 0xa4 (en: 'currency sign', google translation)
+ - "¥": [t: "иены"] # 0xa5 (en: 'yen', google translation)
+ - "¦": [t: "вертикальная пунктирная черта"] # 0xa6 (en: 'broken bar', google translation)
+ - "§": [t: "параграф"] # 0xa7 (en: 'section', google translation)
+ - "¨": [t: "две точки"] # 0xa8 (en: 'double dot', google translation)
- "©": [t: "авторское право"] # 0xa9 (en: 'copyright', google translation)
- - "ª": [t: "женский орден -индикатор"] # 0xaa (en: 'feminine ordinal indicator', google translation)
- - "¬": [t: "нет"] # 0xac (en: 'not', google translation)
- - "«": [t: "оценка с двойным углом."] # 0xab (en: 'left-pointing double angle quote mark', google translation)
+ - "ª": [t: "женский порядковый индикатор"] # 0xaa (en: 'feminine ordinal indicator', google translation)
+ - "¬": [t: "отрицание"] # 0xac (en: 'not', google translation)
+ - "«": [t: "левая двойная угловая кавычка"] # 0xab (en: 'left-pointing double angle quote mark', google translation)
- "¯": # 0xaf
- test:
if: "ancestor::m:modified-variable and preceding-sibling::*[1][self::m:mi]"
- then: [t: "бар"] # (en: 'bar', google translation)
+ then: [t: "черта"] # (en: 'bar', google translation)
else: [t: "линия"] # (en: 'line', google translation)
- - "²": [t: "два"] # 0xb2 (en: 'two', google translation)
- - "³": [t: "три"] # 0xb3 (en: 'three', google translation)
- - "´": [t: "острый"] # 0xb4 (en: 'acute', google translation)
+ - "²": [t: "в квадрате"] # 0xb2 (en: 'two', google translation)
+ - "³": [t: "в кубе"] # 0xb3 (en: 'three', google translation)
+ - "´": [t: "акут"] # 0xb4 (en: 'acute', google translation)
- "µ": [t: "микро"] # 0xb5 (en: 'micro', google translation)
- - "¹": [t: "один"] # 0xb9 (en: 'one', google translation)
- - "º": [t: "мужской орден -индикатор"] # 0xb9 (en: 'masculine ordinal indicator', google translation)
+ - "¹": [t: "в первой степени"] # 0xb9 (en: 'one', google translation)
+ - "º": [t: "мужской порядковый индикатор"] # 0xb9 (en: 'masculine ordinal indicator', google translation)
- "·":
- test:
if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'"
- then: [t: "раз"] # (en: 'times', google translation)
- else: [t: "умножить"] # (en: 'dot')
+ then: [t: "умножить"] # (en: 'times', google translation)
+ else: [t: "точка"] # (en: 'dot')
- "×": # 0xd7
- test:
if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'"
- then: [t: "раз"] # (en: 'times', google translation)
+ then: [t: "умножить"] # (en: 'times', google translation)
else_test:
if: $ClearSpeak_MultSymbolX = 'By'
- then: [t: "к"] # (en: 'by', google translation)
- else: [t: "умножить"] # (en: 'cross')
+ then: [t: "на"] # (en: 'by', google translation)
+ else: [t: "крестик"] # (en: 'cross')
- "÷": [t: "разделить на"] # 0xf7 (en: 'divided by')
- "¡": [t: "перевернутый восклицательный знак"] # 0xa1 (en: 'inverted exclamation mark', google translation)
- - "¶": [t: "абзац"] # 0xb6 (en: 'paragraph mark', google translation)
- - "¿": [t: "перевернутый вопрос"] # 0xbf (en: 'inverted question mark', google translation)
-
- - "ʰ": [t: "модификатор маленький h"] # 0x2b0 (en: 'modifier small h', google translation)
- - "ʱ": [t: "модификатор маленький h с крючком"] # 0x2b1 (en: 'modifier small h with hook', google translation)
- - "ʲ": [t: "модификатор small j"] # 0x2b2 (en: 'modifier small j', google translation)
- - "ʳ": [t: "модификатор маленький r"] # 0x2b3 (en: 'modifier small r', google translation)
- - "ʴ": [t: "модификатор маленький повернут r"] # 0x2b4 (en: 'modifier small turned r', google translation)
- - "ʵ": [t: "модификатор small turn r r с крючком"] # 0x2b5 (en: 'modifier small turned r with hook', google translation)
+ - "¶": [t: "знак абзаца"] # 0xb6 (en: 'paragraph mark', google translation)
+ - "¿": [t: "перевёрнутый вопросительный знак"] # 0xbf (en: 'inverted question mark', google translation)
+
+ - "ʰ": [t: "верхний индекс h"] # 0x2b0 (en: 'modifier small h', google translation)
+ - "ʱ": [t: "верхний индекс h с крючком"] # 0x2b1 (en: 'modifier small h with hook', google translation)
+ - "ʲ": [t: "верхний индекс j"] # 0x2b2 (en: 'modifier small j', google translation)
+ - "ʳ": [t: "верхний индекс r"] # 0x2b3 (en: 'modifier small r', google translation)
+ - "ʴ": [t: "верхний индекс перевёрнутого r"] # 0x2b4 (en: 'modifier small turned r', google translation)
+ - "ʵ": [t: "верхний индекс перевёрнутого r с крючком"] # 0x2b5 (en: 'modifier small turned r with hook', google translation)
- "ʶ": # 0x2b6
- - t: "модификатор маленький перевернутый" # (en: 'modifier small inverted', google translation)
+ - t: "верхний индекс перевёрнутой" # (en: 'modifier small inverted', google translation)
- spell: "translate('R', 'R', 'R')"
- - "ʷ": [t: "модификатор маленький w"] # 0x2b7 (en: 'modifier small w', google translation)
- - "ʸ": [t: "модификатор маленький y"] # 0x2b8 (en: 'modifier small y', google translation)
- - "ʹ": [t: "модификатор prime"] # 0x2b9 (en: 'modifier prime', google translation)
- - "ʺ": [t: "модификатор double prime"] # 0x2ba (en: 'modifier double prime', google translation)
- - "ʻ": [t: "модификатор стал запятой"] # 0x2bb (en: 'modifier turned comma', google translation)
- - "ʼ": [t: "модификатор апостроф"] # 0x2bc (en: 'modifier apostrophe', google translation)
- - "ʽ": [t: "модификатор обратный запятой"] # 0x2bd (en: 'modifier reversed comma', google translation)
- - "ʾ": [t: "модификатор справа наполовину кольцо"] # 0x2be (en: 'modifier right half ring', google translation)
- - "ʿ": [t: "модификатор оставил половину кольца"] # 0x2bf (en: 'modifier left half ring', google translation)
- - "ˀ": [t: "модификатор глоттальная остановка"] # 0x2c0 (en: 'modifier glottal stop', google translation)
- - "ˁ": [t: "модификатор поменял глоттальную остановку"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation)
- - "˂": [t: "модификатор левой стрелки"] # 0x2c2 (en: 'modifier left arrowhead', google translation)
- - "˃": [t: "модификатор правой стрелки"] # 0x2c3 (en: 'modifier right arrowhead', google translation)
- - "˄": [t: "модификатор вверх стрел"] # 0x2c4 (en: 'modifier up arrowhead', google translation)
- - "˅": [t: "модификатор вниз стрел"] # 0x2c5 (en: 'modifier down arrowhead', google translation)
- - "ˆ": [t: "модификатор объединенный акцент"] # 0x2c6 (en: 'modifier circumflex accent', google translation)
- - "ˇ": [t: "проверять"] # 0x2c7 (en: 'check', google translation)
- - "ˈ": [t: "модификатор вертикальной линии"] # 0x2c8 (en: 'modifier vertical line', google translation)
- - "ˉ": [t: "модификатор макрон"] # 0x2c9 (en: 'modifier macron', google translation)
- - "ˊ": [t: "модификатор острый акцент"] # 0x2ca (en: 'modifier acute accent', google translation)
- - "ˋ": [t: "модификатор могильный акцент"] # 0x2cb (en: 'modifier grave accent', google translation)
- - "ˌ": [t: "модификатор низкой вертикальной линии"] # 0x2cc (en: 'modifier low vertical line', google translation)
- - "ˍ": [t: "модификатор низкий макрон"] # 0x2cd (en: 'modifier low macron', google translation)
- - "ˎ": [t: "модификатор низкий могильный акцент"] # 0x2ce (en: 'modifier low grave accent', google translation)
- - "ˏ": [t: "модификатор низкий острый акцент"] # 0x2cf (en: 'modifier low acute accent', google translation)
- - "ː": [t: "модификатор треугольная толстая кишка"] # 0x2d0 (en: 'modifier triangular colon', google translation)
- - "ˑ": [t: "модификатор половина треугольной толстой кишки"] # 0x2d1 (en: 'modifier half triangular colon', google translation)
- - "˒": [t: "модификатор центрирован правой половиной кольца"] # 0x2d2 (en: 'modifier centered right half ring', google translation)
- - "˓": [t: "модификатор центральный левый половинный кольцо"] # 0x2d3 (en: 'modifier centered left half ring', google translation)
- - "˔": [t: "модификатор вверх"] # 0x2d4 (en: 'modifier up tadck', google translation)
- - "˕": [t: "модификатор вниз"] # 0x2d5 (en: 'modifier down tack', google translation)
- - "˖": [t: "модификатор плюс знак"] # 0x2d6 (en: 'modifier plus sign', google translation)
- - "˗": [t: "модификатор минус знак"] # 0x2d7 (en: 'modifier minus sign', google translation)
- - "˘": [t: "бреве"] # 0x2d8 (en: 'breve', google translation)
- - "˙": [t: "точка"] # 0x2d9 (en: 'dot', google translation)
- - "˚": [t: "кольцо выше"] # 0x2da (en: 'ring above', google translation)
- - "˛": [t: "огонек"] # 0x2db (en: 'ogonek', google translation)
- - "˜": [t: "маленькая тильда"] # 0x2dc (en: 'small tilde', google translation)
- - "˝": [t: "двойной острый акцент"] # 0x2dd (en: 'double acute accent', google translation)
- - "˞": [t: "модификатор rhotic hook"] # 0x2de (en: 'modifier rhotic hook', google translation)
- - "˟": [t: "модификатор cross accent"] # 0x2df (en: 'modifier cross accent', google translation)
- - "ˠ": [t: "модификатор маленькой гамма"] # 0x2e0 (en: 'modifier small gamma', google translation)
- - "ˡ": [t: "модификатор маленький l"] # 0x2e1 (en: 'modifier small l', google translation)
- - "ˢ": [t: "модификатор маленький с"] # 0x2e2 (en: 'modifier small s', google translation)
- - "ˣ": [t: "модификатор маленький x"] # 0x2e3 (en: 'modifier small x', google translation)
- - "ˤ": [t: "модификатор небольшой обратной глоттальной остановки"] # 0x2e4 (en: 'modifier small reversed glottal stop', google translation)
- - "˥": [t: "модификатор лишний тональный батончик"] # 0x2e5 (en: 'modifier extra-high tone bar', google translation)
- - "˦": [t: "модификатор высокого тона"] # 0x2e6 (en: 'modifier high tone bar', google translation)
- - "˧": [t: "модификатор среднего тона"] # 0x2e7 (en: 'modifier mid tone bar', google translation)
- - "˨": [t: "модификатор с низким тоном"] # 0x2e8 (en: 'modifier low tone bar', google translation)
- - "˩": [t: "модификатор экстра-низко-тон"] # 0x2e9 (en: 'modifier extra-low tone bar', google translation)
- - "˪": [t: "модификатор инь, выходящий по тональной марке"] # 0x2ea (en: 'modifier yin departing tone mark', google translation)
- - "˫": [t: "модификатор ян уходящего тон"] # 0x2eb (en: 'modifier yang departing tone mark', google translation)
- - "ˬ": [t: "модификатор голоса"] # 0x2ec (en: 'modifier voicing', google translation)
- - "˭": [t: "модификатор бездиочный"] # 0x2ed (en: 'modifier unaspirated', google translation)
- - "ˮ": [t: "модификатор двойной апостроф"] # 0x2ee (en: 'modifier double apostrophe', google translation)
- - "˯": [t: "модификатор низкого вниз стрелы"] # 0x2ef (en: 'modifier low down arrowhead', google translation)
- - "˰": [t: "модификатор низкий вверх стрел"] # 0x2f0 (en: 'modifier low up arrowhead', google translation)
- - "˱": [t: "модификатор низкий левый стрелок"] # 0x2f1 (en: 'modifier low left arrowhead', google translation)
- - "˲": [t: "модификатор низкого правого стрелка"] # 0x2f2 (en: 'modifier low right arrowhead', google translation)
- - "˳": [t: "модификатор низкий кольцо"] # 0x2f3 (en: 'modifier low ring', google translation)
- - "˴": [t: "модификатор среднего могилы"] # 0x2f4 (en: 'modifier middle grave accent', google translation)
- - "˵": [t: "модификатор среднего двойного могилы"] # 0x2f5 (en: 'modifier middle double grave accent', google translation)
- - "˶": [t: "модификатор среднего двойного острого акцента"] # 0x2f6 (en: 'modifier middle double acute accent', google translation)
- - "˷": [t: "модификатор низкий тильде"] # 0x2f7 (en: 'modifier low tilde', google translation)
- - "˸": [t: "модификатор поднял толстую кишку"] # 0x2f8 (en: 'modifier raised colon', google translation)
- - "˹": [t: "модификатор начинается высокий тон"] # 0x2f9 (en: 'modifier begin high tone', google translation)
- - "˺": [t: "модификатор заканчивает высокий тон"] # 0x2fa (en: 'modifier end high tone', google translation)
- - "˻": [t: "модификатор начинается с низким тоном"] # 0x2fb (en: 'modifier begin low tone', google translation)
- - "˼": [t: "модификатор заканчивается низким тоном"] # 0x2fc (en: 'modifier end low tone', google translation)
- - "˽": [t: "модификатор полка"] # 0x2fd (en: 'modifier shelf', google translation)
- - "˾": [t: "модификатор открытая полка"] # 0x2fe (en: 'modifier open shelf', google translation)
- - "˿": [t: "модификатор низкий левый стрелка"] # 0x2ff (en: 'modifier low left arrow', google translation)
- - "̀": [t: "могильный акцент украшения"] # 0x300 (en: 'grave accent embellishment', google translation)
- - "́": [t: "острый акцентный украшение"] # 0x301 (en: 'acute accent embellishment', google translation)
- - "̂": [t: "окружающий акцент украшения"] # 0x302 (en: 'circumflex accent embellishment', google translation)
- - "̃": [t: "тильде украшает"] # 0x303 (en: 'tilde embellishment', google translation)
- - "̄": [t: "макрон украшает"] # 0x304 (en: 'macron embellishment', google translation)
- - "̅": [t: "вручительская варенья"] # 0x305 (en: 'overbar embellishment', google translation)
- - "̆": [t: "бреве украшения"] # 0x306 (en: 'breve embellishment', google translation)
- - "̇": [t: "точка над украшением"] # 0x307 (en: 'dot above embellishment', google translation)
- - "̈": [t: "украшение диарезиса"] # 0x308 (en: 'diaeresis embellishment', google translation)
- - "̉": [t: "крючок над украшением"] # 0x309 (en: 'hook above embellishment', google translation)
- - "̊": [t: "кольцо над украшением"] # 0x30a (en: 'ring above embellishment', google translation)
- - "̋": [t: "двойное острое акцентное украшение"] # 0x30b (en: 'double acute accent embellishment', google translation)
- - "̌": [t: "проверять"] # 0x30c (en: 'check', google translation)
- - "̍": [t: "вертикальная линия над украшением"] # 0x30d (en: 'vertical line above embellishment', google translation)
- - "̎": [t: "двойная вертикальная линия над украшением"] # 0x30e (en: 'double vertical line above embellishment', google translation)
- - "̏": [t: "двойной могильный акцент украшения"] # 0x30f (en: 'double grave accent embellishment', google translation)
- - "̐": [t: "кендрабинду украшает"] # 0x310 (en: 'candrabindu embellishment', google translation)
- - "̑": [t: "перевернутое украшение бреве"] # 0x311 (en: 'inverted breve embellishment', google translation)
- - "̒": [t: "повернут запятую над украшением"] # 0x312 (en: 'turned comma above embellishment', google translation)
- - "̓": [t: "запятая над украшением"] # 0x313 (en: 'comma above embellishment', google translation)
- - "̔": [t: "обратная запятая над украшением"] # 0x314 (en: 'reversed comma above embellishment', google translation)
- - "̕": [t: "запятая над правым украшением"] # 0x315 (en: 'comma above right embellishment', google translation)
- - "̖": [t: "могильный акцент ниже украшения"] # 0x316 (en: 'grave accent below embellishment', google translation)
- - "̗": [t: "острый акцент ниже украшения"] # 0x317 (en: 'acute accent below embellishment', google translation)
- - "̘": [t: "левая привязка под украшением"] # 0x318 (en: 'left tack below embellishment', google translation)
- - "̙": [t: "правая привязка под украшением"] # 0x319 (en: 'right tack below embellishment', google translation)
- - "̚": [t: "левый угол над украшением"] # 0x31a (en: 'left angle above embellishment', google translation)
- - "̛": [t: "рога в украшении"] # 0x31b (en: 'horn embellishment', google translation)
- - "̜": [t: "полево половина кольца под украшением"] # 0x31c (en: 'left half ring below embellishment', google translation)
- - "̝": [t: "вверх по приукрашиванию"] # 0x31d (en: 'up tack below embellishment', google translation)
- - "̞": [t: "вниз по привязке"] # 0x31e (en: 'down tack below embellishment', google translation)
- - "̟": [t: "плюс знак ниже украшения"] # 0x31f (en: 'plus sign below embellishment', google translation)
- - "̠": [t: "знак минус ниже украшения"] # 0x320 (en: 'minus sign below embellishment', google translation)
- - "̡": [t: "палатализированный крюк под украшением"] # 0x321 (en: 'palatalized hook below embellishment', google translation)
- - "̢": [t: "ретрофлексный крюк под украшением"] # 0x322 (en: 'retroflex hook below embellishment', google translation)
- - "̣": [t: "точка ниже украшения"] # 0x323 (en: 'dot below embellishment', google translation)
- - "̤": [t: "диарезис ниже украшения"] # 0x324 (en: 'diaeresis below embellishment', google translation)
- - "̥": [t: "кольцо ниже украшения"] # 0x325 (en: 'ring below embellishment', google translation)
- - "̦": [t: "запятая ниже украшения"] # 0x326 (en: 'comma below embellishment', google translation)
- - "̧": [t: "седия украшения"] # 0x327 (en: 'cedilla embellishment', google translation)
- - "̨": [t: "огонек украшает"] # 0x328 (en: 'ogonek embellishment', google translation)
- - "̩": [t: "вертикальная линия под украшением"] # 0x329 (en: 'vertical line below embellishment', google translation)
- - "̪": [t: "мост ниже украшения"] # 0x32a (en: 'bridge below embellishment', google translation)
- - "̫": [t: "перевернутая двойная арка ниже украшения"] # 0x32b (en: 'inverted double arch below embellishment', google translation)
- - "̬": [t: "карон ниже украшения"] # 0x32c (en: 'caron below embellishment', google translation)
- - "̭": [t: "окружающий акцент под украшением"] # 0x32d (en: 'circumflex accent below embellishment', google translation)
- - "̮": [t: "бреве под украшением"] # 0x32e (en: 'breve below embellishment', google translation)
- - "̯": [t: "перевернутый бреве под украшением"] # 0x32f (en: 'inverted breve below embellishment', google translation)
- - "̰": [t: "тильда ниже украшения"] # 0x330 (en: 'tilde below embellishment', google translation)
- - "̱": [t: "макрон ниже украшения"] # 0x331 (en: 'macron below embellishment', google translation)
- - "̲": [t: "низкая линия украшения"] # 0x332 (en: 'low line embellishment', google translation)
- - "̳": [t: "двойная низкая линейная украшения"] # 0x333 (en: 'double low line embellishment', google translation)
- - "̴": [t: "тильде наложение украшений"] # 0x334 (en: 'tilde overlay embellishment', google translation)
- - "̵": [t: "краткое инсультное наложение"] # 0x335 (en: 'short stroke overlay embellishment', google translation)
- - "̶": [t: "длинное инсульт украшает"] # 0x336 (en: 'long stroke overlay embellishment', google translation)
- - "̷": [t: "короткое наложение solidus"] # 0x337 (en: 'short solidus overlay embellishment', google translation)
- - "̸": [t: "длинное наложение solidus"] # 0x338 (en: 'long solidus overlay embellishment', google translation)
- - "̹": [t: "правое половина кольца под украшением"] # 0x339 (en: 'right half ring below embellishment', google translation)
- - "̺": [t: "перевернутый мост под украшением"] # 0x33a (en: 'inverted bridge below embellishment', google translation)
- - "̻": [t: "квадрат ниже украшения"] # 0x33b (en: 'square below embellishment', google translation)
- - "̼": [t: "seagull ниже украшения"] # 0x33c (en: 'seagull below embellishment', google translation)
- - "̽": [t: "x выше украшения"] # 0x33d (en: 'x above embellishment', google translation)
- - "̾": [t: "вертикальное украшение тильды"] # 0x33e (en: 'vertical tilde embellishment', google translation)
- - "̿": [t: "двойное оберное украшение"] # 0x33f (en: 'double overline embellishment', google translation)
- - "̀": [t: "могильный тон марк украшения"] # 0x340 (en: 'grave tone mark embellishment', google translation)
- - "́": [t: "острый тонус марк украшения"] # 0x341 (en: 'acute tone mark embellishment', google translation)
- - "͆": [t: "мост выше"] # 0x346 (en: 'bridge above', google translation)
-
- - "ΪΫϏ": # 0x3aa, 0x3ab, 0x3cf
- - test:
- if: "$CapitalLetters_Beep"
- then:
- - audio:
- value: "beep.mp4"
- replace: []
- - test:
- if: "$CapitalLetters_UseWord"
- then_test:
- if: "$SpeechOverrides_CapitalLetters = ''"
- then_test:
- if: "$Impairment = 'Blindness'"
- then: [t: "пропусков"] # (en: 'cap', google translation)
- else: [x: "$SpeechOverrides_CapitalLetters"]
- - pitch:
- value: "$CapitalLetters_Pitch"
- replace: [spell: "translate('.', 'ΪΫϏ', 'ιυϗ')"]
- - t: "с диалитикой" # (en: 'with dialytika', google translation)
- - "ϊ": [t: "йота с диалитикой"] # 0x3ca (en: 'iota with dialytika')
- - "ϋ": [t: "ипсилон с диалитикой"] # 0x3cb (en: 'upsilon with dialytika')
- - "ό": [t: "омикрон с тоносом"] # 0x3cc (en: 'omicron with tonos')
- - "ύ": [t: "ипсилон с тоносом"] # 0x3cd (en: 'upsilon with tonos')
- - "ώ": [t: "омега с тоносом"] # 0x3ce (en: 'omega with tonos')
- - "ϐ": [t: "бета"] # 0x3d0 (en: 'beta')
- - "ϑ": [t: "тета"] # 0x3d1 (en: 'theta')
- - "ϒ": [t: "ипсилон с крючком"] # 0x3d2 (en: 'upsilon with hook')
- - "ϓ": [t: "ипсилон с акутом и крючком"] # 0x3d3 (en: 'upsilon with acute and hook')
- - "ϔ": [t: "ипсилон с диэрезисом и крючком"] # 0x3d4 (en: 'upsilon with diaeresis and hook')
- - "ϕ": [t: "фи"] # 0x3d5 (en: 'phi')
- - "ϖ": [t: "пи"] # 0x3d6 (en: 'pi')
- - "ϗ": [t: "кай"] # 0x3d7 (en: 'kai')
- - "Ϙ": [t: "верхний архаичный коппа"] # 0x3d8 (en: 'cap archaic koppa', google translation)
- - "ϙ": [t: "архаичная коппа"] # 0x3d9 (en: 'archaic koppa')
- - "ϵ": [t: "полулунный эпсилон"] # 0x3f5 (en: 'epsilon')
- - "϶": [t: "обратный полулунный эпсилон"] # 0x3f6 (en: 'reversed epsilon')
- - "А-Я": # 0x410 - 0x42f
- - test:
- if: "$CapitalLetters_Beep"
- then:
- - audio:
- value: "beep.mp4"
- replace: []
- - test:
- if: "$CapitalLetters_UseWord"
- then_test:
- if: "$SpeechOverrides_CapitalLetters = ''"
- then_test:
- if: "$Impairment = 'Blindness'"
- then: [t: "пропусков"] # (en: 'cap', google translation)
- else: [x: "$SpeechOverrides_CapitalLetters"]
- - pitch:
- value: "$CapitalLetters_Pitch"
- replace: [spell: "translate('.', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдежзийклмнопрстуфхцчшщъыьэюя')"]
- - "а": [t: "а"] # 0x430 (en: 'a', google translation)
- - "б": [t: "быть"] # 0x431 (en: 'be', google translation)
- - "в": [t: "вежливый"] # 0x432 (en: 've', google translation)
- - "г": [t: "ghe"] # 0x433 (google translation)
- - "д": [t: "де"] # 0x434 (en: 'de', google translation)
- - "е": [t: "те"] # 0x435 (en: 'ie', google translation)
- - "ж": [t: "же"] # 0x436 (en: 'zhe', google translation)
- - "з": [t: "ze"] # 0x437 (google translation)
- - "и": [t: "и"] # 0x438 (en: 'i', google translation)
- - "й": [t: "короткий я"] # 0x439 (en: 'short i', google translation)
- - "к": [t: "категория"] # 0x43a (en: 'ka', google translation)
- - "л": [t: "эль"] # 0x43b (en: 'el', google translation)
- - "м": [t: "эм"] # 0x43c (en: 'em', google translation)
- - "н": [t: "поступка"] # 0x43d (en: 'en', google translation)
- - "о": [t: "о"] # 0x43e (en: 'o', google translation)
- - "п": [t: "финиш"] # 0x43f (en: 'pe', google translation)
- - "р": [t: "эр"] # 0x440 (en: 'er', google translation)
- - "с": [t: "эс"] # 0x441 (en: 'es', google translation)
- - "т": [t: "театр"] # 0x442 (en: 'te', google translation)
- - "у": [t: "у"] # 0x443 (en: 'u', google translation)
- - "ф": [t: "эф"] # 0x444 (en: 'ef', google translation)
- - "х": [t: "ха"] # 0x445 (en: 'ha', google translation)
- - "ц": [t: "нога"] # 0x446 (en: 'tse', google translation)
- - "ч": [t: "костюм"] # 0x447 (en: 'che', google translation)
- - "ш": [t: "ша"] # 0x448 (en: 'sha', google translation)
- - "щ": [t: "шша"] # 0x449 (en: 'shcha', google translation)
- - "ъ": [t: "жесткий знак"] # 0x44a (en: 'hard sign', google translation)
- - "ы": [t: "еру"] # 0x44b (en: 'yeru', google translation)
- - "ь": [t: "мягкий знак"] # 0x44c (en: 'soft sign', google translation)
- - "э": [t: "э"] # 0x44d (en: 'e', google translation)
- - "ю": [t: "ю"] # 0x44e (en: 'yu', google translation)
- - "я": [t: "я"] # 0x44f (en: 'ya', google translation)
- - "؆": [t: "арабский корень куба"] # 0x606 (en: 'Arabic-Indic cube root', google translation)
- - "؇": [t: "арабский индикатор четвертый корень"] # 0x607 (en: 'Arabic-Indic fourth root', google translation)
- - "؈": [t: "арабский рэй"] # 0x608 (en: 'Arabic ray', google translation)
- - "‐": [t: "дефис"] # 0x2010 (en: 'hyphen', google translation)
- - "‑": [t: "дефис"] # 0x2011 (en: 'hyphen', google translation)
- - "‒": [t: "фигура dash"] # 0x2012 (en: 'figure dash', google translation)
- - "–": [t: "en dash"] # 0x2013 (google translation)
- - "—": [t: "em dash"] # 0x2014 (google translation)
- - "―": [t: "горизонтальный батончик"] # 0x2015 (en: 'horizontal bar', google translation)
- - "‖": [t: "двойная вертикальная линия"] # 0x2016 (en: 'double vertical line', google translation)
- - "†": [t: "кинжал"] # 0x2020 (en: 'dagger', google translation)
- - "‡": [t: "двойной кинжал"] # 0x2021 (en: 'double dagger', google translation)
-
- - " - ": [t: "‡"] # 0x2000 - 0x2007 (en: ' ', google translation)
-
- - "•": # 0x2022
- - test:
- if: "@data-chem-formula-op"
- then: [t: "точка"] # (en: 'dot', google translation)
- else: [t: "пуля"] # (en: 'bullet', google translation)
-
- - "…": # 0x2026
- test:
- if:
- - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or"
- # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn'
- # speak '…' as 'and so on...' unless expr starts with '…'
- - "../*[1][.='…']"
- then: [t: "точка точка точка"] # (en: 'dot dot dot', google translation)
- else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn'
- if: "count(following-sibling::*) = 0"
- then: [t: "и так далее"] # (en: 'and so on', google translation)
- else: [t: "и так далее"] # (en: 'and so on up to', google translation)
-
- - "‰": [t: "за мил"] # 0x2030 (en: 'per mille', google translation)
- - "‱": [t: "за десять тысяч"] # 0x2031 (en: 'per ten thousand', google translation)
- - "′": [t: "штрих"] # 0x2032 (en: 'prime')
- - "″": [t: "двойной штрих"] # 0x2033 (en: 'double prime')
- - "‴": [t: "тройной штрих"] # 0x2034 (en: 'triple prime')
- - "‵": [t: "обратный штрих"] # 0x2035 (en: 'reversed prime')
- - "‶": [t: "обратный двойной штрих"] # 0x2036 (en: 'reversed double prime')
- - "‷": [t: "обратный тройной штрих"] # 0x2037 (en: 'reversed triple prime', google translation)
- - "‸": [t: "в"] # 0x2038 (en: 'to the', google translation)
- - "‹": [t: "одиночный левый угол угла цитата"] # 0x2039 (en: 'single left pointing angle quote mark', google translation)
- - "›": [t: "одиночный правый угол цитата цитата"] # 0x203a (en: 'single right pointing angle quote mark', google translation)
- - "‼": [t: "двойной фактор"] # 0x203c (en: 'double factorial', google translation)
- - "⁄": [t: "разделен на"] # 0x2044 (en: 'divided by', google translation)
- - "⁅": [t: "левый квадратный кронштейн с перо"] # 0x2045 (en: 'left square bracket with quill', google translation)
- - "⁆": [t: "правый квадратный кронштейн с перо"] # 0x2046 (en: 'right square bracket with quill', google translation)
- - "※": [t: "справочная марка"] # 0x203b (en: 'reference mark', google translation)
- - "‿": [t: "под галстуком"] # 0x203F (en: 'under tie', google translation)
- - "⁀": [t: "галстук"] # 0x2040 (en: 'tie', google translation)
- - "⁎": [t: "низкий звездочка"] # 0x204e (en: 'low asterisk', google translation)
- - "⁏": [t: "обратная точка с запятой"] # 0x204f (en: 'reversed semicolon', google translation)
- - "⁐": [t: "закрыть"] # 0x2050 (en: 'close up', google translation)
- - "⁑": [t: "две вертикальные звездочки"] # 0x2051 (en: 'two vertical asterisks', google translation)
- - "⁒": [t: "коммерческий минус знак"] # 0x2052 (en: 'commercial minus sign', google translation)
- - "⁗": [t: "четырехкратный prime"] # 0x2057 (en: 'quadruple prime', google translation)
- - "": [t: ""] # 0x2060
- - "⁰": [t: "к нулевой степени"] # 0x2070 (en: 'to the zeroth power', google translation)
- - "ⁱ": [t: "к силе эйхт"] # 0x2071 (en: 'to the eihth power', google translation)
- - "⁴": [t: "к четвёртой степени"] # 0x2074 (en: 'to the fourth power', google translation)
- - "⁵": [t: "к пятой степени"] # 0x2075 (en: 'to the fifth power', google translation)
- - "⁶": [t: "к шестой степени"] # 0x2076 (en: 'to the sixth power', google translation)
- - "⁷": [t: "к седьмой степении"] # 0x2077 (en: 'to the seventh power', google translation)
- - "⁸": [t: "к восьмой степени"] # 0x2078 (en: 'to the eighth power', google translation)
- - "⁹": [t: "к девятой степени"] # 0x2079 (en: 'to the ninth power', google translation)
- - "⁺": [t: "superscript plus sign"] # 0x207a (google translation)
- - "⁻": [t: "superscript минус"] # 0x207b (en: 'superscript minus', google translation)
- - "⁼": [t: "superscript equals sign"] # 0x207c (google translation)
- - "⁽": [t: "superscript left sakesisetise"] # 0x207d (en: 'superscript left parenthesis', google translation)
- - "⁾": [t: "право скобок"] # 0x207e (en: 'superscript right parenthesis', google translation)
- - "ⁿ": [t: "к власти энн"] # 0x207f (en: 'to the ennth power', google translation)
- - "₀": [t: "суб -ноль"] # 0x2080 (en: 'sub zero', google translation)
- - "₁": [t: "подставка"] # 0x2081 (en: 'sub one', google translation)
- - "₂": [t: "подставка два"] # 0x2082 (en: 'sub two', google translation)
- - "₃": [t: "подставка три"] # 0x2083 (en: 'sub three', google translation)
- - "₄": [t: "подставка четверка"] # 0x2084 (en: 'sub four', google translation)
- - "₅": [t: "подставка пяти"] # 0x2085 (en: 'sub five', google translation)
- - "₆": [t: "sub six"] # 0x2086 (google translation)
- - "₇": [t: "sub seven"] # 0x2087 (google translation)
- - "₈": [t: "саб"] # 0x2088 (en: 'sub eight', google translation)
- - "₉": [t: "sub девять"] # 0x2089 (en: 'sub nine', google translation)
- - "₊": [t: "подписк плюс знак"] # 0x208a (en: 'subscript plus sign', google translation)
- - "₋": [t: "подписка минус знак"] # 0x208b (en: 'subscript minus sign', google translation)
- - "₌": [t: "подписк равна значению"] # 0x208c (en: 'subscript equals sign', google translation)
- - "₍": [t: "подписк остался в скобках"] # 0x208d (en: 'subscript left parenthesis', google translation)
- - "₎": [t: "подписк право с клеса"] # 0x208e (en: 'subscript right parenthesis', google translation)
- - "ₐ": [t: "подсуд а"] # 0x2090 (en: 'sub A', google translation)
- - "ₑ": [t: "саб"] # 0x2091 (en: 'sub E', google translation)
- - "ₒ": [t: "саб"] # 0x2092 (en: 'sub O', google translation)
- - "ₓ": [t: "суб"] # 0x2093 (en: 'sub X', google translation)
- - "ₕ": [t: "сабл"] # 0x2095 (en: 'sub H', google translation)
- - "ₖ": [t: "суб"] # 0x2096 (en: 'sub K', google translation)
- - "ₗ": [t: "сабл"] # 0x2097 (en: 'sub L', google translation)
- - "ₘ": [t: "саб м"] # 0x2098 (en: 'sub M', google translation)
- - "ₙ": [t: "суб"] # 0x2099 (en: 'sub N', google translation)
- - "ₚ": [t: "суб -п"] # 0x209a (en: 'sub P', google translation)
- - "ₛ": [t: "sub s"] # 0x209b (en: 'sub S', google translation)
- - "ₜ": [t: "суб т"] # 0x209c (en: 'sub T', google translation)
- - "₠": [t: "европейская текущая единица"] # 0x20a0 (en: 'european currenty units', google translation)
- - "₡": [t: "колонс"] # 0x20a1 (en: 'colons', google translation)
- - "₢": [t: "крузейро"] # 0x20a2 (en: 'cruzeiro', google translation)
- - "₣": [t: "франк"] # 0x20a3 (en: 'franc', google translation)
- - "₤": [t: "лира"] # 0x20a4 (en: 'lira', google translation)
- - "₥": [t: "мельницы"] # 0x20a5 (en: 'mills', google translation)
- - "₦": [t: "найра"] # 0x20a6 (en: 'naira', google translation)
- - "₧": [t: "пезета"] # 0x20a7 (en: 'peseta', google translation)
- - "₨": [t: "рупии"] # 0x20a8 (en: 'rupees', google translation)
- - "₩": [t: "выиграл"] # 0x20a9 (en: 'won', google translation)
- - "₪": [t: "новые шекели"] # 0x20aa (en: 'new sheqels', google translation)
- - "₫": [t: "донг"] # 0x20ab (en: 'dong', google translation)
- - "€": [t: "евро"] # 0x20ac (en: 'euros', google translation)
- - "₭": [t: "кип"] # 0x20ad (en: 'kip', google translation)
- - "₮": [t: "тугрик"] # 0x20ae (en: 'tugrik', google translation)
- - "₯": [t: "драхма"] # 0x20af (en: 'drachma', google translation)
- - "₰": [t: "немецкие копейки"] # 0x20b0 (en: 'german pennies', google translation)
- - "₱": [t: "песо"] # 0x20b1 (en: 'pesos', google translation)
- - "₲": [t: "гуаранис"] # 0x20b2 (en: 'guaranis', google translation)
- - "₳": [t: "австралии"] # 0x20b3 (en: 'australs', google translation)
- - "₴": [t: "гривния"] # 0x20b4 (en: 'hryvnias', google translation)
- - "₵": [t: "седис"] # 0x20b5 (en: 'cedis', google translation)
- - "₶": [t: "ливр турнуа"] # 0x20b6 (en: 'livre tournois', google translation)
- - "₷": [t: "spesmilos"] # 0x20b7 (google translation)
- - "₸": [t: "тенги"] # 0x20b8 (en: 'tenges', google translation)
- - "₹": [t: "индийские рупии"] # 0x20b9 (en: 'indian rupees', google translation)
- - "₺": [t: "турецкие лирас"] # 0x20ba (en: 'turkish liras', google translation)
- - "⃐": [t: "левый гарпун над украшением"] # 0x20d0 (en: 'left harpoon above embellishment', google translation)
- - "⃑": [t: "правый гарпун над украшением"] # 0x20d1 (en: 'right harpoon above embellishment', google translation)
- - "⃒": [t: "длинная вертикальная линия наложения"] # 0x20d2 (en: 'long vertical line overlay embellishment', google translation)
- - "⃓": [t: "короткая вертикальная линия наложения"] # 0x20d3 (en: 'short vertical line overlay embellishment', google translation)
- - "⃔": [t: "стрелка против часовой стрелки над украшением"] # 0x20d4 (en: 'anticlockwise arrow above embellishment', google translation)
- - "⃕": [t: "стрелка по часовой стрелке над украшением"] # 0x20d5 (en: 'clockwise arrow above embellishment', google translation)
- - "⃖": [t: "левая стрелка над украшением"] # 0x20d6 (en: 'left arrow above embellishment', google translation)
- - "⃗": [t: "правая стрелка над украшением"] # 0x20d7 (en: 'right arrow above embellishment', google translation)
- - "⃘": [t: "кольцо наложения украшения"] # 0x20d8 (en: 'ring overlay embellishment', google translation)
- - "⃙": [t: "по часовой стрелке приукрашивание"] # 0x20d9 (en: 'clockwise ring overlay embellishment', google translation)
- - "⃚": [t: "окружающееся в борту с часовой стрельбой"] # 0x20da (en: 'anticlockwise ring overlay embellishment', google translation)
- - "⃛": [t: "тройная точка"] # 0x20db (en: 'triple dot', google translation)
- - "⃜": [t: "четырехкратная точка"] # 0x20dc (en: 'quadruple dot', google translation)
- - "⃝": [t: "прилагая круговой украшение"] # 0x20dd (en: 'enclosing circle embellishment', google translation)
- - "⃞": [t: "прилагая квадратные украшения"] # 0x20de (en: 'enclosing square embellishment', google translation)
- - "⃟": [t: "прилагая алмазные украшения"] # 0x20df (en: 'enclosing diamond embellishment', google translation)
- - "⃠": [t: "прилагая круговую обратную скользу"] # 0x20e0 (en: 'enclosing circle backslash embellishment', google translation)
- - "⃡": [t: "стрелка влево справа над украшением"] # 0x20e1 (en: 'left right arrow above embellishment', google translation)
- - "⃢": [t: "прилагая в кражу экрана"] # 0x20e2 (en: 'enclosing screen embellishment', google translation)
- - "⃣": [t: "приложение украшения keyuppercase"] # 0x20e3 (en: 'enclosing keycap embellishment', google translation)
- - "⃤": [t: "прилагаясь вверх, указывающее треугольное украшение"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment', google translation)
- - "⃥": [t: "обратное наложение solidus"] # 0x20e5 (en: 'reverse solidus overlay embellishment', google translation)
- - "⃦": [t: "двойное украшение инсульта"] # 0x20e6 (en: 'double verticle stroke embellishment', google translation)
- - "⃧": [t: "аннуитетный символ украшения"] # 0x20e7 (en: 'annuity symbol embellishment', google translation)
- - "⃨": [t: "тройной недостаточный родовой"] # 0x20e8 (en: 'triple underdot', google translation)
- - "⃩": [t: "широкий мост над украшением"] # 0x20e9 (en: 'wide bridge above embellishment', google translation)
- - "⃪": [t: "слева стрелка наложения"] # 0x20ea (en: 'leftwards arrow overlay embellishment', google translation)
- - "⃫": [t: "длинное двойное наложение solidus"] # 0x20eb (en: 'long double solidus overlay embellishment', google translation)
- - "⃬": [t: "прямо гарпун с барб вниз по украшению"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment', google translation)
- - "⃭": [t: "левый гарпун с барб вниз по украшению"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment', google translation)
- - "⃮": [t: "левая стрелка ниже украшения"] # 0x20ee (en: 'left arrow below embellishment', google translation)
- - "⃯": [t: "правая стрелка ниже украшения"] # 0x20ef (en: 'right arrow below embellishment', google translation)
- - "⃰": [t: "звездочка над украшением"] # 0x20f0 (en: 'asterisk above embellishment', google translation)
- - "℄": [t: "символ центральной линии"] # 0x2104 (en: 'center line symbol', google translation)
- - "℅": [t: "заботиться о"] # 0x2105 (en: 'care of', google translation)
- - "℆": [t: "када уна"] # 0x2106 (en: 'cada una', google translation)
- - "ℇ": [t: "постоянная эйлера"] # 0x2107 (en: 'euler's constant', google translation)
- - "℈": [t: "смешивание"] # 0x2108 (en: 'scruples', google translation)
- - "℉": [t: "степени фаренгейт"] # 0x2109 (en: 'degrees fahrenheit', google translation)
- - "ℊ": [t: "сценарий g"] # 0x210a (en: 'script g', google translation)
- - "ℌℑℨℭ": # 0x210c, 0x2111, 0x2128, 0x212d
- - t: "фрактур" # (en: 'fraktur', google translation)
- - spell: "translate('.', 'ℌℑℨℭ', 'HIZC')"
-
- - "ℍℙℾℿ": # 0x210d, 0x2119, 0x213e, 0x213f
- - t: "двойной удар" # (en: 'double struck', google translation)
- - spell: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')"
-
- - "ℎ": [t: "планка постоянная"] # 0x210e (en: 'planck constant', google translation)
- - "ℏ": [t: "h бар"] # 0x210f (en: 'h bar', google translation)
-
- - "ℐℒ℘ℬℰℱℳ": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133
- - t: "сценарий" # (en: 'script', google translation)
- - spell: "translate('.', 'ℐℒ℘ℬℰℱℳ', 'ILPBEFM')"
-
- - "ℓ": [t: "скрипт л"] # 0x2113 (en: 'script l', google translation)
- - "℔": [t: "фунт"] # 0x2114 (en: 'pounds', google translation)
- - "№": [t: "число"] # 0x2116 (en: 'number', google translation)
- - "℥": [t: "унции"] # 0x2125 (en: 'ounces', google translation)
- - "Ω": [t: "ом"] # 0x2126 (en: 'ohms', google translation)
- - "℧": [t: "mhos"] # 0x2127 (google translation)
- - "℩": [t: "повернута йота"] # 0x2129 (en: 'turned iota', google translation)
- - "K": [t: "кельвин"] # 0x212a (en: 'kelvin', google translation)
- - "Å": [t: "ангстры"] # 0x212b (en: 'angstroms', google translation)
- - "ℯ": [t: "сценарий e"] # 0x212f (en: 'script e', google translation)
-
- # coalesced some chars that use cap letters
- - "Ⅎ℺⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144
- - test:
- - if: "'.' = '℺'"
- then: [t: "вращается"] # (en: 'rotated', google translation)
- - else_if: "'.' = 'Ⅎ'"
- then: [t: "перевернутый"] # (en: 'turned', google translation)
- - else_if: "'.' = '⅃'"
- then: [t: "обратный безэриф"] # (en: 'reversed sans-serif', google translation)
- else: [t: "повернулся без зарисования"] # (en: 'turned sans-serif', google translation)
- - spell: "translate('.', 'Ⅎ℺⅁⅂⅃⅄', 'FQGLLY')"
-
- - "ℴ": [t: "сценарий o"] # 0x2134 (en: 'script o', google translation)
- - "ℵ": [t: "первый трансфинит кардинал"] # 0x2135 (en: 'first transfinite cardinal', google translation)
- - "ℶ": [t: "второй трансфинит кардинал"] # 0x2136 (en: 'second transfinite cardinal', google translation)
- - "ℷ": [t: "третий трансфинит кардинал"] # 0x2137 (en: 'third transfinite cardinal', google translation)
- - "ℸ": [t: "четвертый трансфинит кардинал"] # 0x2138 (en: 'fourth transfinite cardinal', google translation)
- - "ℼ": [t: "двойной удар пи"] # 0x213c (en: 'double struck pi', google translation)
- - "ℽ": [t: "двойной удар гамма"] # 0x213d (en: 'double struck gamma', google translation)
- - "⅀": [t: "двойное поражение n-ary summation"] # 0x2140 (en: 'double struck n-ary summation', google translation)
- - "⅋": [t: "повернул амперс и"] # 0x214b (en: 'turned ampersand', google translation)
- - "⅌": [t: "перемещение"] # 0x214c (en: 'per', google translation)
- - "ⅎ": [t: "повернулся ф"] # 0x214e (en: 'turned F', google translation)
- - "¼": [t: "одна четверть"] # 0x00bc (en: 'one quarter', google translation)
- - "½": [t: "половина"] # 0x00bd (en: 'one half', google translation)
- - "¾": [t: "три четверти"] # 0x00be (en: 'three quarters', google translation)
- - "⅐": [t: "один седьмой"] # 0x2150 (en: 'one seventh', google translation)
- - "⅑": [t: "один девятый"] # 0x2151 (en: 'one ninth', google translation)
- - "⅒": [t: "одна десятая"] # 0x2152 (en: 'one tenth', google translation)
- - "⅓": [t: "треть"] # 0x2153 (en: 'one third', google translation)
- - "⅔": [t: "две трети"] # 0x2154 (en: 'two thirds', google translation)
- - "⅕": [t: "один пятый"] # 0x2155 (en: 'one fifth', google translation)
- - "⅖": [t: "два пятых"] # 0x2156 (en: 'two fifths', google translation)
- - "⅗": [t: "три пятых"] # 0x2157 (en: 'three fifths', google translation)
- - "⅘": [t: "четыре пятых"] # 0x2158 (en: 'four fifths', google translation)
- - "⅙": [t: "один шестой"] # 0x2159 (en: 'one sixth', google translation)
- - "⅚": [t: "пять шестых"] # 0x215a (en: 'five sixths', google translation)
- - "⅛": [t: "один ат"] # 0x215b (en: 'one eighth', google translation)
- - "⅜": [t: "три афи"] # 0x215c (en: 'three eighths', google translation)
- - "⅝": [t: "пять ат"] # 0x215d (en: 'five eighths', google translation)
- - "⅞": [t: "семь ат"] # 0x215e (en: 'seven eighths', google translation)
- - "⅟": [t: "один"] # 0x215f (en: 'one over', google translation)
- - "Ⅰ": [t: "Ⅰ"] # 0x2160 (en: 'I', google translation)
- - "Ⅱ": [t: "я i"] # 0x2161 (en: 'I I', google translation)
- - "Ⅲ": [t: "я я я"] # 0x2162 (en: 'I I I', google translation)
- - "Ⅳ": [t: "я v"] # 0x2163 (en: 'I V', google translation)
- - "Ⅴ": [t: "Ⅴ"] # 0x2164 (en: 'V', google translation)
- - "Ⅵ": [t: "v i"] # 0x2165 (en: 'V I', google translation)
- - "Ⅶ": [t: "v i i"] # 0x2166 (en: 'V I I', google translation)
- - "Ⅷ": [t: "v i i i"] # 0x2167 (en: 'V I I I', google translation)
- - "Ⅸ": [t: "я x"] # 0x2168 (en: 'I X', google translation)
- - "Ⅹ": [t: "Ⅹ"] # 0x2169 (en: 'X', google translation)
- - "Ⅺ": [t: "x i"] # 0x216a (en: 'X I', google translation)
- - "Ⅻ": [t: "x i i"] # 0x216b (en: 'X I I', google translation)
- - "Ⅼ": [t: "Ⅼ"] # 0x216c (en: 'L', google translation)
- - "Ⅽ": [t: "Ⅽ"] # 0x216d (en: 'C', google translation)
- - "Ⅾ": [t: "Ⅾ"] # 0x216e (en: 'D', google translation)
- - "Ⅿ": [t: "Ⅿ"] # 0x216f (en: 'M', google translation)
- - "ⅰ": [t: "ⅰ"] # 0x2170 (en: 'I', google translation)
- - "ⅱ": [t: "я i"] # 0x2171 (en: 'I I', google translation)
- - "ⅲ": [t: "я я я"] # 0x2172 (en: 'I I I', google translation)
- - "ⅳ": [t: "я v"] # 0x2173 (en: 'I V', google translation)
- - "ⅴ": [t: "ⅴ"] # 0x2174 (en: 'V', google translation)
- - "ⅵ": [t: "v i"] # 0x2175 (en: 'V I', google translation)
- - "ⅶ": [t: "v i i"] # 0x2176 (en: 'V I I', google translation)
- - "ⅷ": [t: "v i i i"] # 0x2177 (en: 'V I I I', google translation)
- - "ⅸ": [t: "я x"] # 0x2178 (en: 'I X', google translation)
- - "ⅹ": [t: "ⅹ"] # 0x2179 (en: 'X', google translation)
- - "ⅺ": [t: "x i"] # 0x217a (en: 'X I', google translation)
- - "ⅻ": [t: "x i i"] # 0x217b (en: 'X I I', google translation)
- - "ⅼ": [t: "ⅼ"] # 0x217c (en: 'L', google translation)
- - "ⅽ": [t: "ⅽ"] # 0x217d (en: 'C', google translation)
- - "ⅾ": [t: "ⅾ"] # 0x217e (en: 'D', google translation)
- - "ⅿ": [t: "ⅿ"] # 0x217f (en: 'M', google translation)
- - "↉": [t: "нулевые трети"] # 0x2189 (en: 'zero thirds', google translation)
- - "←": [t: "стрелка влево"] # 0x2190 (en: 'leftwards arrow', google translation)
- - "↑": [t: "вверх стрелой"] # 0x2191 (en: 'upwards arrow', google translation)
- - "→": [t: "стрелка вправо"] # 0x2192 (en: 'rightwards arrow', google translation)
- - "↓": [t: "вниз стрелы"] # 0x2193 (en: 'downwards arrow', google translation)
- - "↔": [t: "левая стрелка справа"] # 0x2194 (en: 'left right arrow', google translation)
- - "↕": [t: "вверх вниз стрел"] # 0x2195 (en: 'up down arrow', google translation)
- - "↖": [t: "северо -западный стрелка"] # 0x2196 (en: 'north west arrow', google translation)
- - "↗": # 0x2197
- - test:
- if: "ancestor::*[2][self::m:limit]"
- then: [t: "подходы снизу"] # (en: 'approaches from below', google translation)
- else: [t: "северо -восточный стрела"] # (en: 'north east arrow', google translation)
-
- - "↘": # 0x2198
- - test:
- if: "ancestor::*[2][self::m:limit]"
- then: [t: "подходы сверху"] # (en: 'approaches from above', google translation)
- else: [t: "юго -восточная стрела"] # (en: 'south east arrow', google translation)
-
- - "↙": [t: "юго -западный стрелка"] # 0x2199 (en: 'south west arrow', google translation)
- - "↚": [t: "стрелка влево с ходом"] # 0x219a (en: 'leftwards arrow with stroke', google translation)
- - "↛": [t: "стрелка вправо с ударом"] # 0x219b (en: 'rightwards arrow with stroke', google translation)
- - "↜": [t: "левая волновая стрелка"] # 0x219c (en: 'leftwards wave arrow', google translation)
- - "↝": [t: "правая волновая стрелка"] # 0x219d (en: 'rightwards wave arrow', google translation)
- - "↞": [t: "слева две головы стрелы"] # 0x219e (en: 'leftwards two headed arrow', google translation)
- - "↟": [t: "вверху две головные стрелы"] # 0x219f (en: 'upwards two headed arrow', google translation)
- - "↠": [t: "права две головные стрелы"] # 0x21a0 (en: 'rightwards two headed arrow', google translation)
- - "↡": [t: "вниз по двум головным стрелкам"] # 0x21a1 (en: 'downwards two headed arrow', google translation)
- - "↢": [t: "стрелка влево с хвостом"] # 0x21a2 (en: 'leftwards arrow with tail', google translation)
- - "↣": [t: "стрелка вправо с хвостом"] # 0x21a3 (en: 'rightwards arrow with tail', google translation)
- - "↤": [t: "стрелка влево из бара"] # 0x21a4 (en: 'leftwards arrow from bar', google translation)
- - "↥": [t: "стрелка вверх от бара"] # 0x21a5 (en: 'upwards arrow from bar', google translation)
- - "↦": [t: "стрелка вправо из бара"] # 0x21a6 (en: 'rightwards arrow from bar', google translation)
- - "↧": [t: "стрелка вниз от бара"] # 0x21a7 (en: 'downwards arrow from bar', google translation)
- - "↨": [t: "вверх вниз стрел с базой"] # 0x21a8 (en: 'up down arrow with base', google translation)
- - "↩": [t: "стрелка влево с крючком"] # 0x21a9 (en: 'leftwards arrow with hook', google translation)
- - "↪": [t: "стрелка вправо с крючком"] # 0x21aa (en: 'rightwards arrow with hook', google translation)
- - "↫": [t: "стрелка влево с петлей"] # 0x21ab (en: 'leftwards arrow with loop', google translation)
- - "↬": [t: "стрелка вправо с петлей"] # 0x21ac (en: 'rightwards arrow with loop', google translation)
- - "↭": [t: "левая стрелка правой волны"] # 0x21ad (en: 'left right wave arrow', google translation)
- - "↮": [t: "левая стрелка вправо с ударом"] # 0x21ae (en: 'left right arrow with stroke', google translation)
- - "↯": [t: "вниз zigzag arrow"] # 0x21af (en: 'downwards zigzag arrow', google translation)
- - "↰": [t: "стрелка вверх с наконечником влево"] # 0x21b0 (en: 'upwards arrow with tip leftwards', google translation)
- - "↱": [t: "стрелка вверх с наконечником вправо"] # 0x21b1 (en: 'upwards arrow with tip rightwards', google translation)
- - "↲": [t: "стрелка вниз с наконечником слева"] # 0x21b2 (en: 'downwards arrow with tip leftwards', google translation)
- - "↳": [t: "стрелка вниз с наконечником вправо"] # 0x21b3 (en: 'downwards arrow with tip rightwards', google translation)
- - "↴": [t: "стрелка вправо с углом вниз"] # 0x21b4 (en: 'rightwards arrow with corner downwards', google translation)
- - "↵": [t: "стрелка вниз с углом налево"] # 0x21b5 (en: 'downwards arrow with corner leftwards', google translation)
- - "↶": [t: "стрелка в верхней части часовой стрелки"] # 0x21b6 (en: 'anticlockwise top semicircle arrow', google translation)
- - "↷": [t: "верхняя стрелка по часовой стрелке"] # 0x21b7 (en: 'clockwise top semicircle arrow', google translation)
- - "↸": [t: "северо -западный стрела до длинного бара"] # 0x21b8 (en: 'north west arrow to long bar', google translation)
- - "↹": [t: "стрелка слева, чтобы пройти вправо, стрелу в бар"] # 0x21b9 (en: 'leftwards arrow to bar over rightwards arrow to bar', google translation)
- - "↺": [t: "стрелка с открытым кругом"] # 0x21ba (en: 'anticlockwise open circle arrow', google translation)
- - "↻": [t: "по часовой стрелке открытый круг стрелы"] # 0x21bb (en: 'clockwise open circle arrow', google translation)
- - "↼": [t: "оставил гарпун вверх"] # 0x21bc (en: 'left harpoon up', google translation)
- - "↽": [t: "оставил гарпун вниз"] # 0x21bd (en: 'left harpoon down', google translation)
- - "↾": [t: "вверх по гарпуне правильно"] # 0x21be (en: 'up harpoon right', google translation)
- - "↿": [t: "вверх по гарпуне ушел"] # 0x21bf (en: 'up harpoon left', google translation)
- - "⇀": [t: "правый гарпун вверх"] # 0x21c0 (en: 'right harpoon up', google translation)
- - "⇁": [t: "правый гарпун вниз"] # 0x21c1 (en: 'right harpoon down', google translation)
- - "⇂": [t: "вниз по гарпуне справа"] # 0x21c2 (en: 'down harpoon right', google translation)
- - "⇃": [t: "вниз по гарпуне ушел"] # 0x21c3 (en: 'down harpoon left', google translation)
- - "⇄": [t: "стрелка вправо над стрелкой влево"] # 0x21c4 (en: 'rightwards arrow over leftwards arrow', google translation)
- - "⇅": [t: "вверх стрелка слева от стрелы вниз"] # 0x21c5 (en: 'upwards arrow leftwards of downwards arrow', google translation)
- - "⇆": [t: "стрелка слева направо"] # 0x21c6 (en: 'leftwards arrow over rightwards arrow', google translation)
- - "⇇": [t: "левые парные стрелы"] # 0x21c7 (en: 'leftwards paired arrows', google translation)
- - "⇈": [t: "вверх парные стрелы"] # 0x21c8 (en: 'upwards paired arrows', google translation)
- - "⇉": [t: "правые парные стрелы"] # 0x21c9 (en: 'rightwards paired arrows', google translation)
- - "⇊": [t: "вниз в парных стрелках"] # 0x21ca (en: 'downwards paired arrows', google translation)
- - "⇋": [t: "левый гарпун над правым гарпуном"] # 0x21cb (en: 'left harpoon over right harpoon', google translation)
- - "⇌": [t: "правый гарпун над левым гарпуном"] # 0x21cc (en: 'right harpoon over left harpoon', google translation)
+ - "ʷ": [t: "верхний индекс w"] # 0x2b7 (en: 'modifier small w', google translation)
+ - "ʸ": [t: "верхний индекс y"] # 0x2b8 (en: 'modifier small y', google translation)
+ - "ʹ": [t: "штрих"] # 0x2b9 (en: 'modifier prime', google translation)
+ - "ʺ": [t: "двойной штрих"] # 0x2ba (en: 'modifier double prime', google translation)
+ - "ʻ": [t: "перевёрнутая запятая"] # 0x2bb (en: 'modifier turned comma', google translation)
+ - "ʼ": [t: "апостроф"] # 0x2bc (en: 'modifier apostrophe', google translation)
+ - "ʽ": [t: "перевёрнутый апостроф"] # 0x2bd (en: 'modifier reversed comma', google translation)
+ - "ʾ": [t: "правое полукольцо"] # 0x2be (en: 'modifier right half ring', google translation)
+ - "ʿ": [t: "левое полукольцо"] # 0x2bf (en: 'modifier left half ring', google translation)
+ - "ˀ": [t: "гортанная смычка"] # 0x2c0 (en: 'modifier glottal stop', google translation)
+ - "ˁ": [t: "перевёрнутая гортанная смычка"] # 0x2c1 (en: 'modifier reversed glottal stop', google translation)
+ - "˂": [t: "левый наконечник стрелки"] # 0x2c2 (en: 'modifier left arrowhead', google translation)
+ - "˃": [t: "правый наконечник стрелки"] # 0x2c3 (en: 'modifier right arrowhead', google translation)
+ - "˄": [t: "верхний наконечник стрелки"] # 0x2c4 (en: 'modifier up arrowhead', google translation)
+ - "˅": [t: "нижний наконечник стрелки"] # 0x2c5 (en: 'modifier down arrowhead', google translation)
+ - "ˆ": [t: "циркумфлекс"] # 0x2c6 (en: 'modifier circumflex accent', google translation)
+ - "ˇ": [t: "гачек"] # 0x2c7 (en: 'check', google translation)
+ - "ˈ": [t: "вертикальная черта"] # 0x2c8 (en: 'modifier vertical line', google translation)
+en: 'right harpoon over left harpoon', google translation)
- "⇍": [t: "слева двойная стрелка с ходом"] # 0x21cd (en: 'leftwards double arrow with stroke', google translation)
- "⇎": [t: "левая правая двойная стрелка с ходом"] # 0x21ce (en: 'left right double arrow with stroke', google translation)
- "⇏": [t: "права двойная стрелка с ходом"] # 0x21cf (en: 'rightwards double arrow with stroke', google translation)
@@ -3644,3 +3097,544 @@
- "↓": [t: "стрелка вниз"] # 0xffec (en: 'down arrow', google translation)
- "": [t: "неизвестный или отсутствующий объект"] # 0xfffc (en: 'unknown or missing object', google translation)
- "�": [t: "неизвестный или отсутствующий символ"] # 0xfffd (en: 'unknown or missing character', google translation)
+- "ˉ": [t: "макрон"] # 0x2c9 (en: 'modifier macron')
+- "ˊ": [t: "акут"] # 0x2ca (en: 'modifier acute accent')
+- "ˋ": [t: "гравис"] # 0x2cb (en: 'modifier grave accent')
+- "ˌ": [t: "нижняя вертикальная черта"] # 0x2cc (en: 'modifier low vertical line')
+- "ˍ": [t: "нижний макрон"] # 0x2cd (en: 'modifier low macron')
+- "ˎ": [t: "нижний гравис"] # 0x2ce (en: 'modifier low grave accent')
+- "ˏ": [t: "нижний акут"] # 0x2cf (en: 'modifier low acute accent')
+- "ː": [t: "знак долготы"] # 0x2d0 (en: 'modifier triangular colon')
+- "ˑ": [t: "половинный знак долготы"] # 0x2d1 (en: 'modifier half triangular colon')
+- "˒": [t: "центрированное правое полукольцо"] # 0x2d2 (en: 'modifier centered right half ring')
+- "˓": [t: "центрированное левое полукольцо"] # 0x2d3 (en: 'modifier centered left half ring')
+- "˔": [t: "верхний упор"] # 0x2d4 (en: 'modifier up tack')
+- "˕": [t: "нижний упор"] # 0x2d5 (en: 'modifier down tack')
+- "˖": [t: "верхний индекс плюс"] # 0x2d6 (en: 'modifier plus sign')
+- "˗": [t: "верхний индекс минус"] # 0x2d7 (en: 'modifier minus sign')
+- "˘": [t: "бреве"] # 0x2d8 (en: 'breve')
+- "˙": [t: "точка сверху"] # 0x2d9 (en: 'dot')
+- "˚": [t: "кольцо сверху"] # 0x2da (en: 'ring above')
+- "˛": [t: "огонек"] # 0x2db (en: 'ogonek')
+- "˜": [t: "малая тильда"] # 0x2dc (en: 'small tilde')
+- "˝": [t: "двойной акут"] # 0x2dd (en: 'double acute accent')
+- "˞": [t: "ротический крюк"] # 0x2de (en: 'modifier rhotic hook')
+- "˟": [t: "перечёркивающий акцент"] # 0x2df (en: 'modifier cross accent')
+- "ˠ": [t: "верхний индекс гаммы"] # 0x2e0 (en: 'modifier small gamma')
+- "ˡ": [t: "верхний индекс l"] # 0x2e1 (en: 'modifier small l')
+- "ˢ": [t: "верхний индекс s"] # 0x2e2 (en: 'modifier small s')
+- "ˣ": [t: "верхний индекс x"] # 0x2e3 (en: 'modifier small x')
+- "ˤ": [t: "верхний индекс перевёрнутой гортанной смычки"] # 0x2e4 (en: 'modifier small reversed glottal stop')
+- "˥": [t: "сверхвысокий тон"] # 0x2e5 (en: 'modifier extra-high tone bar')
+- "˦": [t: "высокий тон"] # 0x2e6 (en: 'modifier high tone bar')
+- "˧": [t: "средний тон"] # 0x2e7 (en: 'modifier mid tone bar')
+- "˨": [t: "низкий тон"] # 0x2e8 (en: 'modifier low tone bar')
+- "˩": [t: "сверхнизкий тон"] # 0x2e9 (en: 'modifier extra-low tone bar')
+- "˪": [t: "знак тона инь"] # 0x2ea (en: 'modifier yin departing tone mark')
+- "˫": [t: "знак тона ян"] # 0x2eb (en: 'modifier yang departing tone mark')
+- "ˬ": [t: "звонкость"] # 0x2ec (en: 'modifier voicing')
+- "˭": [t: "непридыхательность"] # 0x2ed (en: 'modifier unaspirated')
+- "ˮ": [t: "двойной апостроф"] # 0x2ee (en: 'modifier double apostrophe')
+- "˯": [t: "нижний наконечник стрелки вниз"] # 0x2ef (en: 'modifier low down arrowhead')
+- "˰": [t: "нижний наконечник стрелки вверх"] # 0x2f0 (en: 'modifier low up arrowhead')
+- "˱": [t: "нижний наконечник стрелки влево"] # 0x2f1 (en: 'modifier low left arrowhead')
+- "˲": [t: "нижний наконечник стрелки вправо"] # 0x2f2 (en: 'modifier low right arrowhead')
+- "˳": [t: "нижнее кольцо"] # 0x2f3 (en: 'modifier low ring')
+- "˴": [t: "средний гравис"] # 0x2f4 (en: 'modifier middle grave accent')
+- "˵": [t: "средний двойной гравис"] # 0x2f5 (en: 'modifier middle double grave accent')
+- "˶": [t: "средний двойной акут"] # 0x2f6 (en: 'modifier middle double acute accent')
+- "˷": [t: "нижняя тильда"] # 0x2f7 (en: 'modifier low tilde')
+- "˸": [t: "верхнее двоеточие"] # 0x2f8 (en: 'modifier raised colon')
+- "˹": [t: "начало высокого тона"] # 0x2f9 (en: 'modifier begin high tone')
+- "˺": [t: "конец высокого тона"] # 0x2fa (en: 'modifier end high tone')
+- "˻": [t: "начало низкого тона"] # 0x2fb (en: 'modifier begin low tone')
+- "˼": [t: "конец низкого тона"] # 0x2fc (en: 'modifier end low tone')
+- "˽": [t: "полка"] # 0x2fd (en: 'modifier shelf')
+- "˾": [t: "открытая полка"] # 0x2fe (en: 'modifier open shelf')
+- "˿": [t: "нижняя левая стрелка"] # 0x2ff (en: 'modifier low left arrow')
+- "̀": [t: "комбинируемый гравис"] # 0x300 (en: 'grave accent embellishment')
+- "́": [t: "комбинируемый акут"] # 0x301 (en: 'acute accent embellishment')
+- "̂": [t: "комбинируемый циркумфлекс"] # 0x302 (en: 'circumflex accent embellishment')
+- "̃": [t: "комбинируемая тильда"] # 0x303 (en: 'tilde embellishment')
+- "̄": [t: "комбинируемый макрон"] # 0x304 (en: 'macron embellishment')
+- "̅": [t: "комбинируемое надчёркивание"] # 0x305 (en: 'overbar embellishment')
+- "̆": [t: "комбинируемое бреве"] # 0x306 (en: 'breve embellishment')
+- "̇": [t: "комбинируемая точка сверху"] # 0x307 (en: 'dot above embellishment')
+- "̈": [t: "комбинируемый диэрезис"] # 0x308 (en: 'diaeresis embellishment')
+- "̉": [t: "комбинируемый крючок сверху"] # 0x309 (en: 'hook above embellishment')
+- "̊": [t: "комбинируемое кольцо сверху"] # 0x30a (en: 'ring above embellishment')
+- "̋": [t: "комбинируемый двойной акут"] # 0x30b (en: 'double acute accent embellishment')
+- "̌": [t: "комбинируемый гачек"] # 0x30c (en: 'check')
+- "̍": [t: "комбинируемая вертикальная линия сверху"] # 0x30d (en: 'vertical line above embellishment')
+- "̎": [t: "комбинируемая двойная вертикальная линия сверху"] # 0x30e (en: 'double vertical line above embellishment')
+- "̏": [t: "комбинируемый двойной гравис"] # 0x30f (en: 'double grave accent embellishment')
+- "̐": [t: "комбинируемая чандрабинду"] # 0x310 (en: 'candrabindu embellishment')
+- "̑": [t: "комбинируемое перевёрнутое бреве"] # 0x311 (en: 'inverted breve embellishment')
+- "̒": [t: "комбинируемая перевёрнутая запятая сверху"] # 0x312 (en: 'turned comma above embellishment')
+- "̓": [t: "комбинируемая запятая сверху"] # 0x313 (en: 'comma above embellishment')
+- "̔": [t: "комбинируемая перевёрнутая запятая сверху"] # 0x314 (en: 'reversed comma above embellishment')
+- "̕": [t: "комбинируемая запятая справа сверху"] # 0x315 (en: 'comma above right embellishment')
+- "̖": [t: "комбинируемый гравис снизу"] # 0x316 (en: 'grave accent below embellishment')
+- "̗": [t: "комбинируемый акут снизу"] # 0x317 (en: 'acute accent below embellishment')
+- "̘": [t: "комбинируемый левый упор снизу"] # 0x318 (en: 'left tack below embellishment')
+- "̙": [t: "комбинируемый правый упор снизу"] # 0x319 (en: 'right tack below embellishment')
+- "̚": [t: "комбинируемый левый угол сверху"] # 0x31a (en: 'left angle above embellishment')
+- "̛": [t: "комбинируемый рожок"] # 0x31b (en: 'horn embellishment')
+- "̜": [t: "комбинируемое левое полукольцо снизу"] # 0x31c (en: 'left half ring below embellishment')
+- "̝": [t: "комбинируемый верхний упор снизу"] # 0x31d (en: 'up tack below embellishment')
+- "̞": [t: "комбинируемый нижний упор снизу"] # 0x31e (en: 'down tack below embellishment')
+- "̟": [t: "комбинируемый знак плюс снизу"] # 0x31f (en: 'plus sign below embellishment')
+- "̠": [t: "комбинируемый знак минус снизу"] # 0x320 (en: 'minus sign below embellishment')
+- "̡": [t: "комбинируемый палатализованный крюк снизу"] # 0x321 (en: 'palatalized hook below embellishment')
+- "̢": [t: "комбинируемый ретрофлексный крюк снизу"] # 0x322 (en: 'retroflex hook below embellishment')
+- "̣": [t: "комбинируемая точка снизу"] # 0x323 (en: 'dot below embellishment')
+- "̤": [t: "комбинируемый диэрезис снизу"] # 0x324 (en: 'diaeresis below embellishment')
+- "̥": [t: "комбинируемое кольцо снизу"] # 0x325 (en: 'ring below embellishment')
+- "̦": [t: "комбинируемая запятая снизу"] # 0x326 (en: 'comma below embellishment')
+- "̧": [t: "комбинируемая седиль"] # 0x327 (en: 'cedilla embellishment')
+- "̨": [t: "комбинируемый огонек"] # 0x328 (en: 'ogonek embellishment')
+- "̩": [t: "комбинируемая вертикальная линия снизу"] # 0x329 (en: 'vertical line below embellishment')
+- "̪": [t: "комбинируемый мостик снизу"] # 0x32a (en: 'bridge below embellishment')
+- "̫": [t: "комбинируемая перевёрнутая двойная арка снизу"] # 0x32b (en: 'inverted double arch below embellishment')
+- "̬": [t: "комбинируемый гачек снизу"] # 0x32c (en: 'caron below embellishment')
+- "̭": [t: "комбинируемый циркумфлекс снизу"] # 0x32d (en: 'circumflex accent below embellishment')
+- "̮": [t: "комбинируемое бреве снизу"] # 0x32e (en: 'breve below embellishment')
+- "̯": [t: "комбинируемое перевёрнутое бреве снизу"] # 0x32f (en: 'inverted breve below embellishment')
+- "̰": [t: "комбинируемая тильда снизу"] # 0x330 (en: 'tilde below embellishment')
+- "̱": [t: "комбинируемый макрон снизу"] # 0x331 (en: 'macron below embellishment')
+- "̲": [t: "комбинируемое подчёркивание"] # 0x332 (en: 'low line embellishment')
+- "̳": [t: "комбинируемое двойное подчёркивание"] # 0x333 (en: 'double low line embellishment')
+- "̴": [t: "комбинируемая наложенная тильда"] # 0x334 (en: 'tilde overlay embellishment')
+- "̵": [t: "комбинируемая короткая черта"] # 0x335 (en: 'short stroke overlay embellishment')
+- "̶": [t: "комбинируемая длинная черта"] # 0x336 (en: 'long stroke overlay embellishment')
+- "̷": [t: "комбинируемый короткий слэш"] # 0x337 (en: 'short solidus overlay embellishment')
+- "̸": [t: "комбинируемый длинный слэш"] # 0x338 (en: 'long solidus overlay embellishment')
+- "̹": [t: "комбинируемое правое полукольцо снизу"] # 0x339 (en: 'right half ring below embellishment')
+- "̺": [t: "комбинируемый перевёрнутый мостик снизу"] # 0x33a (en: 'inverted bridge below embellishment')
+- "̻": [t: "комбинируемый квадрат снизу"] # 0x33b (en: 'square below embellishment')
+- "̼": [t: "комбинируемая чайка снизу"] # 0x33c (en: 'seagull below embellishment')
+- "̽": [t: "комбинируемый икс сверху"] # 0x33d (en: 'x above embellishment')
+- "̾": [t: "комбинируемая вертикальная тильда"] # 0x33e (en: 'vertical tilde embellishment')
+- "̿": [t: "комбинируемое двойное надчёркивание"] # 0x33f (en: 'double overline embellishment')
+- "̀": [t: "комбинируемый знак гравис-тона"] # 0x340 (en: 'grave tone mark embellishment')
+- "́": [t: "комбинируемый знак акут-тона"] # 0x341 (en: 'acute tone mark embellishment')
+- "͆": [t: "комбинируемый мостик сверху"] # 0x346 (en: 'bridge above')
+
+- "ΪΫϏ": # 0x3aa, 0x3ab, 0x3cf
+ - test:
+ if: "$CapitalLetters_Beep"
+ then:
+ - audio:
+ value: "beep.mp4"
+ replace: []
+ - test:
+ if: "$CapitalLetters_UseWord"
+ then_test:
+ if: "$SpeechOverrides_CapitalLetters = ''"
+ then_test:
+ if: "$Impairment = 'Blindness'"
+ then: [t: "заглавная"] # (en: 'cap')
+ else: [x: "$SpeechOverrides_CapitalLetters"]
+ - pitch:
+ value: "$CapitalLetters_Pitch"
+ replace: [spell: "translate('.', 'ΪΫϏ', 'ιυϗ')"]
+ - t: " с диэрезисом" # (en: 'with dialytika')
+- "ϊ": [t: "йота с диэрезисом"] # 0x3ca (en: 'iota with dialytika')
+- "ϋ": [t: "ипсилон с диэрезисом"] # 0x3cb (en: 'upsilon with dialytika')
+- "ό": [t: "омикрон с ударением"] # 0x3cc (en: 'omicron with tonos')
+- "ύ": [t: "ипсилон с ударением"] # 0x3cd (en: 'upsilon with tonos')
+- "ώ": [t: "омега с ударением"] # 0x3ce (en: 'omega with tonos')
+- "ϐ": [t: "бета"] # 0x3d0 (en: 'beta')
+- "ϑ": [t: "тета"] # 0x3d1 (en: 'theta')
+- "ϒ": [t: "ипсилон с крючком"] # 0x3d2 (en: 'upsilon with hook')
+- "ϓ": [t: "ипсилон с акутом и крючком"] # 0x3d3 (en: 'upsilon with acute and hook')
+- "ϔ": [t: "ипсилон с диэрезисом и крючком"] # 0x3d4 (en: 'upsilon with diaeresis and hook')
+- "ϕ": [t: "фи"] # 0x3d5 (en: 'phi')
+- "ϖ": [t: "пи"] # 0x3d6 (en: 'pi')
+- "ϗ": [t: "кай"] # 0x3d7 (en: 'kai')
+- "Ϙ": [t: "заглавная архаичная коппа"] # 0x3d8 (en: 'cap archaic koppa')
+- "ϙ": [t: "архаичная коппа"] # 0x3d9 (en: 'archaic koppa')
+- "ϵ": [t: "эпсилон"] # 0x3f5 (en: 'epsilon')
+- "϶": [t: "обратный эпсилон"] # 0x3f6 (en: 'reversed epsilon')
+- "А-Я": # 0x410 - 0x42f
+ - test:
+ if: "$CapitalLetters_Beep"
+ then:
+ - audio:
+ value: "beep.mp4"
+ replace: []
+ - test:
+ if: "$CapitalLetters_UseWord"
+ then_test:
+ if: "$SpeechOverrides_CapitalLetters = ''"
+ then_test:
+ if: "$Impairment = 'Blindness'"
+ then: [t: "заглавная"] # (en: 'cap')
+ else: [x: "$SpeechOverrides_CapitalLetters"]
+ - pitch:
+ value: "$CapitalLetters_Pitch"
+ replace: [spell: "translate('.', 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдежзийклмнопрстуфхцчшщъыьэюя')"]
+- "а": [t: "а"] # 0x430
+- "б": [t: "бэ"] # 0x431
+- "в": [t: "вэ"] # 0x432
+- "г": [t: "гэ"] # 0x433
+- "д": [t: "дэ"] # 0x434
+- "е": [t: "е"] # 0x435
+- "ж": [t: "жэ"] # 0x436
+- "з": [t: "зэ"] # 0x437
+- "и": [t: "и"] # 0x438
+- "й": [t: "и краткое"] # 0x439
+- "к": [t: "ка"] # 0x43a
+- "л": [t: "эль"] # 0x43b
+- "м": [t: "эм"] # 0x43c
+- "н": [t: "эн"] # 0x43d
+- "о": [t: "о"] # 0x43e
+- "п": [t: "пэ"] # 0x43f
+- "р": [t: "эр"] # 0x440
+- "с": [t: "эс"] # 0x441
+- "т": [t: "тэ"] # 0x442
+- "у": [t: "у"] # 0x443
+- "ф": [t: "эф"] # 0x444
+- "х": [t: "ха"] # 0x445
+- "ц": [t: "цэ"] # 0x446
+- "ч": [t: "чэ"] # 0x447
+- "ш": [t: "ша"] # 0x448
+- "щ": [t: "ща"] # 0x449
+- "ъ": [t: "твёрдый знак"] # 0x44a
+- "ы": [t: "ы"] # 0x44b
+- "ь": [t: "мягкий знак"] # 0x44c
+- "э": [t: "э"] # 0x44d
+- "ю": [t: "ю"] # 0x44e
+- "я": [t: "я"] # 0x44f
+- "؆": [t: "арабский кубический корень"] # 0x606 (en: 'Arabic-Indic cube root')
+- "؇": [t: "арабский корень четвёртой степени"] # 0x607 (en: 'Arabic-Indic fourth root')
+- "؈": [t: "арабский рай"] # 0x608 (en: 'Arabic ray')
+- "‐": [t: "дефис"] # 0x2010 (en: 'hyphen')
+- "‑": [t: "неразрывный дефис"] # 0x2011 (en: 'non-breaking hyphen')
+- "‒": [t: "цифровое тире"] # 0x2012 (en: 'figure dash')
+- "–": [t: "короткое тире"] # 0x2013 (en: 'en dash')
+- "—": [t: "длинное тире"] # 0x2014 (en: 'em dash')
+- "―": [t: "горизонтальная черта"] # 0x2015 (en: 'horizontal bar')
+- "‖": [t: "двойная вертикальная линия"] # 0x2016 (en: 'double vertical line')
+- "†": [t: "крестик"] # 0x2020 (en: 'dagger')
+- "‡": [t: "двойной крестик"] # 0x2021 (en: 'double dagger')
+
+- " - ": [t: ""] # 0x2000 - 0x2007 (различные пробелы, не озвучиваются)
+
+- "•": # 0x2022
+ - test:
+ if: "@data-chem-formula-op"
+ then: [t: "точка"] # в химических формулах
+ else: [t: "маркер"] # (en: 'bullet')
+
+- "…": # 0x2026
+ test:
+ if:
+ - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or"
+ - "../*[1][.='…']"
+ then: [t: "многоточие"] # (en: 'dot dot dot')
+ else_test:
+ if: "count(following-sibling::*) = 0"
+ then: [t: "и так далее"] # (en: 'and so on')
+ else: [t: "и так далее до"] # (en: 'and so on up to')
+
+- "‰": [t: "промилле"] # 0x2030 (en: 'per mille')
+- "‱": [t: "десять тысяч"] # 0x2031 (en: 'per ten thousand')
+- "′": [t: "штрих"] # 0x2032 (en: 'prime')
+- "″": [t: "двойной штрих"] # 0x2033 (en: 'double prime')
+- "‴": [t: "тройной штрих"] # 0x2034 (en: 'triple prime')
+- "‵": [t: "обратный штрих"] # 0x2035 (en: 'reversed prime')
+- "‶": [t: "обратный двойной штрих"] # 0x2036 (en: 'reversed double prime')
+- "‷": [t: "обратный тройной штрих"] # 0x2037 (en: 'reversed triple prime')
+- "‸": [t: "в степени"] # 0x2038 (en: 'to the')
+- "‹": [t: "левая одиночная угловая кавычка"] # 0x2039 (en: 'single left-pointing angle quote mark')
+- "›": [t: "правая одиночная угловая кавычка"] # 0x203a (en: 'single right-pointing angle quote mark')
+- "‼": [t: "двойной восклицательный знак"] # 0x203c (en: 'double factorial')
+- "⁄": [t: "косая черта дроби"] # 0x2044 (en: 'fraction slash')
+- "⁅": [t: "левая квадратная скобка с пером"] # 0x2045 (en: 'left square bracket with quill')
+- "⁆": [t: "правая квадратная скобка с пером"] # 0x2046 (en: 'right square bracket with quill')
+- "※": [t: "знак ссылки"] # 0x203b (en: 'reference mark')
+- "‿": [t: "соединение снизу"] # 0x203F (en: 'under tie')
+- "⁀": [t: "соединение сверху"] # 0x2040 (en: 'tie')
+- "⁎": [t: "нижняя звёздочка"] # 0x204e (en: 'low asterisk')
+- "⁏": [t: "обратная точка с запятой"] # 0x204f (en: 'reversed semicolon')
+- "⁐": [t: "сомкнуть"] # 0x2050 (en: 'close up')
+- "⁑": [t: "две вертикальные звёздочки"] # 0x2051 (en: 'two vertical asterisks')
+- "⁒": [t: "коммерческий знак минус"] # 0x2052 (en: 'commercial minus sign')
+- "⁗": [t: "четыре штриха"] # 0x2057 (en: 'quadruple prime')
+- "": [t: ""] # 0x2060 (невидимый соединитель)
+- "⁰": [t: "в степени ноль"] # 0x2070 (en: 'to the zeroth power')
+- "ⁱ": [t: "в степени i"] # 0x2071 (en: 'to the i-th power')
+- "⁴": [t: "в четвёртой степени"] # 0x2074 (en: 'to the fourth power')
+- "⁵": [t: "в пятой степени"] # 0x2075 (en: 'to the fifth power')
+- "⁶": [t: "в шестой степени"] # 0x2076 (en: 'to the sixth power')
+- "⁷": [t: "в седьмой степени"] # 0x2077 (en: 'to the seventh power')
+- "⁸": [t: "в восьмой степени"] # 0x2078 (en: 'to the eighth power')
+- "⁹": [t: "в девятой степени"] # 0x2079 (en: 'to the ninth power')
+- "⁺": [t: "верхний индекс плюс"] # 0x207a (en: 'superscript plus sign')
+- "⁻": [t: "верхний индекс минус"] # 0x207b (en: 'superscript minus')
+- "⁼": [t: "верхний индекс равно"] # 0x207c (en: 'superscript equals sign')
+- "⁽": [t: "верхний индекс левая скобка"] # 0x207d (en: 'superscript left parenthesis')
+- "⁾": [t: "верхний индекс правая скобка"] # 0x207e (en: 'superscript right parenthesis')
+- "ⁿ": [t: "в степени n"] # 0x207f (en: 'to the n-th power')
+- "₀": [t: "индекс ноль"] # 0x2080 (en: 'sub zero')
+- "₁": [t: "индекс один"] # 0x2081 (en: 'sub one')
+- "₂": [t: "индекс два"] # 0x2082 (en: 'sub two')
+- "₃": [t: "индекс три"] # 0x2083 (en: 'sub three')
+- "₄": [t: "индекс четыре"] # 0x2084 (en: 'sub four')
+- "₅": [t: "индекс пять"] # 0x2085 (en: 'sub five')
+- "₆": [t: "индекс шесть"] # 0x2086 (en: 'sub six')
+- "₇": [t: "индекс семь"] # 0x2087 (en: 'sub seven')
+- "₈": [t: "индекс восемь"] # 0x2088 (en: 'sub eight')
+- "₉": [t: "индекс девять"] # 0x2089 (en: 'sub nine')
+- "₊": [t: "индекс плюс"] # 0x208a (en: 'subscript plus sign')
+- "₋": [t: "индекс минус"] # 0x208b (en: 'subscript minus sign')
+- "₌": [t: "индекс равно"] # 0x208c (en: 'subscript equals sign')
+- "₍": [t: "индекс левая скобка"] # 0x208d (en: 'subscript left parenthesis')
+- "₎": [t: "индекс правая скобка"] # 0x208e (en: 'subscript right parenthesis')
+- "ₐ": [t: "индекс a"] # 0x2090 (en: 'sub a')
+- "ₑ": [t: "индекс e"] # 0x2091 (en: 'sub e')
+- "ₒ": [t: "индекс o"] # 0x2092 (en: 'sub o')
+- "ₓ": [t: "индекс x"] # 0x2093 (en: 'sub x')
+- "ₕ": [t: "индекс h"] # 0x2095 (en: 'sub h')
+- "ₖ": [t: "индекс k"] # 0x2096 (en: 'sub k')
+- "ₗ": [t: "индекс l"] # 0x2097 (en: 'sub l')
+- "ₘ": [t: "индекс m"] # 0x2098 (en: 'sub m')
+- "ₙ": [t: "индекс n"] # 0x2099 (en: 'sub n')
+- "ₚ": [t: "индекс p"] # 0x209a (en: 'sub p')
+- "ₛ": [t: "индекс s"] # 0x209b (en: 'sub s')
+- "ₜ": [t: "индекс t"] # 0x209c (en: 'sub t')
+- "₠": [t: "евро"] # 0x20a0 (en: 'european currency unit') — устаревший, но пусть будет евро
+- "₡": [t: "колон"] # 0x20a1 (en: 'colon')
+- "₢": [t: "крузейро"] # 0x20a2 (en: 'cruzeiro')
+- "₣": [t: "франк"] # 0x20a3 (en: 'franc')
+- "₤": [t: "лира"] # 0x20a4 (en: 'lira')
+- "₥": [t: "милль"] # 0x20a5 (en: 'mill')
+- "₦": [t: "найра"] # 0x20a6 (en: 'naira')
+- "₧": [t: "песета"] # 0x20a7 (en: 'peseta')
+- "₨": [t: "рупия"] # 0x20a8 (en: 'rupee')
+- "₩": [t: "вона"] # 0x20a9 (en: 'won')
+- "₪": [t: "новый шекель"] # 0x20aa (en: 'new sheqel')
+- "₫": [t: "донг"] # 0x20ab (en: 'dong')
+- "€": [t: "евро"] # 0x20ac (en: 'euro')
+- "₭": [t: "кип"] # 0x20ad (en: 'kip')
+- "₮": [t: "тугрик"] # 0x20ae (en: 'tugrik')
+- "₯": [t: "драхма"] # 0x20af (en: 'drachma')
+- "₰": [t: "пфенниг"] # 0x20b0 (en: 'german penny')
+- "₱": [t: "песо"] # 0x20b1 (en: 'peso')
+- "₲": [t: "гуарани"] # 0x20b2 (en: 'guarani')
+- "₳": [t: "аустраль"] # 0x20b3 (en: 'austral')
+- "₴": [t: "гривна"] # 0x20b4 (en: 'hryvnia')
+- "₵": [t: "седи"] # 0x20b5 (en: 'cedi')
+- "₶": [t: "ливр"] # 0x20b6 (en: 'livre tournois')
+- "₷": [t: "спесмило"] # 0x20b7 (en: 'spesmilo')
+- "₸": [t: "тенге"] # 0x20b8 (en: 'tenge')
+- "₹": [t: "индийская рупия"] # 0x20b9 (en: 'indian rupee')
+- "₺": [t: "турецкая лира"] # 0x20ba (en: 'turkish lira')
+- "⃐": [t: "комбинируемый левый гарпун сверху"] # 0x20d0 (en: 'left harpoon above embellishment')
+- "⃑": [t: "комбинируемый правый гарпун сверху"] # 0x20d1 (en: 'right harpoon above embellishment')
+- "⃒": [t: "комбинируемая длинная вертикальная черта"] # 0x20d2 (en: 'long vertical line overlay embellishment')
+- "⃓": [t: "комбинируемая короткая вертикальная черта"] # 0x20d3 (en: 'short vertical line overlay embellishment')
+- "⃔": [t: "комбинируемая стрелка против часовой стрелки"] # 0x20d4 (en: 'anticlockwise arrow above embellishment')
+- "⃕": [t: "комбинируемая стрелка по часовой стрелке"] # 0x20d5 (en: 'clockwise arrow above embellishment')
+- "⃖": [t: "комбинируемая стрелка влево сверху"] # 0x20d6 (en: 'left arrow above embellishment')
+- "⃗": [t: "комбинируемая стрелка вправо сверху"] # 0x20d7 (en: 'right arrow above embellishment')
+- "⃘": [t: "комбинируемое кольцо"] # 0x20d8 (en: 'ring overlay embellishment')
+- "⃙": [t: "комбинируемое кольцо по часовой стрелке"] # 0x20d9 (en: 'clockwise ring overlay embellishment')
+- "⃚": [t: "комбинируемое кольцо против часовой стрелки"] # 0x20da (en: 'anticlockwise ring overlay embellishment')
+- "⃛": [t: "комбинируемые три точки"] # 0x20db (en: 'triple dot')
+- "⃜": [t: "комбинируемые четыре точки"] # 0x20dc (en: 'quadruple dot')
+- "⃝": [t: "комбинируемый круг"] # 0x20dd (en: 'enclosing circle embellishment')
+- "⃞": [t: "комбинируемый квадрат"] # 0x20de (en: 'enclosing square embellishment')
+- "⃟": [t: "комбинируемый ромб"] # 0x20df (en: 'enclosing diamond embellishment')
+- "⃠": [t: "комбинируемый круг с обратной косой"] # 0x20e0 (en: 'enclosing circle backslash embellishment')
+- "⃡": [t: "комбинируемая стрелка влево-вправо сверху"] # 0x20e1 (en: 'left right arrow above embellishment')
+- "⃢": [t: "комбинируемый прямоугольник"] # 0x20e2 (en: 'enclosing screen embellishment')
+- "⃣": [t: "комбинируемый значок клавиши"] # 0x20e3 (en: 'enclosing keycap embellishment')
+- "⃤": [t: "комбинируемый треугольник вверх"] # 0x20e4 (en: 'enclosing upward pointing triangle embellishment')
+- "⃥": [t: "комбинируемая обратная косая черта"] # 0x20e5 (en: 'reverse solidus overlay embellishment')
+- "⃦": [t: "комбинируемая двойная вертикальная черта"] # 0x20e6 (en: 'double vertical stroke embellishment')
+- "⃧": [t: "комбинируемый символ аннуитета"] # 0x20e7 (en: 'annuity symbol embellishment')
+- "⃨": [t: "комбинируемые три точки снизу"] # 0x20e8 (en: 'triple underdot')
+- "⃩": [t: "комбинируемый широкий мостик сверху"] # 0x20e9 (en: 'wide bridge above embellishment')
+- "⃪": [t: "комбинируемая левая стрелка"] # 0x20ea (en: 'leftwards arrow overlay embellishment')
+- "⃫": [t: "комбинируемая длинная двойная косая"] # 0x20eb (en: 'long double solidus overlay embellishment')
+- "⃬": [t: "комбинируемый правый гарпун вниз"] # 0x20ec (en: 'rightwards harpoon with barb downwards embellishment')
+- "⃭": [t: "комбинируемый левый гарпун вниз"] # 0x20ed (en: 'leftwards harpoon with barb downwards embellishment')
+- "⃮": [t: "комбинируемая левая стрелка снизу"] # 0x20ee (en: 'left arrow below embellishment')
+- "⃯": [t: "комбинируемая правая стрелка снизу"] # 0x20ef (en: 'right arrow below embellishment')
+- "⃰": [t: "комбинируемая звёздочка сверху"] # 0x20f0 (en: 'asterisk above embellishment')
+- "℄": [t: "символ центровой линии"] # 0x2104 (en: 'center line symbol')
+- "℅": [t: "вниманию"] # 0x2105 (en: 'care of')
+- "℆": [t: "каждая"] # 0x2106 (en: 'cada una')
+- "ℇ": [t: "постоянная Эйлера"] # 0x2107 (en: 'Euler's constant')
+- "℈": [t: "скрупул"] # 0x2108 (en: 'scruple')
+- "℉": [t: "градус Фаренгейта"] # 0x2109 (en: 'degree Fahrenheit')
+- "ℊ": [t: "рукописная g"] # 0x210a (en: 'script g')
+- "ℌℑℨℭ": # 0x210c, 0x2111, 0x2128, 0x212d
+ - t: "готическое" # (en: 'fraktur')
+ - spell: "translate('.', 'ℌℑℨℭ', 'HIZC')"
+- "ℍℙℾℿ": # 0x210d, 0x2119, 0x213e, 0x213f
+ - t: "двойное" # (en: 'double struck')
+ - spell: "translate('.', 'ℍℙℾℿ', 'HPΓΠ')"
+- "ℎ": [t: "постоянная Планка"] # 0x210e (en: 'Planck constant')
+- "ℏ": [t: "постоянная Планка с чертой"] # 0x210f (en: 'h-bar')
+
+- "ℐℒ℘ℬℰℱℳ": # 0x2110, 0x2112, 0x2118, 0x2130, 0x2131, 0x2133
+ - t: "рукописное" # (en: 'script')
+ - spell: "translate('.', 'ℐℒ℘ℬℰℱℳ', 'ILPBEFM')"
+
+- "ℓ": [t: "рукописная l"] # 0x2113 (en: 'script l')
+- "℔": [t: "фунт"] # 0x2114 (en: 'pound')
+- "№": [t: "номер"] # 0x2116 (en: 'numero')
+- "℥": [t: "унция"] # 0x2125 (en: 'ounce')
+- "Ω": [t: "ом"] # 0x2126 (en: 'ohm')
+- "℧": [t: "сименс"] # 0x2127 (en: 'mho')
+- "℩": [t: "перевёрнутая йота"] # 0x2129 (en: 'turned iota')
+- "K": [t: "кельвин"] # 0x212a (en: 'kelvin')
+- "Å": [t: "ангстрем"] # 0x212b (en: 'angstrom')
+- "ℯ": [t: "рукописная e"] # 0x212f (en: 'script e')
+
+- "Ⅎ℺⅁⅂⅃⅄": # 0x2132, 0x213a, 0x2141, 0x2142, 0x2143, 0x2144
+ - test:
+ - if: "'.' = '℺'"
+ then: [t: "повёрнутое"] # (en: 'rotated')
+ - else_if: "'.' = 'Ⅎ'"
+ then: [t: "перевёрнутое"] # (en: 'turned')
+ - else_if: "'.' = '⅃'"
+ then: [t: "обратное без засечек"] # (en: 'reversed sans-serif')
+ else: [t: "повёрнутое без засечек"] # (en: 'turned sans-serif')
+ - spell: "translate('.', 'Ⅎ℺⅁⅂⅃⅄', 'FQGLLY')"
+
+- "ℴ": [t: "рукописная o"] # 0x2134 (en: 'script o')
+- "ℵ": [t: "алеф"] # 0x2135 (en: 'alef')
+- "ℶ": [t: "бет"] # 0x2136 (en: 'bet')
+- "ℷ": [t: "гимель"] # 0x2137 (en: 'gimel')
+- "ℸ": [t: "далет"] # 0x2138 (en: 'dalet')
+- "ℼ": [t: "двойное пи"] # 0x213c (en: 'double-struck pi')
+- "ℽ": [t: "двойная гамма"] # 0x213d (en: 'double-struck gamma')
+- "⅀": [t: "двойная сумма"] # 0x2140 (en: 'double-struck n-ary summation')
+- "⅋": [t: "перевёрнутый амперсанд"] # 0x214b (en: 'turned ampersand')
+- "⅌": [t: "на"] # 0x214c (en: 'per')
+- "ⅎ": [t: "перевёрнутая f"] # 0x214e (en: 'turned f')
+- "¼": [t: "одна четверть"] # 0x00bc (en: 'one quarter')
+- "½": [t: "одна вторая"] # 0x00bd (en: 'one half')
+- "¾": [t: "три четверти"] # 0x00be (en: 'three quarters')
+- "⅐": [t: "одна седьмая"] # 0x2150 (en: 'one seventh')
+- "⅑": [t: "одна девятая"] # 0x2151 (en: 'one ninth')
+- "⅒": [t: "одна десятая"] # 0x2152 (en: 'one tenth')
+- "⅓": [t: "одна треть"] # 0x2153 (en: 'one third')
+- "⅔": [t: "две трети"] # 0x2154 (en: 'two thirds')
+- "⅕": [t: "одна пятая"] # 0x2155 (en: 'one fifth')
+- "⅖": [t: "две пятых"] # 0x2156 (en: 'two fifths')
+- "⅗": [t: "три пятых"] # 0x2157 (en: 'three fifths')
+- "⅘": [t: "четыре пятых"] # 0x2158 (en: 'four fifths')
+- "⅙": [t: "одна шестая"] # 0x2159 (en: 'one sixth')
+- "⅚": [t: "пять шестых"] # 0x215a (en: 'five sixths')
+- "⅛": [t: "одна восьмая"] # 0x215b (en: 'one eighth')
+- "⅜": [t: "три восьмых"] # 0x215c (en: 'three eighths')
+- "⅝": [t: "пять восьмых"] # 0x215d (en: 'five eighths')
+- "⅞": [t: "семь восьмых"] # 0x215e (en: 'seven eighths')
+- "⅟": [t: "один"] # 0x215f (en: 'one over')
+- "Ⅰ": [t: "один"] # 0x2160 (римская цифра)
+- "Ⅱ": [t: "два"] # 0x2161
+- "Ⅲ": [t: "три"] # 0x2162
+- "Ⅳ": [t: "четыре"] # 0x2163
+- "Ⅴ": [t: "пять"] # 0x2164
+- "Ⅵ": [t: "шесть"] # 0x2165
+- "Ⅶ": [t: "семь"] # 0x2166
+- "Ⅷ": [t: "восемь"] # 0x2167
+- "Ⅸ": [t: "девять"] # 0x2168
+- "Ⅹ": [t: "десять"] # 0x2169
+- "Ⅺ": [t: "одиннадцать"] # 0x216a
+- "Ⅻ": [t: "двенадцать"] # 0x216b
+- "Ⅼ": [t: "пятьдесят"] # 0x216c
+- "Ⅽ": [t: "сто"] # 0x216d
+- "Ⅾ": [t: "пятьсот"] # 0x216e
+- "Ⅿ": [t: "тысяча"] # 0x216f
+- "ⅰ": [t: "один"] # 0x2170
+- "ⅱ": [t: "два"] # 0x2171
+- "ⅲ": [t: "три"] # 0x2172
+- "ⅳ": [t: "четыре"] # 0x2173
+- "ⅴ": [t: "пять"] # 0x2174
+- "ⅵ": [t: "шесть"] # 0x2175
+- "ⅶ": [t: "семь"] # 0x2176
+- "ⅷ": [t: "восемь"] # 0x2177
+- "ⅸ": [t: "девять"] # 0x2178
+- "ⅹ": [t: "десять"] # 0x2179
+- "ⅺ": [t: "одиннадцать"] # 0x217a
+- "ⅻ": [t: "двенадцать"] # 0x217b
+- "ⅼ": [t: "пятьдесят"] # 0x217c
+- "ⅽ": [t: "сто"] # 0x217d
+- "ⅾ": [t: "пятьсот"] # 0x217e
+- "ⅿ": [t: "тысяча"] # 0x217f
+- "↉": [t: "ноль третьих"] # 0x2189 (en: 'zero thirds')
+- "←": [t: "стрелка влево"] # 0x2190
+- "↑": [t: "стрелка вверх"] # 0x2191
+- "→": [t: "стрелка вправо"] # 0x2192
+- "↓": [t: "стрелка вниз"] # 0x2193
+- "↔": [t: "стрелка влево-вправо"] # 0x2194
+- "↕": [t: "стрелка вверх-вниз"] # 0x2195
+- "↖": [t: "стрелка северо-запад"] # 0x2196
+- "↗": # 0x2197
+ - test:
+ if: "ancestor::*[2][self::m:limit]"
+ then: [t: "стремится снизу"] # (en: 'approaches from below')
+ else: [t: "стрелка северо-восток"] # 0x2197
+- "↘": # 0x2198
+ - test:
+ if: "ancestor::*[2][self::m:limit]"
+ then: [t: "стремится сверху"] # (en: 'approaches from above')
+ else: [t: "стрелка юго-восток"] # 0x2198
+- "↙": [t: "стрелка юго-запад"] # 0x2199
+- "↚": [t: "стрелка влево с чертой"] # 0x219a
+- "↛": [t: "стрелка вправо с чертой"] # 0x219b
+- "↜": [t: "стрелка влево волнистая"] # 0x219c
+- "↝": [t: "стрелка вправо волнистая"] # 0x219d
+- "↞": [t: "стрелка влево с двумя головками"] # 0x219e
+- "↟": [t: "стрелка вверх с двумя головками"] # 0x219f
+- "↠": [t: "стрелка вправо с двумя головками"] # 0x21a0
+- "↡": [t: "стрелка вниз с двумя головками"] # 0x21a1
+- "↢": [t: "стрелка влево с хвостом"] # 0x21a2
+- "↣": [t: "стрелка вправо с хвостом"] # 0x21a3
+- "↤": [t: "стрелка влево от черты"] # 0x21a4
+- "↥": [t: "стрелка вверх от черты"] # 0x21a5
+- "↦": [t: "стрелка вправо от черты"] # 0x21a6
+- "↧": [t: "стрелка вниз от черты"] # 0x21a7
+- "↨": [t: "стрелка вверх-вниз с основанием"] # 0x21a8
+- "↩": [t: "стрелка влево с крючком"] # 0x21a9
+- "↪": [t: "стрелка вправо с крючком"] # 0x21aa
+- "↫": [t: "стрелка влево с петлей"] # 0x21ab
+- "↬": [t: "стрелка вправо с петлей"] # 0x21ac
+- "↭": [t: "стрелка влево-вправо волнистая"] # 0x21ad
+- "↮": [t: "стрелка влево-вправо с чертой"] # 0x21ae
+- "↯": [t: "стрелка зигзаг вниз"] # 0x21af
+- "↰": [t: "стрелка вверх с наконечником влево"] # 0x21b0
+- "↱": [t: "стрелка вверх с наконечником вправо"] # 0x21b1
+- "↲": [t: "стрелка вниз с наконечником влево"] # 0x21b2
+- "↳": [t: "стрелка вниз с наконечником вправо"] # 0x21b3
+- "↴": [t: "стрелка вправо с углом вниз"] # 0x21b4
+- "↵": [t: "стрелка вниз с углом влево"] # 0x21b5
+- "↶": [t: "полукруг против часовой стрелки сверху"] # 0x21b6
+- "↷": [t: "полукруг по часовой стрелке сверху"] # 0x21b7
+- "↸": [t: "стрелка северо-запад к длинной черте"] # 0x21b8
+- "↹": [t: "стрелка влево к черте над стрелкой вправо к черте"] # 0x21b9
+- "↺": [t: "разомкнутый круг против часовой стрелки"] # 0x21ba
+- "↻": [t: "разомкнутый круг по часовой стрелке"] # 0x21bb
+- "↼": [t: "левый гарпун вверх"] # 0x21bc
+- "↽": [t: "левый гарпун вниз"] # 0x21bd
+- "↾": [t: "правый гарпун вверх"] # 0x21be
+- "↿": [t: "левый гарпун вверх"] # 0x21bf (дубль? в оригинале было 'up harpoon left')
+- "⇀": [t: "правый гарпун вверх"] # 0x21c0
+- "⇁": [t: "правый гарпун вниз"] # 0x21c1
+- "⇂": [t: "правый гарпун вниз"] # 0x21c2 (дубль? в оригинале 'down harpoon right')
+- "⇃": [t: "левый гарпун вниз"] # 0x21c3
+- "⇄": [t: "стрелка вправо над стрелкой влево"] # 0x21c4
+- "⇅": [t: "стрелка вверх слева от стрелки вниз"] # 0x21c5
+- "⇆": [t: "стрелка влево над стрелкой вправо"] # 0x21c6
+- "⇇": [t: "две стрелки влево"] # 0x21c7
+- "⇈": [t: "две стрелки вверх"] # 0x21c8
+- "⇉": [t: "две стрелки вправо"] # 0x21c9
+- "⇊": [t: "две стрелки вниз"] # 0x21ca
+- "⇋": [t: "левый гарпун над правым гарпуном"] # 0x21cb
+- "⇌": [t: "правый гарпун над левым гарпуном"] # 0x21cc
From 5433a8c378a562c7d112cec647c3ad43bdb8d48a Mon Sep 17 00:00:00 2001
From: Danil <81031453+Kostenkov-2021@users.noreply.github.com>
Date: Mon, 9 Mar 2026 16:13:07 +0300
Subject: [PATCH 7/7] Add Russian ClearSpeak/SimpleSpeak tests
Add a Russian language test suite for ClearSpeak and SimpleSpeak. New test modules cover functions, large operators, menclose, fractions (mfrac), roots (mroot), superscripts (msup), multiline, sets, symbols/adornments, geometry, linear algebra, subscripts, and more (alphabets, chemistry, intent, mtable, shared, units). Update tests/languages.rs to include the new "ru" tests. These tests exercise many speech patterns (logs, trig, intervals, sums/products/unions/intersections, integrals, mixed/nested fractions, implied/explicit multiplication, parentheses handling, and menclose notations).
---
tests/Languages/ru.rs | 34 +
tests/Languages/ru/ClearSpeak/functions.rs | 450 +++++++
tests/Languages/ru/ClearSpeak/large_ops.rs | 201 +++
tests/Languages/ru/ClearSpeak/menclose.rs | 193 +++
tests/Languages/ru/ClearSpeak/mfrac.rs | 274 +++++
tests/Languages/ru/ClearSpeak/mroot.rs | 132 ++
tests/Languages/ru/ClearSpeak/msup.rs | 336 +++++
tests/Languages/ru/ClearSpeak/multiline.rs | 178 +++
tests/Languages/ru/ClearSpeak/sets.rs | 446 +++++++
.../ru/ClearSpeak/symbols_and_adornments.rs | 330 +++++
tests/Languages/ru/SimpleSpeak/functions.rs | 332 +++++
tests/Languages/ru/SimpleSpeak/geometry.rs | 27 +
tests/Languages/ru/SimpleSpeak/large_ops.rs | 201 +++
.../ru/SimpleSpeak/linear_algebra.rs | 92 ++
tests/Languages/ru/SimpleSpeak/mfrac.rs | 276 +++++
tests/Languages/ru/SimpleSpeak/msup.rs | 333 +++++
tests/Languages/ru/SimpleSpeak/multiline.rs | 75 ++
tests/Languages/ru/SimpleSpeak/sets.rs | 235 ++++
tests/Languages/ru/SimpleSpeak/subscripts.rs | 49 +
tests/Languages/ru/alphabets.rs | 340 ++++++
tests/Languages/ru/chemistry.rs | 721 +++++++++++
tests/Languages/ru/intent.rs | 116 ++
tests/Languages/ru/mtable.rs | 1084 +++++++++++++++++
tests/Languages/ru/shared.rs | 451 +++++++
tests/Languages/ru/units.rs | 489 ++++++++
tests/languages.rs | 1 +
26 files changed, 7396 insertions(+)
create mode 100644 tests/Languages/ru.rs
create mode 100644 tests/Languages/ru/ClearSpeak/functions.rs
create mode 100644 tests/Languages/ru/ClearSpeak/large_ops.rs
create mode 100644 tests/Languages/ru/ClearSpeak/menclose.rs
create mode 100644 tests/Languages/ru/ClearSpeak/mfrac.rs
create mode 100644 tests/Languages/ru/ClearSpeak/mroot.rs
create mode 100644 tests/Languages/ru/ClearSpeak/msup.rs
create mode 100644 tests/Languages/ru/ClearSpeak/multiline.rs
create mode 100644 tests/Languages/ru/ClearSpeak/sets.rs
create mode 100644 tests/Languages/ru/ClearSpeak/symbols_and_adornments.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/functions.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/geometry.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/large_ops.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/linear_algebra.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/mfrac.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/msup.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/multiline.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/sets.rs
create mode 100644 tests/Languages/ru/SimpleSpeak/subscripts.rs
create mode 100644 tests/Languages/ru/alphabets.rs
create mode 100644 tests/Languages/ru/chemistry.rs
create mode 100644 tests/Languages/ru/intent.rs
create mode 100644 tests/Languages/ru/mtable.rs
create mode 100644 tests/Languages/ru/shared.rs
create mode 100644 tests/Languages/ru/units.rs
diff --git a/tests/Languages/ru.rs b/tests/Languages/ru.rs
new file mode 100644
index 00000000..45bce3f9
--- /dev/null
+++ b/tests/Languages/ru.rs
@@ -0,0 +1,34 @@
+#![allow(non_snake_case)]
+
+mod ClearSpeak {
+ mod functions;
+ mod large_ops;
+ mod menclose;
+ mod mfrac;
+ mod mroot;
+ mod msup;
+ mod sets;
+ mod symbols_and_adornments;
+ mod multiline;
+}
+
+mod SimpleSpeak {
+ mod functions;
+ mod large_ops;
+ // mod menclose;
+ mod mfrac;
+ // mod mroot;
+ mod msup;
+ mod sets;
+ mod geometry;
+ mod linear_algebra;
+ mod multiline;
+ mod subscripts;
+}
+mod shared;
+mod units;
+mod chemistry;
+mod alphabets;
+mod intent;
+mod mtable;
+
diff --git a/tests/Languages/ru/ClearSpeak/functions.rs b/tests/Languages/ru/ClearSpeak/functions.rs
new file mode 100644
index 00000000..27b2de58
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/functions.rs
@@ -0,0 +1,450 @@
+/// Tests for:
+/// * functions including trig functions, logs, and functions to powers
+/// * implied times/functional call and explicit times/function call
+/// * parens
+/// These are all intertwined, so they are in one file
+use crate::common::*;
+
+#[test]
+fn trig_names() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "синус икс плюс косинус игрек плюс тангенс зет плюс секанс альфа, плюс косеканс фи, плюс котангенс фи");
+}
+
+#[test]
+fn hyperbolic_trig_names() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "гиперболический синус икс, плюс гиперболический косинус игрек, плюс гиперболический тангенс зет, плюс гиперболический секанс альфа, плюс гиперболический косеканс фи, плюс гиперболический котангенс фи");
+}
+
+#[test]
+fn inverse_trig() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "арксинус икс");
+}
+
+#[test]
+fn inverse_trig_trig_inverse() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Trig", "TrigInverse", expr,
+ "обратный тангенс икс");
+}
+
+#[test]
+fn inverse_trig_arc() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Trig", "ArcTrig", expr,
+ "ареакосинус икс");
+}
+
+#[test]
+fn trig_squared() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "синус в квадрате икс");
+}
+
+#[test]
+fn trig_cubed() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тангенс в кубе икс");
+}
+
+#[test]
+fn trig_fourth() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "секанс в четвертой степени икс");
+}
+
+#[test]
+fn trig_power_other() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "гиперболический синус икс в степени n минус 1");
+}
+
+#[test]
+fn simple_log() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "логарифм икс");
+}
+
+#[test]
+fn normal_log() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "логарифм от, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn simple_log_with_base() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "логарифм икс, по основанию бэ");
+}
+
+#[test]
+fn normal_log_with_base() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "логарифм скобка открывается икс плюс игрек, скобка закрывается, по основанию бэ");
+}
+
+#[test]
+fn simple_ln() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "эл эн икс");
+}
+
+#[test]
+fn normal_ln() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "эл эн от, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn simple_natural_log() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Log", "LnAsNaturalLog", expr,
+ "натуральный логарифм икс");
+}
+
+#[test]
+fn natural_log() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Log", "LnAsNaturalLog", expr,
+ "натуральный логарифм от, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn explicit_function_call_with_parens() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тэ от икс");
+}
+
+#[test]
+fn explicit_times_with_parens() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тэ умножить на икс");
+}
+
+#[test]
+fn explicit_function_call() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тэ от икс");
+}
+
+#[test]
+fn explicit_times() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тэ икс");
+}
+
+#[test]
+fn test_functions_none_pref() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Functions", "None", expr,
+ "логарифм от, скобка открывается икс плюс игрек, скобка закрывается; плюс, эф умножить на, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn test_functions_none_pref_multiple_args() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Functions", "None", expr,
+ "бэ большое умножить на, скобка открывается 2 запятая 6, скобка закрывается");
+}
+
+/*
+ * Tests for times
+ */
+#[test]
+fn no_times_binomial() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "икс игрек");
+}
+
+#[test]
+fn times_following_paren() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 умножить на 3");
+}
+
+#[test]
+fn times_preceding_paren() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 умножить на 3");
+}
+
+#[test]
+fn times_sqrt() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "квадратный корень из а; умножить на квадратный корень из бэ; равно, квадратный корень из а бэ");
+}
+
+#[test]
+fn more_implied_times() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_ImpliedTimes", "MoreImpliedTimes", expr,
+ "скобка 2 умножить на икс закрывается в квадрате");
+}
+
+#[test]
+fn explicit_times_more_implied_times() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_ImpliedTimes", "MoreImpliedTimes", expr, "тэ умножить на икс");
+}
+
+#[test]
+fn explicit_times_none_simple_right() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_ImpliedTimes", "None",
+ expr, "2, квадратная скобка открывается 3 квадратная скобка закрывается");
+}
+
+#[test]
+fn explicit_times_none_simple_left() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_ImpliedTimes", "None",
+ expr, "скобка открывается 2 минус 1, скобка закрывается; икс");
+}
+
+#[test]
+fn explicit_times_none_superscript() {
+ let expr = "";
+ test_ClearSpeak_prefs("ru",
+ vec![("ClearSpeak_ImpliedTimes", "None"), ("ClearSpeak_Functions", "None")],
+ expr, "эф скобка открывается икс скобка закрывается; равно; икс в квадрате, скобка открывается икс плюс 1, скобка закрывается");
+}
+
+/*
+ * Tests for parens
+ */
+#[test]
+fn no_parens_number() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "25 умножить на икс");
+}
+
+#[test]
+fn no_parens_monomial() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "бэ, скобка открывается икс игрек скобка закрывается");
+}
+
+#[test]
+fn no_parens_negative_number() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 плюс минус 2");
+}
+
+#[test]
+fn no_parens_negative_number_with_var() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "минус 2 икс, плюс 1");
+}
+
+#[test]
+fn parens_superscript() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "скобка открывается 2 икс скобка закрывается в квадрате");
+}
+
+#[test]
+fn no_parens_fraction() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 плюс одна вторая");
+}
+
+// Tests for the ten types of intervals in ClearSpeak
+#[test]
+fn parens_interval_open_open() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от цэ до дэ, не включая цэ и дэ");
+}
+
+#[test]
+fn parens_interval_closed_open() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от цэ до дэ, включая цэ, но не включая дэ");
+}
+
+#[test]
+fn parens_interval_open_closed() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от цэ до дэ, не включая цэ, но включая дэ");
+}
+
+#[test]
+fn parens_interval_closed_closed() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от цэ до дэ, включая цэ и дэ");
+}
+
+#[test]
+fn parens_interval_neg_infinity_open_open() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от минус бесконечности до дэ, не включая дэ");
+}
+
+#[test]
+fn parens_interval_neg_infinity_closed_open() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от минус бесконечности до дэ, включая дэ");
+}
+
+#[test]
+fn parens_interval_open_open_infinity() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от цэ до бесконечности, не включая цэ");
+}
+
+#[test]
+fn parens_interval_closed_open_infinity() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от цэ до бесконечности, включая цэ");
+}
+
+#[test]
+fn parens_interval_neg_infinity_to_infinity() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от минус бесконечности до бесконечности");
+}
+
+#[test]
+fn parens_interval_neg_infinity_to_pos_infinity() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Paren", "Interval", expr,
+ "интервал от минус бесконечности до плюс бесконечности");
+}
diff --git a/tests/Languages/ru/ClearSpeak/large_ops.rs b/tests/Languages/ru/ClearSpeak/large_ops.rs
new file mode 100644
index 00000000..860914d8
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/large_ops.rs
@@ -0,0 +1,201 @@
+use crate::common::*;
+
+#[test]
+fn sum_both() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "сумма от n равно 1 до 10 от n");
+}
+
+#[test]
+fn sum_under() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "сумма по эс большое от i");
+}
+
+#[test]
+fn sum_both_msubsup() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "сумма от n равно 1 до 10 от n");
+}
+
+#[test]
+fn sum_sub() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "сумма по эс большое от i");
+}
+
+#[test]
+fn sum() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "сумма а с индексом i");
+}
+
+#[test]
+fn product_both() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "произведение от n равно 1 до 10 от n");
+}
+
+#[test]
+fn product_under() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "произведение по эс большое от i");
+}
+
+#[test]
+fn product() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "произведение а с индексом i");
+}
+
+#[test]
+fn intersection_both() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "пересечение от i равно 1 до 10 от; эс большое с индексом i");
+}
+
+#[test]
+fn intersection_under() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "пересечение по цэ большое от, эс большое с индексом i");
+}
+
+#[test]
+fn intersection() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "пересечение эс большое с индексом i");
+}
+
+#[test]
+fn union_both() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "объединение от i равно 1 до 10 от; эс большое с индексом i");
+}
+
+#[test]
+fn union_under() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "объединение по цэ большое от, эс большое с индексом i");
+}
+
+#[test]
+fn union() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "объединение эс большое с индексом i");
+}
+
+#[test]
+fn integral_both() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "интеграл от 0 до 1 от, эф от икс; д икс");
+}
+
+#[test]
+fn integral_under() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "интеграл по действительным числам от; эф от икс д икс");
+}
+
+#[test]
+fn integral() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "интеграл от эф от икс д икс");
+}
diff --git a/tests/Languages/ru/ClearSpeak/menclose.rs b/tests/Languages/ru/ClearSpeak/menclose.rs
new file mode 100644
index 00000000..f6cea552
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/menclose.rs
@@ -0,0 +1,193 @@
+use crate::common::*;
+
+#[test]
+fn menclose_actuarial() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "актуарный символ, содержащее 3 плюс 2 и конец");
+}
+
+#[test]
+fn menclose_box() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "рамка, окружность, содержащее 3 плюс 2 и конец");
+}
+
+#[test]
+fn menclose_left() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "линия слева, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_right() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "линия справа, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_top_bottom() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "линия сверху, снизу, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_updiagonalstrike() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "диагональ вверх, перечеркивание, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_downdiagonalstrike() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "диагональ вниз, перечеркивание, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_cross_out() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "икс, перечеркивание, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_vertical_horizontal_strike() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "вертикальная, горизонтальная, перечеркивание, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_leftarrow() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "стрелка влево, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_right_up_down_arrow() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "стрелка вверх, стрелка вниз, стрелка вправо, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_northeastarrow() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "стрелка на северо-восток, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_other_single_arrows() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "стрелка на юго-восток, стрелка на юго-запад, стрелка на северо-запад, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_northwestsoutheastarrow() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "двунаправленная диагональная стрелка вниз, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_other_double_arrows() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "двунаправленная вертикальная стрелка, двунаправленная горизонтальная стрелка, двунаправленная диагональная стрелка вверх, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_madrub() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "арабский символ факториала, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_phasorangle() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "угол фазы, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_circle_phasorangle() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "окружность, угол фазы, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_longdiv() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "знак деления уголком, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_longdiv_default() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "знак деления уголком, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_longdiv_empty_string() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "знак деления уголком, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_longdiv_whitespace_string() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "знак деления уголком, содержащее три вторых конец");
+}
+
+#[test]
+fn menclose_radical() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "квадратный корень, содержащее три вторых конец");
+}
+
+#[test]
+fn simple_speak_menclose_top_bottom() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "линия сверху, снизу, содержащее три вторых конец");
+}
diff --git a/tests/Languages/ru/ClearSpeak/mfrac.rs b/tests/Languages/ru/ClearSpeak/mfrac.rs
new file mode 100644
index 00000000..ea85c812
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/mfrac.rs
@@ -0,0 +1,274 @@
+/// Tests for fractions
+/// includes simple fractions and more complex fractions
+/// also tests mixed fractions (implicit and explicit)
+use crate::common::*;
+
+#[test]
+fn common_fraction_half() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "одна вторая");
+}
+
+#[test]
+fn common_fraction_thirds() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "две третьих");
+}
+
+#[test]
+fn common_fraction_tenths() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "семнадцать десятых");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "семнадцать десятых");
+}
+
+#[test]
+#[allow(non_snake_case)]
+fn not_ClearSpeak_common_fraction_tenths() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "89 на 10");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "восемьдесят девять десятых");
+}
+
+#[test]
+fn non_simple_fraction() {
+ let expr = "
+ ";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "дробь, числитель: икс плюс игрек; знаменатель: икс минус игрек");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "дробь, числитель: икс плюс игрек; знаменатель: икс минус игрек");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Over")], expr, "икс плюс игрек на икс минус игрек");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "FracOver")], expr, "дробь икс плюс игрек на икс минус игрек");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "General")], expr, "дробь, числитель: икс плюс игрек; знаменатель: икс минус игрек");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "EndFrac")], expr, "дробь, числитель: икс плюс игрек; знаменатель: икс минус игрек; конец дроби");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "GeneralEndFrac")], expr, "дробь, числитель: икс плюс игрек; знаменатель: икс минус игрек; конец дроби");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "OverEndFrac")], expr, "икс плюс игрек на икс минус игрек, конец дроби");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Per")], expr, "икс плюс игрек на икс минус игрек");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose"),("ClearSpeak_Fractions", "Auto")], expr, "дробь, числитель: икс плюс игрек; знаменатель: икс минус игрек; конец дроби");
+}
+
+#[test]
+fn frac_with_units() {
+ let expr = "
+ ";
+ test("ru", "ClearSpeak", expr, "62 мили в час");
+}
+
+
+#[test]
+fn mixed_number() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "3 и одна вторая");
+}
+
+#[test]
+fn explicit_mixed_number() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "3 и одна восьмая");
+}
+
+#[test]
+fn mixed_number_big() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "3 и 7 на 83");
+}
+
+#[test]
+fn simple_text() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "подъём на длину");
+}
+
+#[test]
+fn number_and_text() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 мили на 3 галлона");
+}
+
+
+#[test]
+fn nested_simple_fractions() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "Auto")], expr, "одна вторая на две третьих");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "Ordinal")], expr, "одна вторая на две третьих");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "Over")], expr, "1 на 2 на 2 на 3");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "FracOver")], expr,
+ "дробь дробь 1 на 2 на дробь 2 на 3");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "General")], expr,
+ "дробь, числитель: дробь, числитель: 1; знаменатель: 2; и знаменатель: дробь, числитель: 2; знаменатель: 3");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "EndFrac")], expr, "одна вторая на две третьих");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "GeneralEndFrac")], expr,
+ "дробь, числитель: дробь, числитель: 1; знаменатель: 2; конец дроби; и знаменатель: дробь, числитель: 2; знаменатель: 3; конец дроби; конец дроби");
+ test_prefs("ru", "ClearSpeak", vec![("ClearSpeak_Fractions", "OverEndFrac")], expr,
+ "1 на 2, конец дроби, на 2 на 3, конец дроби; конец дроби");
+}
+
+
+#[test]
+fn semi_nested_fraction() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "две третьих икс на 6");
+}
+
+#[test]
+fn general_nested_fraction() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "дробь, числитель: 10 на эн; и знаменатель: 2 на эн");
+}
+
+#[test]
+fn complex_nested_fraction() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "дробь, числитель: дробь, числитель: эн плюс 10; знаменатель: эн; и знаменатель: 2 на эн");
+}
+
+#[test]
+fn simple_function() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "эф от икс на 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_Fractions", "Auto")], expr, "эф от икс на 2, конец дроби");
+}
+
+#[test]
+fn function_over_function() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "эф от икс на же от икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_Fractions", "Auto")], expr, "эф от икс на же от икс, конец дроби");
+}
+
+#[test]
+fn non_simple_function_over_function() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr,
+ "дробь, числитель: эф от, открывается скобка икс плюс 1, закрывается скобка; знаменатель: же от икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_Fractions", "Auto")], expr,
+ "дробь, числитель: эф от, открывается скобка икс плюс 1, закрывается скобка; знаменатель: же от икс; конец дроби");
+}
+
+#[test]
+fn binomial() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 умножить на число сочетаний из 7 по 3");
+}
diff --git a/tests/Languages/ru/ClearSpeak/mroot.rs b/tests/Languages/ru/ClearSpeak/mroot.rs
new file mode 100644
index 00000000..76bbbf8a
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/mroot.rs
@@ -0,0 +1,132 @@
+use crate::common::*;
+
+#[test]
+fn msqrt_simple() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "квадратный корень из икс");
+}
+
+#[test]
+fn msqrt_simple_end_root() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "RootEnd", expr, "квадратный корень из икс, конец корня");
+}
+
+#[test]
+fn msqrt_simple_positive() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "PosNegSqRoot", expr, "квадратный корень из икс");
+}
+
+#[test]
+fn msqrt_simple_pos_end_root() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, "квадратный корень из икс, конец корня");
+}
+
+#[test]
+fn msqrt_simple_pos_end_with_neg_root() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "PosNegSqRootEnd", expr,
+ "минус квадратный корень из икс, конец корня; минус, кубический корень из икс, конец корня");
+}
+
+#[test]
+fn mroot_simple_pos_end_with_neg_root() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "PosNegSqRoot", expr,
+ "минус кубический корень из икс; минус квадратный корень из икс");
+}
+
+#[test]
+fn neg_without_root() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "минус икс минус игрек");
+}
+
+#[test]
+fn msqrt() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "квадратный корень из икс плюс игрек");
+}
+
+#[test]
+fn mroot_as_square_root() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "квадратный корень из икс");
+}
+
+#[test]
+fn cube_root() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "кубический корень из икс");
+}
+
+#[test]
+fn ordinal_root() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "корень девятой степени из икс");
+}
+
+#[test]
+fn simple_mi_root() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "корень степени эн из икс");
+}
+
+#[test]
+fn mroot_simple_pos_end_root() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, "корень степени тэ из икс, конец корня");
+}
+
+#[test]
+fn mroot_simple_end_root() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Roots", "RootEnd", expr, "корень двадцать первой степени из икс плюс игрек, конец корня");
+}
+
+#[test]
+fn simple_fraction_power() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "корень степени одна третья из икс");
+}
diff --git a/tests/Languages/ru/ClearSpeak/msup.rs b/tests/Languages/ru/ClearSpeak/msup.rs
new file mode 100644
index 00000000..15cf0971
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/msup.rs
@@ -0,0 +1,336 @@
+/// Tests for superscripts
+/// simple superscripts
+/// complex/nested superscripts
+use crate::common::*;
+
+#[test]
+fn squared() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "икс в квадрате");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "икс во второй");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "икс во второй степени");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "икс в степени 2");
+}
+
+#[test]
+fn cubed() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "икс в кубе");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "икс в третьей");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "икс в третьей степени");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "икс в степени 3");
+}
+
+#[test]
+fn ordinal_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в пятой степени");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в пятой");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в пятой степени");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени 5");
+}
+
+#[test]
+fn zero_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в нулевой степени");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в нулевой");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в нулевой степени");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени 0");
+}
+
+#[test]
+fn simple_mi_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "4 в степени икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "4 в степени икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "4 в степени икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "4 в степени икс");
+}
+
+#[test]
+fn decimal_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в степени 5.0");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в степени 5.0");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в степени 5.0");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени 5.0");
+}
+
+#[test]
+fn non_simple_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в степени игрек плюс 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в степени игрек плюс 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в степени игрек плюс 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени игрек плюс 2");
+}
+
+#[test]
+fn negative_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в степени минус 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в степени минус 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в степени минус 2");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени минус 2");
+}
+
+#[test]
+fn simple_fraction_power() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "икс в степени одна третья");
+}
+
+#[test]
+fn nested_squared_power_with_coef() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в степени 2 икс в квадрате");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в степени (показатель: 2 икс во второй, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в степени (показатель: 2 икс во второй степени, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени (показатель: 2 икс в степени 2, конец показателя)");
+}
+
+#[test]
+fn nested_squared_power_with_neg_coef() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "3 в степени минус 2 икс в квадрате");
+}
+
+#[test]
+fn nested_cubed_power() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "игрек в степени четыре пятых в кубе");
+}
+
+#[test]
+fn nested_cubed_power_with_neg_base() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "игрек в степени минус четыре пятых в кубе");
+}
+
+#[test]
+fn nested_number_times_squared() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "e в степени одна вторая икс в квадрате");
+}
+
+#[test]
+fn nested_negative_number_times_squared() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "e в степени минус одна вторая икс в квадрате");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "e в степени (показатель: минус одна вторая икс во второй, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "e в степени (показатель: минус одна вторая икс во второй степени, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "e в степени (показатель: минус одна вторая икс в степени 2, конец показателя)");
+}
+
+#[test]
+fn nested_expr_to_tenth() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в степени (показатель: 3 в десятой степени, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в степени (показатель: 3 в десятой, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в степени (показатель: 3 в десятой степени, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени (показатель: 3 в степени 10, конец показателя)");
+}
+
+#[test]
+fn nested_non_simple_squared_exp() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 в степени (показатель: скобка открывается икс плюс 1, скобка закрывается в квадрате, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 в степени (показатель: скобка открывается икс плюс 1, скобка закрывается во второй, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 в степени (показатель: скобка открывается икс плюс 1, скобка закрывается во второй степени, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 в степени (показатель: скобка открывается икс плюс 1, скобка закрывается в степени 2, конец показателя)");
+}
+
+#[test]
+fn nested_default_power() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тэ в степени (показатель: четыре пятых в степени эн, конец показателя)");
+}
+
+#[test]
+fn nested_complex_power() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr,
+ "e в степени (показатель: минус одна вторая умножить на; скобка открывается; дробь, числитель: икс минус мю; знаменатель: сигма; скобка закрывается в квадрате, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr,
+ "e в степени (показатель: минус одна вторая умножить на; скобка открывается; дробь, числитель: икс минус мю; знаменатель: сигма; скобка закрывается во второй, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr,
+ "e в степени (показатель: минус одна вторая умножить на; скобка открывается; дробь, числитель: икс минус мю; знаменатель: сигма; скобка закрывается во второй степени, конец показателя)");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr,
+ "e в степени (показатель: минус одна вторая умножить на; скобка открывается; дробь, числитель: икс минус мю; знаменатель: сигма; скобка закрывается в степени 2, конец показателя)");
+}
+
+#[test]
+fn default_power() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "тэ в степени дробь, числитель: бэ плюс 1; знаменатель: 3");
+}
diff --git a/tests/Languages/ru/ClearSpeak/multiline.rs b/tests/Languages/ru/ClearSpeak/multiline.rs
new file mode 100644
index 00000000..85cc8b6c
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/multiline.rs
@@ -0,0 +1,178 @@
+use crate::common::*;
+
+#[test]
+fn case_1() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Auto", expr,
+ "эф от икс равно; 3 случая; \
+ случай 1; минус 1, если икс меньше 0; \
+ случай 2; 0, если икс равно 0; \
+ случай 3; 1, если икс больше 0"
+ )
+}
+
+#[test]
+fn equation_auto() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Auto", expr,
+ "2 строки; \
+ строка 1; икс плюс игрек равно 7; \
+ строка 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_plus_at_start() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Auto", expr, "2 строки; \
+ строка 1; икс плюс игрек равно 7; \
+ строка 2; 2 икс, плюс 3 игрек, равно 17");
+}
+
+#[test]
+fn equation_case() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Case", expr,
+ "2 случая; случай 1; икс плюс игрек равно 7; случай 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_constraint() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Constraint", expr, "2 ограничения; \
+ ограничение 1; икс плюс игрек равно 7; \
+ ограничение 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_equation() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Equation", expr, "2 уравнения; \
+ уравнение 1; икс плюс игрек равно 7; \
+ уравнение 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_line() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Line", expr, "2 строки; \
+ строка 1; икс плюс игрек равно 7; \
+ строка 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_none() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "None", expr,
+ "2 строки; \
+ икс плюс игрек равно 7; \
+ 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_row() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Row", expr, "2 строки; \
+ строка 1; икс плюс игрек равно 7; \
+ строка 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn equation_step() {
+ let expr = "
+ ";
+ test_ClearSpeak("ru", "ClearSpeak_MultiLineLabel", "Step", expr, "2 шага; \
+ шаг 1; икс плюс игрек равно 7; \
+ шаг 2; 2 икс плюс 3 игрек равно 17");
+}
+
+#[test]
+fn continued_row() {
+ let expr = "";
+test("ru", "SimpleSpeak", expr,
+ "2 уравнения; уравнение 1; икс равно игрек плюс 1; уравнение 2; игрек равно 1");
+}
diff --git a/tests/Languages/ru/ClearSpeak/sets.rs b/tests/Languages/ru/ClearSpeak/sets.rs
new file mode 100644
index 00000000..26a1cf9b
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/sets.rs
@@ -0,0 +1,446 @@
+use crate::common::*;
+
+#[test]
+fn complex() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "комплексные числа");
+}
+
+#[test]
+fn natural() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "натуральные числа");
+}
+
+#[test]
+fn rationals() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "рациональные числа");
+}
+
+#[test]
+fn reals() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "действительные числа");
+}
+
+#[test]
+fn integers() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "целые числа");
+}
+
+#[test]
+fn msup_complex() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "цэ 2");
+}
+
+#[test]
+fn msup_natural() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "эн 2");
+}
+
+#[test]
+fn msup_rationals() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "ку 2");
+}
+
+#[test]
+fn msup_reals() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "эр 3");
+}
+
+#[test]
+fn msup_integers() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "зэ 4");
+}
+
+#[test]
+fn msup_positive_integers() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "положительные целые числа");
+}
+
+#[test]
+fn msup_negative_integers() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "отрицательные целые числа");
+}
+
+#[test]
+fn msup_positive_rationals() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "положительные рациональные числа");
+}
+
+#[test]
+fn msup_negative_rationals() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "отрицательные рациональные числа");
+}
+
+#[test]
+fn empty_set() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "пустое множество");
+}
+
+#[test]
+fn single_element_set() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "множество 12");
+}
+
+#[test]
+fn multiple_element_set() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "множество 5 запятая, 10 запятая, 15");
+}
+
+#[test]
+fn set_with_colon() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "множество всех x таких, что x больше 2");
+}
+
+#[test]
+fn set_with_bar() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "множество всех x таких, что x больше 2");
+}
+
+#[test]
+fn element_alone() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "3 плюс 2 i, не принадлежит действительным числам");
+}
+
+#[test]
+fn element_under_sum() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr,
+ "сумма по i, принадлежащему целым числам, от; дробь, числитель: 1; знаменатель: i в квадрате");
+}
+
+#[test]
+fn complicated_set_with_colon() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "множество всех x из целых чисел, таких что 2 меньше x меньше 7");
+}
+
+#[test]
+fn complicated_set_with_mtext() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr,
+ "множество всех x из натуральных чисел, таких что x — чётное число");
+}
+
+#[test]
+fn set_with_bar_member() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Member",
+ expr, "множество всех x, принадлежащих целым числам, таких что x больше 5");
+}
+
+#[test]
+fn element_alone_member() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Member",
+ expr, "3 плюс 2 i, не принадлежит действительным числам");
+}
+
+#[test]
+fn element_under_sum_member() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Member",
+ expr, "сумма по i, принадлежащему целым числам, от; дробь, числитель: 1; знаменатель: i в квадрате");
+}
+
+#[test]
+fn set_with_bar_element() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Element",
+ expr, "множество всех x, являющихся элементами целых чисел, таких что x больше 5");
+}
+
+#[test]
+fn element_alone_element() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Element",
+ expr, "3 плюс 2 i, не является элементом действительных чисел");
+}
+
+#[test]
+fn element_under_sum_element() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Element",
+ expr, "сумма по i, являющемуся элементом целых чисел, от; дробь, числитель: 1; знаменатель: i в квадрате");
+}
+
+#[test]
+fn set_with_bar_in() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "In",
+ expr, "множество всех x из целых чисел, таких что x больше 5");
+}
+
+#[test]
+fn element_alone_in() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "In",
+ expr, "3 плюс 2 i, не принадлежит действительным числам");
+}
+
+#[test]
+fn element_under_sum_in() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "In",
+ expr, "сумма по i из целых чисел, от; дробь, числитель: 1; знаменатель: i в квадрате");
+}
+
+#[test]
+fn set_with_bar_belongs() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Belongs",
+ expr, "множество всех x, входящих в целые числа, таких что x больше 5");
+}
+
+#[test]
+fn element_alone_belongs() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Belongs",
+ expr, "3 плюс 2 i, не входит в действительные числа");
+}
+
+#[test]
+fn element_under_sum_belongs() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_SetMemberSymbol", "Belongs",
+ expr, "сумма по i, входящему в целые числа, от; дробь, числитель: 1; знаменатель: i в квадрате");
+}
+
+#[test]
+fn set_member_woall() {
+ let expr = "";
+ test_ClearSpeak_prefs("ru", vec![("ClearSpeak_SetMemberSymbol", "Member"), ("ClearSpeak_Sets", "woAll")],
+ expr, "множество x, принадлежащих целым числам, таких что x больше 5");
+}
+
+#[test]
+fn multiple_element_set_woall() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Sets", "woAll", expr, "множество 5 запятая, 10 запятая, 15");
+}
+
+#[test]
+fn multiple_element_set_silent_bracket() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Sets", "SilentBracket", expr, "5 запятая, 10 запятая, 15");
+}
+
+#[test]
+fn silent_bracket() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Sets", "SilentBracket", expr,
+ "множество всех x таких, что x больше 2");
+}
+
diff --git a/tests/Languages/ru/ClearSpeak/symbols_and_adornments.rs b/tests/Languages/ru/ClearSpeak/symbols_and_adornments.rs
new file mode 100644
index 00000000..d2824ab7
--- /dev/null
+++ b/tests/Languages/ru/ClearSpeak/symbols_and_adornments.rs
@@ -0,0 +1,330 @@
+use crate::common::*;
+
+#[test]
+fn multiplication() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "2 умножить на 3");
+}
+
+#[test]
+fn multiplication_by() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_MultSymbolX", "By", expr, "2 на 3");
+}
+
+#[test]
+fn multiplication_cross() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_MultSymbolX", "Cross", expr, "u векторное произведение v");
+}
+
+#[test]
+fn ellipses_auto_start() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "многоточие запятая, минус 2 запятая, минус 1 запятая, 0");
+}
+
+#[test]
+fn ellipses_auto_end() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "Auto", expr, "1 запятая, 2 запятая, 3 запятая, многоточие");
+}
+
+#[test]
+fn ellipses_auto_middle() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "Auto", expr,
+ "1 запятая, 2 запятая, 3 запятая, многоточие запятая, 20");
+}
+
+#[test]
+fn ellipses_auto_both() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "Auto", expr,
+ "многоточие запятая, минус 2 запятая, минус 1 запятая, 0 запятая, 1 запятая, 2 запятая, многоточие");
+}
+
+#[test]
+fn ellipses_and_so_on_start() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "AndSoOn", expr, "многоточие запятая, минус 2 запятая, минус 1 запятая, 0");
+}
+
+#[test]
+fn ellipses_and_so_on_end() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "AndSoOn", expr, "1 запятая, 2 запятая, 3 и так далее");
+}
+
+#[test]
+fn ellipses_and_so_on_middle() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "AndSoOn", expr,
+ "1 запятая, 2 запятая, 3 и так далее до 20");
+}
+
+#[test]
+fn ellipses_and_so_on_both() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Ellipses", "AndSoOn", expr,
+ "многоточие запятая, минус 2 запятая, минус 1 запятая, 0 запятая, 1 запятая, 2 запятая, многоточие");
+}
+
+#[test]
+fn vertical_line_auto() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Auto", expr,
+ "3 делит 6");
+}
+
+#[test]
+fn vertical_line_divides() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Divides", expr,
+ "3 делит 6");
+}
+
+#[test]
+fn vertical_line_given() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Given", expr,
+ "3 при условии 6");
+}
+
+#[test]
+fn vertical_line_probability_given() {
+ let expr = "";
+ test_ClearSpeak_prefs("ru", vec![("ClearSpeak_VerticalLine", "Given"), ("ClearSpeak_ImpliedTimes", "None")],
+ expr, "пэ большое, открывается скобка, эй большое при условии бэ большое, закрывается скобка");
+}
+
+#[test]
+fn vertical_line_set() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Auto", expr,
+ "множество всех x таких, что x больше 0");
+}
+
+#[test]
+fn vertical_line_set_such_that() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "SuchThat", expr,
+ "множество всех x таких, что x больше 0");
+}
+
+#[test]
+fn vertical_line_set_given() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Given", expr,
+ "множество всех x таких, что x больше 0");
+}
+
+#[test]
+fn vertical_line_set_and_abs() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Auto", expr,
+ "множество всех x таких, что абсолютное значение x; больше 2");
+}
+
+#[test]
+fn vertical_line_evaluated_at() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Auto", expr,
+ "эф от икс, вычисленное при, x равно 5");
+}
+
+#[test]
+fn vertical_line_evaluated_at_both() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Auto", expr,
+ "икс в квадрате плюс икс, вычисленное при 1 минус то же выражение, вычисленное при 0");
+}
+
+#[test]
+fn vertical_line_evaluated_at_divides() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Divides", expr,
+ "эф от икс, вычисленное при, x равно 5");
+}
+
+#[test]
+fn vertical_line_evaluated_at_both_given() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_VerticalLine", "Given", expr,
+ "икс в квадрате плюс икс, вычисленное при 1 минус то же выражение, вычисленное при 0");
+}
\ No newline at end of file
diff --git a/tests/Languages/ru/SimpleSpeak/functions.rs b/tests/Languages/ru/SimpleSpeak/functions.rs
new file mode 100644
index 00000000..660e27a7
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/functions.rs
@@ -0,0 +1,332 @@
+/// Tests for:
+/// * functions including trig functions, logs, and functions to powers
+/// * implied times/functional call and explicit times/function call
+/// * parens
+/// These are all intertwined, so they are in one file
+use crate::common::*;
+
+#[test]
+fn trig_names() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "синус икс плюс косинус игрек плюс тангенс зет плюс секанс альфа, плюс косеканс фи, плюс котангенс фи");
+}
+
+#[test]
+fn hyperbolic_trig_names() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "гиперболический синус икс, плюс \
+ гиперболический косинус игрек, плюс \
+ гиперболический тангенс зет, плюс \
+ гиперболический секанс альфа, плюс \
+ гиперболический косеканс фи, плюс \
+ гиперболический котангенс фи");
+}
+
+#[test]
+fn inverse_trig() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "арксинус икс");
+}
+
+#[test]
+fn trig_squared() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "синус в квадрате икс");
+}
+
+#[test]
+fn trig_cubed() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тангенс в кубе икс");
+}
+
+#[test]
+fn trig_fourth() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "секанс в четвертой степени икс");
+}
+
+#[test]
+fn trig_power_other() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "гиперболический синус икс в степени n минус 1");
+}
+
+#[test]
+fn simple_log() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "логарифм икс");
+}
+
+#[test]
+fn normal_log() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "логарифм от, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn simple_log_with_base() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "логарифм по основанию бэ от икс");
+}
+
+#[test]
+fn normal_log_with_base() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "логарифм по основанию бэ от, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn normal_ln() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "эл эн, открывается икс плюс игрек закрывается");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "натуральный логарифм от, скобка открывается икс плюс игрек, скобка закрывается");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ expr, "натуральный логарифм от, скобка открывается икс плюс игрек, скобка закрывается");
+}
+
+#[test]
+fn simple_ln() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "эл эн икс");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "натуральный логарифм икс");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ expr, "натуральный логарифм икс");
+}
+
+#[test]
+fn other_names() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "Cov икс");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "ковариация икс");
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "эксп от икс");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "экспонента от икс");
+}
+
+#[test]
+fn explicit_function_call_with_parens() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ от икс");
+}
+
+#[test]
+fn explicit_times_with_parens() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ умножить на икс");
+}
+
+#[test]
+fn explicit_function_call() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ от икс");
+}
+
+#[test]
+fn explicit_times() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ икс");
+}
+
+/*
+ * Tests for times
+ */
+#[test]
+fn no_times_binomial() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс игрек");
+}
+
+#[test]
+fn times_following_paren() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 умножить на 3");
+}
+
+#[test]
+fn times_preceding_paren() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 умножить на 3");
+}
+
+#[test]
+fn no_times_sqrt() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "квадратный корень из а; умножить на квадратный корень из бэ; равно, квадратный корень из а бэ конец корня");
+ test_prefs("ru", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "квадратный корень из а; умножить на квадратный корень из бэ; равно, квадратный корень из а бэ");
+}
+
+/*
+ * Tests for parens
+ */
+#[test]
+fn no_parens_number() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "25 умножить на икс");
+}
+
+#[test]
+fn no_parens_monomial() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "бэ, скобка открывается икс игрек скобка закрывается");
+}
+
+#[test]
+fn no_parens_negative_number() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 плюс минус 2");
+}
+
+#[test]
+fn no_parens_negative_number_with_var() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "минус 2 икс, плюс 1");
+}
+
+#[test]
+fn parens_superscript() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "скобка открывается 2 икс скобка закрывается в квадрате");
+}
+
+#[test]
+fn no_parens_fraction() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 плюс одна вторая");
+}
+
+// Tests for the four types of intervals in SimpleSpeak
+#[test]
+fn parens_interval_open_open() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "открытый интервал от цэ до дэ");
+}
+
+#[test]
+fn parens_interval_closed_open() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "закрыто-открытый интервал от цэ до дэ");
+}
+
+#[test]
+fn parens_interval_open_closed() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "открыто-закрытый интервал от цэ до дэ");
+}
+
+#[test]
+fn parens_interval_closed_closed() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "закрытый интервал от цэ до дэ");
+}
+
+#[test]
+fn parens_interval_neg_infinity_open_open() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "открытый интервал от минус бесконечности до дэ");
+}
+
+#[test]
+fn parens_interval_neg_infinity_open_closed() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "открыто-закрытый интервал от минус бесконечности до дэ");
+}
+
diff --git a/tests/Languages/ru/SimpleSpeak/geometry.rs b/tests/Languages/ru/SimpleSpeak/geometry.rs
new file mode 100644
index 00000000..522fa04e
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/geometry.rs
@@ -0,0 +1,27 @@
+/// Tests for geometry listed in intent
+/// ABC as mtext and as separated letters
+use crate::common::*;
+
+#[test]
+fn arc() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "дуга бэ большое цэ большое");
+}
+
+#[test]
+fn ray() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "отрезок икс большое игрек большое");
+}
+
+#[test]
+fn arc_mtext() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "дуга бэ большое цэ большое");
+}
+
+#[test]
+fn ray_mtext() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "луч икс большое игрек большое");
+}
diff --git a/tests/Languages/ru/SimpleSpeak/large_ops.rs b/tests/Languages/ru/SimpleSpeak/large_ops.rs
new file mode 100644
index 00000000..1131fa09
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/large_ops.rs
@@ -0,0 +1,201 @@
+use crate::common::*;
+
+#[test]
+fn sum_both() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "сумма от n равно 1 до 10 от n");
+}
+
+#[test]
+fn sum_under() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "сумма по эс большое от i");
+}
+
+#[test]
+fn sum_both_msubsup() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "сумма от n равно 1 до 10 от n");
+}
+
+#[test]
+fn sum_sub() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "сумма по эс большое от i");
+}
+
+#[test]
+fn sum() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "сумма а с индексом i");
+}
+
+#[test]
+fn product_both() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "произведение от n равно 1 до 10 от n");
+}
+
+#[test]
+fn product_under() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "произведение по эс большое от i");
+}
+
+#[test]
+fn product() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "произведение а с индексом i");
+}
+
+#[test]
+fn intersection_both() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "пересечение от i равно 1 до 10 от; эс большое с индексом i");
+}
+
+#[test]
+fn intersection_under() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "пересечение по цэ большое от, эс большое с индексом i");
+}
+
+#[test]
+fn intersection() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "пересечение эс большое с индексом i");
+}
+
+#[test]
+fn union_both() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "объединение от i равно 1 до 10 от; эс большое с индексом i");
+}
+
+#[test]
+fn union_under() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "объединение по цэ большое от, эс большое с индексом i");
+}
+
+#[test]
+fn union() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "объединение эс большое с индексом i");
+}
+
+#[test]
+fn integral_both() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "интеграл от 0 до 1 от, эф от икс; д икс");
+}
+
+#[test]
+fn integral_under() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "интеграл по действительным числам от; эф от икс д икс");
+}
+
+#[test]
+fn integral() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "интеграл от эф от икс д икс");
+}
\ No newline at end of file
diff --git a/tests/Languages/ru/SimpleSpeak/linear_algebra.rs b/tests/Languages/ru/SimpleSpeak/linear_algebra.rs
new file mode 100644
index 00000000..d495b3df
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/linear_algebra.rs
@@ -0,0 +1,92 @@
+use crate::common::*;
+
+#[test]
+fn transpose() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "эм большое транспонированная");
+}
+
+#[test]
+fn trace() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "след от эм большое");
+}
+
+#[test]
+fn dimension() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "размерность эм большое");
+}
+
+#[test]
+fn homomorphism() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "гомоморфизм от эм большое");
+}
+
+#[test]
+fn kernel() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "ядро от эль большое");
+}
+
+#[test]
+fn norm() {
+ let expr = "
+";
+ test("ru", "SimpleSpeak", expr, "норма от эф");
+}
+
+#[test]
+fn norm_non_simple() {
+ let expr = "
+";
+ test("ru", "SimpleSpeak", expr, "норма от икс плюс игрек конец нормы");
+}
+
+#[test]
+fn norm_subscripted() {
+ let expr = "
+";
+ test("ru", "SimpleSpeak", expr, "p-норма от эф");
+}
+
+#[test]
+fn not_gradient() {
+ // the nabla is at the end, so it can't be gradient because it doesn't operate on anything
+ let expr = r#"
+"#;
+ test("ru", "SimpleSpeak", expr, "скобка открывается, бэ умножить на набла, скобка закрывается; умножить на а");
+}
\ No newline at end of file
diff --git a/tests/Languages/ru/SimpleSpeak/mfrac.rs b/tests/Languages/ru/SimpleSpeak/mfrac.rs
new file mode 100644
index 00000000..a8bf0ec7
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/mfrac.rs
@@ -0,0 +1,276 @@
+/// Tests for fractions
+/// includes simple fractions and more complex fractions
+/// also tests mixed fractions (implicit and explicit)
+use crate::common::*;
+
+#[test]
+fn common_fraction_half() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "одна вторая");
+}
+
+#[test]
+fn common_fraction_thirds() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "две третьих");
+}
+
+#[test]
+fn common_fraction_tenths() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "семнадцать десятых");
+}
+
+#[test]
+#[allow(non_snake_case)]
+fn not_SimpleSpeak_common_fraction_tenths() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "89 на 10");
+}
+
+#[test]
+fn non_simple_fraction() {
+ let expr = "
+
+ ";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: икс плюс игрек, знаменатель: икс минус игрек, конец дроби");
+}
+
+#[test]
+fn nested_fraction() {
+ let expr = "
+
+ ";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: икс плюс, дробь, числитель: 1, знаменатель: игрек, конец дроби; знаменатель: икс минус игрек, конец дроби");
+}
+
+#[test]
+fn deeply_nested_fraction_msqrt() {
+ let expr = "
+
+ ";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: икс плюс, квадратный корень из 1 на игрек, конец корня; знаменатель: икс минус игрек, конец дроби");
+}
+
+#[test]
+fn deeply_nested_fraction_mrow_msqrt() {
+ let expr = "
+
+ ";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: икс плюс, квадратный корень из 2 плюс 1 на игрек, конец корня; знаменатель: икс минус игрек, конец дроби");
+}
+
+#[test]
+fn numerator_simple_fraction() {
+ let expr = "
+
+ ";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: икс, знаменатель: икс минус игрек, конец дроби");
+}
+
+#[test]
+fn denominator_simple_fraction() {
+ let expr = "
+
+ ";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: икс минус игрек, знаменатель: икс, конец дроби");
+}
+
+#[test]
+fn frac_with_units() {
+ let expr = "
+ ";
+ test("ru", "SimpleSpeak", expr, "62 мили в час");
+}
+
+#[test]
+fn singular_frac_with_units() {
+ let expr = "
+ ";
+ test("ru", "SimpleSpeak", expr, "1 галлон на милю");
+}
+
+#[test]
+fn mixed_number() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 целых и одна вторая");
+}
+
+#[test]
+fn explicit_mixed_number() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 целых и одна восьмая");
+}
+
+#[test]
+fn mixed_number_big() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 целых и семь восемьдесят третьих");
+}
+
+#[test]
+fn simple_text() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "подъём на длину");
+}
+
+#[test]
+fn number_and_text() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: 2 мили, знаменатель: 3 галлона, конец дроби");
+}
+
+#[test]
+fn nested_simple_fractions() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "дробь, числитель: одна вторая, знаменатель: две третьих, конец дроби");
+}
+
+#[test]
+fn binomial() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 умножить на число сочетаний из 7 по 3");
+}
+
+#[test]
+fn binomial_non_simple_top() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 умножить на, число сочетаний из n плюс 7 по 3");
+}
+
+#[test]
+fn binomial_non_simple_bottom() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 умножить на, число сочетаний из 7 по k плюс 3 конец числа сочетаний");
+}
+
+#[test]
+fn binomial_non_simple_top_and_bottom() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 умножить на, число сочетаний из n плюс 7 по k плюс 3 конец числа сочетаний");
+}
diff --git a/tests/Languages/ru/SimpleSpeak/msup.rs b/tests/Languages/ru/SimpleSpeak/msup.rs
new file mode 100644
index 00000000..cb5d6f42
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/msup.rs
@@ -0,0 +1,333 @@
+/// Tests for superscripts
+/// simple superscripts
+/// complex/nested superscripts
+use crate::common::*;
+
+#[test]
+fn squared() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в квадрате");
+}
+
+#[test]
+fn cubed() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в кубе");
+}
+
+#[test]
+fn ordinal_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в четвёртой степени");
+}
+
+#[test]
+fn simple_mi_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в степени эн");
+}
+
+#[test]
+fn zero_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в нулевой степени");
+}
+
+#[test]
+fn decimal_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в степени 2.0");
+}
+
+#[test]
+fn non_simple_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 в степени игрек плюс 2");
+}
+
+#[test]
+fn negative_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в степени минус 2");
+}
+
+#[test]
+fn simple_fraction_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс в степени одна третья");
+}
+
+#[test]
+fn nested_squared_power_with_coef() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 в степени 2 икс в квадрате");
+}
+
+#[test]
+fn nested_squared_power_with_neg_coef() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 в степени минус 2 икс в квадрате");
+}
+
+#[test]
+fn nested_cubed_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "игрек в степени четыре пятых в кубе");
+}
+
+#[test]
+fn nested_cubed_power_with_neg_base() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "игрек в степени минус четыре пятых в кубе");
+}
+
+#[test]
+fn nested_number_times_squared() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "e в степени одна вторая икс в квадрате");
+}
+
+#[test]
+fn nested_negative_number_times_squared() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "e в степени минус одна вторая икс в квадрате");
+}
+
+#[test]
+fn nested_expr_to_tenth() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 в степени 3 в десятой степени");
+}
+
+#[test]
+fn nested_non_simple_squared_exp() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 в степени скобка открывается икс плюс 1, скобка закрывается в квадрате");
+}
+
+#[test]
+fn nested_simple_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ в степени четыре пятых в степени эн");
+}
+
+#[test]
+fn nested_end_exponent_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ в степени четыре пятых в степени n плюс 1, конец показателя");
+ test_prefs("ru", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "тэ в степени четыре пятых в степени n плюс 1");
+}
+
+#[test]
+fn nested_end_exponent_neg_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ в степени четыре пятых в степени минус 3, конец показателя");
+}
+
+#[test]
+fn nested_complex_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "e в степени минус одна вторая умножить на; скобка открывается, дробь, числитель: икс минус мю, знаменатель: сигма, конец дроби; скобка закрывается в квадрате");
+}
+
+#[test]
+fn default_power() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "тэ в степени дробь, числитель: бэ плюс 1, знаменатель: 3, конец дроби");
+}
diff --git a/tests/Languages/ru/SimpleSpeak/multiline.rs b/tests/Languages/ru/SimpleSpeak/multiline.rs
new file mode 100644
index 00000000..6e6daf10
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/multiline.rs
@@ -0,0 +1,75 @@
+use crate::common::*;
+
+#[test]
+fn case_1() {
+ let expr = "
+ ";
+ test("ru", "SimpleSpeak", expr, "эф от икс равно; 3 случая; \
+ случай 1; минус 1, если икс; меньше 0; \
+ случай 2; 0, если икс, равно 0; \
+ случай 3; 1, если икс, больше 0");
+}
+
+#[test]
+fn equation_1() {
+ let expr = "
+ ";
+ test("ru", "SimpleSpeak", expr, "2 уравнения; \
+ уравнение 1; икс плюс игрек равно 7; \
+ уравнение 2; 2 икс плюс 3 игрек равно 17");
+}
diff --git a/tests/Languages/ru/SimpleSpeak/sets.rs b/tests/Languages/ru/SimpleSpeak/sets.rs
new file mode 100644
index 00000000..06b1f867
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/sets.rs
@@ -0,0 +1,235 @@
+use crate::common::*;
+
+#[test]
+fn complex() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "комплексные числа");
+}
+
+#[test]
+fn natural() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "натуральные числа");
+}
+
+#[test]
+fn rationals() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рациональные числа");
+}
+
+#[test]
+fn reals() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "действительные числа");
+}
+
+#[test]
+fn integers() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "целые числа");
+}
+
+#[test]
+fn msup_complex() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "цэ 2");
+}
+
+#[test]
+fn msup_natural() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "эн 2");
+}
+
+#[test]
+fn msup_rationals() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "ку 2");
+}
+
+#[test]
+fn msup_reals() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "эр 3");
+}
+
+#[test]
+fn msup_integers() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "зэт 4");
+}
+
+#[test]
+fn msup_positive_integers() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "положительные целые числа");
+}
+
+#[test]
+fn msup_negative_integers() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "отрицательные целые числа");
+}
+
+#[test]
+fn msup_positive_rationals() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "положительные рациональные числа");
+}
+
+#[test]
+fn msup_negative_rationals() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "отрицательные рациональные числа");
+}
+
+#[test]
+fn empty_set() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "пустое множество");
+}
+
+#[test]
+fn single_element_set() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "множество 12");
+}
+
+#[test]
+fn multiple_element_set() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "множество 5 запятая, 10 запятая, 15");
+}
+
+#[test]
+fn set_with_colon() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "множество всех x таких, что x больше 2");
+}
+
+#[test]
+fn set_with_bar() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "множество всех икс таких, что икс больше 2");
+}
+
+#[test]
+fn element_alone() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "3 плюс 2 и, не является элементом действительных чисел");
+}
+
+#[test]
+fn element_under_sum() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "сумма по i, являющемуся элементом целых чисел, от; дробь, числитель: 1, знаменатель: и в квадрате, конец дроби");
+}
+
+#[test]
+fn complicated_set_with_colon() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "множество всех икс из целых чисел, таких что 2 меньше икс меньше 7");
+}
+
+#[test]
+fn complicated_set_with_mtext() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "множество всех икс из натуральных чисел, таких что x — четное число");
+}
diff --git a/tests/Languages/ru/SimpleSpeak/subscripts.rs b/tests/Languages/ru/SimpleSpeak/subscripts.rs
new file mode 100644
index 00000000..ea389089
--- /dev/null
+++ b/tests/Languages/ru/SimpleSpeak/subscripts.rs
@@ -0,0 +1,49 @@
+use crate::common::*;
+
+#[test]
+fn msub_simple() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс 1");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, "икс с индексом 1");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "икс с индексом 1");
+}
+
+#[test]
+fn msub_not_simple() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс с индексом 1.2");
+}
+
+#[test]
+fn msubsup_not_simple() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс с индексом 1.2, в кубе");
+}
+
+#[test]
+fn msub_simple_mi() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс с индексом i");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "икс с индексом i");
+}
+
+#[test]
+fn msub_simple_number_follows() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс 1, 10 в квадрате");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "икс с индексом 1, 10 в квадрате");
+}
+
+#[test]
+fn msub_simple_non_number_follows() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс 1, в квадрате");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "икс с индексом 1, в квадрате");
+}
+
+#[test]
+fn msubsup_simple() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "икс 1, икс в квадрате");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "икс с индексом 1, икс в квадрате");
+}
\ No newline at end of file
diff --git a/tests/Languages/ru/alphabets.rs b/tests/Languages/ru/alphabets.rs
new file mode 100644
index 00000000..0e5fb3b7
--- /dev/null
+++ b/tests/Languages/ru/alphabets.rs
@@ -0,0 +1,340 @@
+/// Тесты для правил, общих для различных стилей речи:
+/// * здесь собраны тесты, посвящённые различным алфавитам
+use crate::common::*;
+
+#[test]
+fn special_alphabet_chars() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная заглавная аш, фрактурная заглавная цэ");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойная заглавная аш, двойная заглавная пи");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная заглавная и, рукописная заглавная эм");
+}
+
+#[test]
+fn greek() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная альфа, заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "альфа, омега");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойная заглавная дельта, двойная заглавная ипсилон");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "альфа, омега");
+}
+
+#[test]
+fn cap_cyrillic() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная я");
+}
+
+#[test]
+fn parenthesized() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а в скобках, зет в скобках");
+}
+
+#[test]
+fn circled() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а в кружке, заглавная зет в кружке");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а в кружке, зет в кружке");
+}
+
+#[test]
+fn fraktur() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная заглавная а, фрактурная заглавная игрек");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная а, фрактурная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная заглавная а, фрактурная заглавная игрек");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная а, фрактурная зет");
+}
+
+#[test]
+fn bold_fraktur() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная жирная заглавная а, фрактурная жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная жирная а, фрактурная жирная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная жирная заглавная а, фрактурная жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фрактурная жирная а, фрактурная жирная зет");
+}
+
+#[test]
+fn double_struck() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойная заглавная а, двойная заглавная игрек");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойная а, двойная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойной ноль, двойная девять");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойная заглавная а, двойная заглавная игрек");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойная а, двойная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "двойной ноль, двойная девять");
+}
+
+#[test]
+fn script() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная заглавная а, рукописная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная а, рукописная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная заглавная а, рукописная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная а, рукописная зет");
+}
+
+#[test]
+fn bold_script() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная жирная заглавная а, рукописная жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная жирная а, рукописная жирная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная жирная заглавная а, рукописная жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "рукописная жирная а, рукописная жирная зет");
+}
+
+#[test]
+fn bold() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная а, жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная а, жирная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная а, жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная а, жирная зет");
+}
+
+#[test]
+fn italic() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+}
+
+#[test]
+fn sans_serif() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+}
+
+#[test]
+fn sans_serif_bold() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная а, жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная а, жирная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная а, жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная а, жирная зет");
+}
+
+#[test]
+fn sans_serif_italic() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+}
+
+#[test]
+fn sans_serif_bold_italic() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная а, жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная а, жирная зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная а, жирная заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная а, жирная зет");
+}
+
+#[test]
+fn monospace() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "а, зет");
+}
+
+#[test]
+fn bold_greek() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+}
+
+#[test]
+fn bold_greek_others() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+}
+
+#[test]
+fn italic_greek() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная альфа, заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "альфа, омега");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная альфа, заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "альфа, омега");
+}
+
+#[test]
+fn italic_greek_others() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "частная производная, пи");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "частная производная, пи");
+}
+
+#[test]
+fn bold_italic_greek() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+}
+
+#[test]
+fn bold_italic_greek_others() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+}
+
+#[test]
+fn sans_serif_bold_greek() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+}
+
+#[test]
+fn sans_serif_bold_greek_others() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+}
+
+#[test]
+fn sans_serif_bold_italic_greek() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная заглавная альфа, жирная заглавная омега");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная альфа, жирная омега");
+}
+
+#[test]
+fn sans_serif_bold_italic_greek_others() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+ // Версии из частной области MathType
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "жирная частная производная, жирное пи");
+}
+
+#[test]
+fn pua_regular() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная а, заглавная зет");
+}
+
+#[test]
+fn turned() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "перевернутая заглавная эф, перевернутая заглавная игрек без засечек");
+}
+
+#[test]
+fn enclosed_numbers() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "один в кружке, девять в кружке");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "один в скобках, девять в скобках");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "один с точкой, девять с точкой");
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "один в двойном кружке, девять в двойном кружке");
+}
diff --git a/tests/Languages/ru/chemistry.rs b/tests/Languages/ru/chemistry.rs
new file mode 100644
index 00000000..10d24b90
--- /dev/null
+++ b/tests/Languages/ru/chemistry.rs
@@ -0,0 +1,721 @@
+/// Тесты для правил, общих для различных стилей речи:
+/// * модифицированная переменная
+use crate::common::*;
+
+#[test]
+fn salt() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "заглавная эн а, заглавная цэ эль");
+}
+
+#[test]
+fn water() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "заглавная аш, 2 заглавная о");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "заглавная аш, нижний индекс 2 заглавная о");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "заглавная аш, нижний индекс 2, заглавная о");
+}
+
+#[test]
+fn carbon() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "заглавная цэ");
+}
+
+#[test]
+fn sulfate() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "открывающая квадратная скобка, заглавная эс, заглавная о, нижний индекс 4; закрывающая квадратная скобка, верхний индекс 2 минус");
+}
+
+#[test]
+fn aluminum_sulfate() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "заглавная а эль, 2, открыть заглавная эс, заглавная о, 4, закрыть 3");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "заглавная а эль, нижний индекс 2; открывающая круглая скобка, заглавная эс, заглавная о, нижний индекс 4; закрывающая круглая скобка, нижний индекс 3");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "заглавная а эль, нижний индекс 2; открывающая круглая скобка, заглавная эс, заглавная о, нижний индекс 4; закрывающая круглая скобка, нижний индекс 3");
+}
+
+#[test]
+fn ethanol_bonds() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "заглавная цэ, заглавная аш, 3 одинарная связь заглавная цэ, заглавная аш, 2 одинарная связь заглавная о, заглавная аш");
+}
+
+#[test]
+fn dichlorine_hexoxide() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "открывающая квадратная скобка, заглавная цэ эль, заглавная о, 2, закрывающая квадратная скобка плюс; открывающая квадратная скобка, заглавная цэ эль, заглавная о, 4, закрывающая квадратная скобка минус");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "открывающая квадратная скобка, заглавная цэ эль, заглавная о, нижний индекс 2; закрывающая квадратная скобка, верхний индекс плюс; открывающая квадратная скобка, заглавная цэ эль, заглавная о, нижний индекс 4; закрывающая квадратная скобка, верхний индекс минус");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ expr, "открывающая квадратная скобка, заглавная цэ эль, заглавная о, нижний индекс 2; закрывающая квадратная скобка, верхний индекс плюс; открывающая квадратная скобка, заглавная цэ эль, заглавная о, нижний индекс 4; закрывающая квадратная скобка, верхний индекс минус");
+}
+
+#[test]
+fn ethylene_with_bond() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "заглавная аш, 2 заглавная цэ, двойная связь заглавная цэ, заглавная аш, 2");
+}
+
+#[test]
+fn ferric_chloride_aq() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "заглавная эф е, заглавная цэ эль, 3 водный");
+}
+
+#[test]
+fn ethylene_with_colon_bond() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "заглавная аш, 2 заглавная цэ, двойная связь заглавная цэ, заглавная аш, 2");
+}
+
+#[test]
+fn beta_decay() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse")], expr,
+ "14, 6, заглавная цэ; образует, 14, 7, заглавная эн; плюс 0, минус 1, е");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium")], expr,
+ "верхний индекс 14, нижний индекс 6, заглавная цэ; реагирует с образованием; верхний индекс 14, нижний индекс 7, заглавная эн; плюс верхний индекс 0, нижний индекс минус 1, е");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose")], expr,
+ "верхний индекс 14, нижний индекс 6, заглавная цэ; реагирует с образованием; верхний индекс 14, нижний индекс 7, заглавная эн; плюс, верхний индекс 0, нижний индекс минус 1, е");
+}
+
+#[test]
+fn mhchem_beta_decay() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse")], expr,
+ "14, 6, заглавная цэ; образует, 14, 7, заглавная эн; плюс 0, минус 1, е");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium")], expr,
+ "верхний индекс 14, нижний индекс 6, заглавная цэ; реагирует с образованием; верхний индекс 14, нижний индекс 7, заглавная эн; плюс верхний индекс 0, нижний индекс минус 1, е");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose")], expr,
+ "верхний индекс 14, нижний индекс 6, заглавная цэ; реагирует с образованием; верхний индекс 14, нижний индекс 7, заглавная эн; плюс, верхний индекс 0, нижний индекс минус 1, е");
+}
+
+#[test]
+fn hcl_na_yields() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "2, заглавная аш, заглавная цэ эль; плюс 2 заглавная эн а; реагирует с образованием; 2, заглавная эн а, заглавная цэ эль; плюс заглавная аш, нижний индекс 2");
+}
+
+#[test]
+fn mhchem_so4_2plus() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "заглавная эс; заглавная о, 4, 2 плюс");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, "заглавная эс; заглавная о, нижний индекс 4, верхний индекс 2 плюс");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "заглавная эс; заглавная о, нижний индекс 4, верхний индекс 2 плюс");
+}
+
+#[test]
+fn mhchem_hcl_aq_etc() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "2, заглавная аш, заглавная цэ эль, водный; плюс, 2, заглавная эн а, твердый; образует; 2, заглавная эн а, заглавная цэ эль, водный; плюс, заглавная аш, 2, газ");
+}
+
+#[test]
+fn mhchem_barbed_equilibrium() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "заглавная аш, 2, газ; плюс; заглавная и, 2, газ; находится в равновесии с, 2, заглавная аш, заглавная и, газ");
+}
+
+#[test]
+fn mhchem_roman_in_superscript() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "заглавная эф е, 2; заглавная эф е, 3; заглавная о, 4");
+}
+
+#[test]
+fn dropped_msubsup_bug_358() {
+ let expr = r#""#;
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "2, заглавная эс, заглавная о, 2; плюс; заглавная о, 2 находится в равновесии с, 2, заглавная эс, заглавная о, 3");
+}
+
+
diff --git a/tests/Languages/ru/intent.rs b/tests/Languages/ru/intent.rs
new file mode 100644
index 00000000..3865f5ff
--- /dev/null
+++ b/tests/Languages/ru/intent.rs
@@ -0,0 +1,116 @@
+/// Тесты для правил, общих для различных стилей речи:
+/// * здесь собраны тесты, посвящённые различным алфавитам
+use crate::common::*;
+
+#[test]
+fn silent_intent() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2 икс");
+ test("ru", "LiteralSpeak", expr, "2 икс");
+}
+
+#[test]
+fn prefix_intent() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс");
+}
+
+#[test]
+fn postfix_intent() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс");
+}
+
+#[test]
+fn infix_intent() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс игрек зет 2");
+}
+
+#[test]
+fn infix_intent_no_args() {
+ // this is illegal intent, so it is just an mrow with one child
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс");
+}
+
+#[test]
+fn infix_intent_one_arg() {
+ let expr = r#""#;
+ // Note: we say the intent name because there are infix plus/minus with a single arg due to continued rows or combined columns
+ test("ru", "SimpleSpeak", expr, "икс");
+}
+
+#[test]
+fn function_intent() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс запятая, игрек запятая, зет запятая, 2");
+}
+
+#[test]
+fn function_no_args_intent() {
+ // this is illegal intent, so it is just an mrow with one child
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс");
+}
+
+#[test]
+fn function_one_arg_intent() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "икс");
+}
+
+#[test]
+fn silent_intent_mi() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "2");
+ test("ru", "ClearSpeak", expr, "2");
+}
+
+#[test]
+fn silent_intent_msup() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная аш 2");
+ test("ru", "ClearSpeak", expr, "заглавная аш 2");
+}
+
+#[test]
+fn silent_intent_underscore() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная аш 2");
+ test("ru", "ClearSpeak", expr, "заглавная аш 2");
+}
+
+#[test]
+fn intent_prob_x() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "вероятность икс");
+}
\ No newline at end of file
diff --git a/tests/Languages/ru/mtable.rs b/tests/Languages/ru/mtable.rs
new file mode 100644
index 00000000..9de995f8
--- /dev/null
+++ b/tests/Languages/ru/mtable.rs
@@ -0,0 +1,1084 @@
+use crate::common::*;
+
+#[test]
+fn matrix_1x1() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица 1 на 1 с элементом 3");
+ test("ru", "SimpleSpeak", expr, "матрица 1 на 1 с элементом 3");
+}
+
+#[test]
+fn determinant_1x1() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "определитель 1 на 1 с элементом 3");
+ test("ru", "SimpleSpeak", expr, "определитель 1 на 1 с элементом 3");
+}
+
+
+#[test]
+fn matrix_1x2() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица-строка 1 на 2; 3, 5");
+ test("ru", "SimpleSpeak", expr, "матрица-строка 1 на 2; 3, 5");
+}
+
+
+#[test]
+fn matrix_1x3() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица-строка 1 на 3; минус икс, 5, 12");
+ test("ru", "SimpleSpeak", expr, "матрица-строка 1 на 3; минус икс, 5, 12");
+}
+
+#[test]
+fn matrix_2x1_not_simple() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица-столбец 2 на 1; строка 1; икс плюс 1; строка 2; икс минус 1");
+ test("ru", "SimpleSpeak", expr, "матрица-столбец 2 на 1; строка 1; икс плюс 1; строка 2; икс минус 1");
+}
+#[test]
+fn matrix_3x1_not_simple() {
+ let expr = "
+ ";
+ test("ru", "SimpleSpeak", expr, "матрица-столбец 3 на 1; \
+ строка 1; икс; \
+ строка 2; а; \
+ строка 3; дробь, икс делить на, икс плюс 1, конец дроби");
+ test("ru", "ClearSpeak", expr, "матрица-столбец 3 на 1; \
+ строка 1; икс; \
+ строка 2; а; \
+ строка 3; дробь, числитель икс; знаменатель икс плюс 1");
+}
+
+#[test]
+fn determinant_2x2() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "определитель 2 на 2; строка 1; 2, 1; строка 2; 7, 5");
+ test("ru", "SimpleSpeak", expr, "определитель 2 на 2; строка 1; 2, 1; строка 2; 7, 5");
+}
+
+#[test]
+fn matrix_2x3() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица 2 на 3; строка 1; 3, 1, 4; строка 2; 0, 2, 6");
+ test("ru", "SimpleSpeak", expr, "матрица 2 на 3; строка 1; 3, 1, 4; строка 2; 0, 2, 6");
+}
+
+#[test]
+fn matrix_2x3_labeled() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr,
+ "матрица 2 на 3; строка 1 с меткой (3.1); столбец 2; 3, столбец 3; 1, столбец 4; 4; \
+ строка 2; столбец 1; 0, столбец 2; 2, столбец 3; 6");
+ test("ru", "SimpleSpeak", expr,
+ "матрица 2 на 3; строка 1 с меткой (3.1); столбец 2; 3, столбец 3; 1, столбец 4; 4; \
+ строка 2; столбец 1; 0, столбец 2; 2, столбец 3; 6");
+}
+
+#[test]
+fn matrix_3x1() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица-столбец 3 на 1; 1; 2; 3");
+ test("ru", "SimpleSpeak", expr, "матрица-столбец 3 на 1; 1; 2; 3");
+}
+
+#[test]
+fn matrix_4x1() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица-столбец 4 на 1; строка 1; 3; строка 2; 6; строка 3; 1; строка 4; 2");
+ test("ru", "SimpleSpeak", expr, "матрица-столбец 4 на 1; строка 1; 3; строка 2; 6; строка 3; 1; строка 4; 2");
+}
+
+#[test]
+fn matrix_4x1_labeled() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr,
+ "матрица-столбец 4 на 1; строка 1; 3; строка 2; 6; строка 3; 1; строка 4 с меткой (3.1); 2");
+ test("ru", "SimpleSpeak", expr,
+ "матрица-столбец 4 на 1; строка 1; 3; строка 2; 6; строка 3; 1; строка 4 с меткой (3.1); 2");
+}
+
+#[test]
+fn matrix_1x4() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица-строка 1 на 4; столбец 1; 3, столбец 2; 6, столбец 3; 1, столбец 4; 2");
+ test("ru", "SimpleSpeak", expr, "матрица-строка 1 на 4; столбец 1; 3, столбец 2; 6, столбец 3; 1, столбец 4; 2");
+}
+
+#[test]
+fn matrix_4x4() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица 4 на 4; \
+ строка 1; столбец 1; 0, столбец 2; 3, столбец 3; 4, столбец 4; 3; \
+ строка 2; столбец 1; 2, столбец 2; 1, столбец 3; 0, столбец 4; 9; \
+ строка 3; столбец 1; 3, столбец 2; 0, столбец 3; 2, столбец 4; 1; \
+ строка 4; столбец 1; 6, столбец 2; 2, столбец 3; 9, столбец 4; 0");
+ test("ru", "SimpleSpeak", expr, "матрица 4 на 4; \
+ строка 1; столбец 1; 0, столбец 2; 3, столбец 3; 4, столбец 4; 3; \
+ строка 2; столбец 1; 2, столбец 2; 1, столбец 3; 0, столбец 4; 9; \
+ строка 3; столбец 1; 3, столбец 2; 0, столбец 3; 2, столбец 4; 1; \
+ строка 4; столбец 1; 6, столбец 2; 2, столбец 3; 9, столбец 4; 0");}
+
+#[test]
+fn matrix_4x2() {
+ let expr = "
+
+ ";
+ test("ru", "ClearSpeak", expr, "матрица 4 на 2; \
+ строка 1; столбец 1; 1, столбец 2; 3; \
+ строка 2; столбец 1; 4, столбец 2; 2; \
+ строка 3; столбец 1; 2, столбец 2; 1; \
+ строка 4; столбец 1; 0, столбец 2; 5\
+ ");
+ test("ru", "SimpleSpeak", expr, "матрица 4 на 2; \
+ строка 1; столбец 1; 1, столбец 2; 3; \
+ строка 2; столбец 1; 4, столбец 2; 2; \
+ строка 3; столбец 1; 2, столбец 2; 1; \
+ строка 4; столбец 1; 0, столбец 2; 5\
+ ");}
+
+// поместим тест для абсолютной величины сюда, так как он связан с определителем и слишком мал для отдельного файла
+#[test]
+fn simple_absolute_value() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "абсолютная величина икс");
+ test("ru", "ClearSpeak", expr, "абсолютная величина икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse"), ("ClearSpeak_AbsoluteValue", "Auto")], expr, "абсолютная величина икс");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_AbsoluteValue", "AbsEnd")],
+ expr, "абсолютная величина икс, конец абсолютной величины");
+}
+
+#[test]
+fn absolute_value_plus_1() {
+let expr = "";
+ test("ru", "ClearSpeak", expr, "абсолютная величина икс плюс 1");
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Terse"), ("ClearSpeak_AbsoluteValue", "AbsEnd")],
+ expr, "абсолютная величина икс плюс 1, конец абсолютной величины");
+}
+
+#[test]
+fn simple_cardinality_value() {
+ let expr = "";
+ test_prefs("ru", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_AbsoluteValue", "Cardinality")], expr,
+ "мощность заглавная эс");
+}
+
+// Тестирование предпочтений
+#[test]
+fn simple_matrix_speak_col_num() {
+let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "матрица 2 на 2; строка 1; столбец 1; 2, столбец 2; 1; строка 2; столбец 1; 7, столбец 2; 5");
+}
+
+#[test]
+fn col_matrix_3x1_speak_col_num() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "матрица-столбец 3 на 1; строка 1; 1; строка 2; 2; строка 3; 3");
+}
+
+#[test]
+fn row_matrix_1x2_speak_col_num() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "матрица-строка 1 на 2; столбец 1; 1, столбец 2; 2");
+}
+
+#[test]
+fn matrix_2x2_speak_col_num() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "матрица 2 на 2; строка 1; столбец 1; бэ нижний индекс 1 1; столбец 2; бэ нижний индекс 1 2; \
+ строка 2; столбец 1; бэ нижний индекс 2 1; столбец 2; бэ нижний индекс 2 2");
+}
+
+
+#[test]
+fn simple_matrix_silent_col_num() {
+let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "матрица 2 на 2; строка 1; 2, 1; строка 2; 7, 5");
+}
+
+#[test]
+fn col_matrix_3x1_silent_col_num() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "матрица-столбец 3 на 1; 1; 2; 3");
+}
+
+#[test]
+fn row_matrix_1x2_silent_col_num() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "матрица-строка 1 на 2; 1, 2");
+}
+
+#[test]
+fn matrix_2x2_silent_col_num() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "матрица 2 на 2; строка 1; бэ нижний индекс 1 1; бэ нижний индекс 1 2; \
+ строка 2; бэ нижний индекс 2 1; бэ нижний индекс 2 2");
+}
+
+
+#[test]
+fn simple_matrix_end_matrix() {
+let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "матрица 2 на 2; строка 1; 2, 1; строка 2; 7, 5; конец матрицы");
+}
+
+#[test]
+fn col_matrix_3x1_end_matrix() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "матрица-столбец 3 на 1; 1; 2; 3; конец матрицы");
+}
+
+#[test]
+fn row_matrix_1x2_end_matrix() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "матрица-строка 1 на 2; 1, 2; конец матрицы");
+}
+
+#[test]
+fn matrix_2x2_end_matrix() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "матрица 2 на 2; строка 1; столбец 1; бэ нижний индекс 1 1; столбец 2; бэ нижний индекс 1 2; \
+ строка 2; столбец 1; бэ нижний индекс 2 1; столбец 2; бэ нижний индекс 2 2; конец матрицы");
+}
+
+
+#[test]
+fn simple_matrix_vector() {
+let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Matrix", "Vector",
+ expr, "матрица 2 на 2; строка 1; 2, 1; строка 2; 7, 5");
+}
+
+#[test]
+fn col_matrix_3x1_vector() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "Vector",
+ expr, "вектор-столбец 3 на 1; 1; 2; 3");
+}
+
+#[test]
+fn row_matrix_1x2_vector() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "Vector",
+ expr, "вектор-строка 1 на 2; 1, 2");
+}
+
+#[test]
+fn matrix_2x2_vector() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "Vector",
+ expr, "матрица 2 на 2; строка 1; столбец 1; бэ нижний индекс 1 1; столбец 2; бэ нижний индекс 1 2; \
+ строка 2; столбец 1; бэ нижний индекс 2 1; столбец 2; бэ нижний индекс 2 2");
+}
+
+
+#[test]
+fn simple_matrix_end_vector() {
+let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndVector",
+ expr, "матрица 2 на 2; строка 1; 2, 1; строка 2; 7, 5; конец матрицы");
+}
+
+#[test]
+fn col_matrix_3x1_end_vector() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndVector",
+ expr, "вектор-столбец 3 на 1; 1; 2; 3; конец вектора");
+}
+
+#[test]
+fn row_matrix_1x2_end_vector() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndVector",
+ expr, "вектор-строка 1 на 2; 1, 2; конец вектора");
+}
+
+#[test]
+fn matrix_2x2_end_vector() {
+let expr = "";
+test_ClearSpeak("ru", "ClearSpeak_Matrix", "EndVector",
+ expr, "матрица 2 на 2; строка 1; столбец 1; бэ нижний индекс 1 1; столбец 2; бэ нижний индекс 1 2; \
+ строка 2; столбец 1; бэ нижний индекс 2 1; столбец 2; бэ нижний индекс 2 2; конец матрицы");
+}
+
+
+
+#[test]
+fn matrix_binomial() {
+ let expr = "";
+ test_ClearSpeak("ru", "ClearSpeak_Matrix", "Combinatorics", expr, "число сочетаний из 3 по 2");
+}
+
+#[test]
+fn matrix_times() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "матрица 2 на 2; строка 1; 1, 2; строка 2; 3, 4; умножить на, матрица 2 на 2; строка 1; а, б; строка 2; цэ, дэ");
+}
+
+#[test]
+fn unknown_mtable_property() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr,
+ "2 строки; строка 1; а равно b плюс цэ минус дэ; строка 2; плюс e минус f");
+}
+
+
+#[test]
+fn zero_matrix() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "нулевая матрица 2 на 2");
+}
+
+#[test]
+fn identity_matrix() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "единичная матрица 3 на 3");
+}
+
+#[test]
+fn diagonal_matrix() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "диагональная матрица 3 на 3; столбец 1; 2; столбец 2; 1; столбец 3; икс в квадрате");
+ // test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ // expr, "диагональная матрица 3 на 3; строка 1, столбец 1, 2; строка 2, столбец 2, 1; строка 3, столбец 3, икс в квадрате");
+}
diff --git a/tests/Languages/ru/shared.rs b/tests/Languages/ru/shared.rs
new file mode 100644
index 00000000..8282ec2c
--- /dev/null
+++ b/tests/Languages/ru/shared.rs
@@ -0,0 +1,451 @@
+/// Тесты для правил, общих для различных стилей речи:
+/// * модифицированная переменная
+use crate::common::*;
+
+#[test]
+fn modified_vars() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr,
+ "а гравис, б тильда, цэ брэвэ, б гачек, цэ гравис; плюс \
+ эр гачек; плюс икс точка, игрек точка, зет две точки, у три точки, вэ четыре точки; плюс икс циркумфлекс, плюс вектор тэ");
+}
+
+#[test]
+fn limit() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "предел при x стремящемся к 0, от, дроби, синус икс, делить на, икс, конец дроби");
+ test_prefs("ru", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "предел при x стремящемся к 0, от; синус икс, делить на икс");
+}
+
+#[test]
+fn limit_from_below() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "предел при x стремящемся к 0 снизу, от синус икс");
+}
+
+#[test]
+fn binomial_mmultiscripts() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "число сочетаний из n по m");
+}
+
+#[test]
+fn binomial_mmultiscripts_other() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "число сочетаний из n по m");
+}
+
+#[test]
+fn binomial_subscript() { // C_{n,k}
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "число сочетаний из n по m");
+}
+
+#[test]
+fn permutation_mmultiscripts() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "число размещений из n по k");
+}
+
+#[test]
+fn permutation_mmultiscripts_sup() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "число размещений из n по k");
+}
+
+#[test]
+fn permutation_msubsup() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "число размещений из n по k");
+}
+
+#[test]
+fn tensor_mmultiscripts() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "заглавная эр с 4 индексами после, нижний индекс i верхний индекс j нижний индекс k нижний индекс l");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Medium")], expr,
+ "заглавная эр с 4 индексами после, нижний i верхний j нижний k нижний l");
+}
+
+#[test]
+fn huge_num_mmultiscripts() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "заглавная эр с 4 индексами перед, перед нижний заглавная и, перед верхний заглавная джей и далее перед нижний заглавная ка перед нижний заглавная эль, и с 5 индексами после, нижний индекс i верхний индекс j нижний индекс k нижний индекс l и далее нижний индекс m");
+}
+
+#[test]
+fn prime() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "икс штрих");
+}
+
+#[test]
+fn given() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная пэ, открывающая круглая скобка, заглавная а при условии заглавная бэ, закрывающая круглая скобка");
+ test("ru", "ClearSpeak", expr, "заглавная пэ, открывающая круглая скобка, заглавная а при условии заглавная бэ, закрывающая круглая скобка");
+}
+
+#[test]
+fn simple_msubsup() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "икс нижний индекс k, в степени i");
+}
+
+#[test]
+fn non_simple_msubsup() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "и нижний индекс j минус 2, в степени k");
+ test("ru", "ClearSpeak", expr, "и нижний индекс j минус 2, в степени k");
+ test_prefs("ru", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "и нижний индекс j минус 2, в степени k");
+}
+
+#[test]
+fn presentation_mathml_in_semantics() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "икс нижний индекс k, в степени i");
+}
+
+#[test]
+fn ignore_period() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "заглавная пэ; открывающая круглая скобка, заглавная а и заглавная бэ; закрывающая круглая скобка; равно; заглавная пэ, открывающая круглая скобка, заглавная а пересечение заглавная бэ; закрывающая круглая скобка; равно, заглавная пэ от заглавной а, заглавная пэ от заглавной бэ");
+}
+
+#[test]
+fn ignore_mtext_period() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "множество 2");
+}
+
+#[test]
+fn ignore_comma() {
+ let expr = "";
+ test("ru", "SimpleSpeak", expr, "фи от икс равно; цэ, e в степени минус аш в квадрате, икс в квадрате");
+}
+
+#[test]
+#[ignore] // issue #14
+fn ignore_period_and_space() {
+ let expr = "";
+ test("ru", "ClearSpeak", expr, "фи от икс равно; цэ, e в степени минус аш в квадрате икс в квадрате");
+}
+
+#[test]
+fn bug_199_2pi() {
+ let expr = "";
+ test("ru", "SimpleSpeak",expr, "полуинтервал от 0 до 2 пи");
+}
+
+#[test]
+fn caret_and_hat() {
+ let expr = "";
+ test("ru", "SimpleSpeak",expr, "икс крышка 2 плюс игрек циркумфлекс");
+}
+
+#[test]
+fn mn_with_space() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("DecimalSeparators", "."), ("BlockSeparators", " ,")], expr, "1234567");
+}
+
+#[test]
+fn mn_with_block_and_decimal_separators() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("DecimalSeparators", "."), ("BlockSeparators", " ,")], expr, "1234.56");
+}
+
+#[test]
+fn divergence() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "див заглавная эф");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "дивергенция заглавной эф");
+}
+
+#[test]
+fn curl() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "ротор заглавная эф");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "ротор заглавной эф");
+}
+
+#[test]
+fn gradient() {
+ let expr = "";
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "набла заглавная эф");
+ test_prefs("ru", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "градиент заглавной эф");
+}
+
+#[test]
+fn literal_speak() {
+ let expr = r#""#;
+ test("ru", "LiteralSpeak", expr, "заглавная а со стрелкой, перпендикулярно, заглавная бэ со стрелкой");
+}
+
+#[test]
+fn literal_speak_with_name() {
+ let expr = r#""#;
+ test("ru", "LiteralSpeak", expr, "форсид эф, открывающая круглая скобка икс восклицательный знак, закрывающая круглая скобка");
+}
+
+#[test]
+fn literal_speak_with_property() {
+ let expr = r#""#;
+ test("ru", "LiteralSpeak", expr, "эф, открывающая круглая скобка икс восклицательный знак, закрывающая круглая скобка");
+}
+
+#[test]
+fn literal_intent_property() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "заглавная а со стрелкой, перпендикулярно, заглавная бэ со стрелкой");
+}
+
+#[test]
+fn literal_intent_property_with_name() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr, "форсид эф, открывающая круглая скобка икс восклицательный знак, закрывающая круглая скобка");
+}
diff --git a/tests/Languages/ru/units.rs b/tests/Languages/ru/units.rs
new file mode 100644
index 00000000..ec468894
--- /dev/null
+++ b/tests/Languages/ru/units.rs
@@ -0,0 +1,489 @@
+/// Тесты для правил, общих для различных стилей речи:
+/// * модифицированная переменная
+use crate::common::*;
+
+// Основная структура тестов:
+// 1. Проход по всем приставкам СИ
+// 2. Проход по каждой группе единиц СИ
+// a) как в единственном, так и во множественном числе без приставок
+// b) как в единственном, так и во множественном числе с одной приставкой
+// 3. Проход по каждой группе единиц, не принимающих приставки СИ
+// Они разбиты на части, чтобы легче было видеть ошибки, когда они есть.
+
+#[test]
+fn prefix_sweep() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "кветта-граммы, запятая, \
+ ронна-граммы, запятая, \
+ иотта-граммы, запятая, \
+ зетта-граммы, запятая, \
+ экса-граммы, запятая, \
+ пета-граммы, запятая, \
+ тера-граммы, запятая, \
+ гига-граммы, запятая, \
+ мега-граммы, запятая, \
+ кило-граммы, запятая, \
+ гекто-граммы, запятая, \
+ дека-граммы, запятая, \
+ деци-граммы, запятая, \
+ санти-граммы, запятая, \
+ милли-граммы, запятая, \
+ микро-граммы, запятая, \
+ нано-граммы, запятая, \
+ пико-граммы, запятая, \
+ фемто-граммы, запятая, \
+ атто-граммы, запятая, \
+ зепто-граммы, запятая, \
+ иокто-граммы, запятая, \
+ ронто-граммы, запятая, \
+ квекто-граммы");
+}
+
+#[test]
+fn si_base() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 ампер, запятая, 2 ампера, запятая, \
+ 1 кандела, запятая; 2 канделы, запятая, \
+ 1 кельвин, запятая, 2 кельвина, запятая, \
+ 1 кельвин, запятая, 2 кельвина, запятая, \
+ 1 грамм, запятая, 2 грамма, запятая, \
+ 1 метр, запятая, 2 метра, запятая, \
+ 1 моль, запятая, 2 моля, запятая, \
+ 1 секунда, запятая, 2 секунды, запятая, \
+ 1 секунда, запятая, 2 секунды, запятая, \
+ 1 секунда, запятая, 2 секунды, запятая, \
+ 1 секунда, запятая, 2 секунды");
+}
+
+#[test]
+fn si_base_with_prefixes() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 кветта-ампер, запятая; 2 ронна-ампера, запятая; \
+ 1 иотта-кандела, запятая; 2 зетта-канделы, запятая; \
+ 1 экса-кельвин, запятая; 2 пета-кельвина, запятая; \
+ 1 тера-кельвин, запятая; 2 гига-кельвина, запятая; \
+ 1 мега-грамм, запятая; 2 кило-грамма, запятая; \
+ 1 гекто-метр, запятая; 2 дека-метра, запятая; \
+ 1 деци-моль, запятая; 2 санти-моля, запятая; \
+ 1 милли-секунда, запятая; 2 микро-секунды, запятая; \
+ 1 нано-секунда, запятая; 2 пико-секунды");
+}
+
+#[test]
+fn si_derived_1() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 беккерель, запятая; 2 беккереля, запятая, \
+ 1 кулон, запятая; 2 кулона, запятая; \
+ 1 градус Цельсия, запятая; 2 градуса Цельсия, запятая; \
+ 1 градус Цельсия, запятая; 2 градуса Цельсия, запятая, \
+ 1 фарад, запятая, 2 фарада, запятая, \
+ 1 грей, запятая, 2 грея, запятая, \
+ 1 генри, запятая, 2 генри, запятая, \
+ 1 герц, запятая, 2 герца, запятая, \
+ 1 джоуль, запятая, 2 джоуля, запятая, \
+ 1 катал, запятая, 2 катала, запятая, \
+ 1 люмен, запятая, 2 люмена, запятая, \
+ 1 люкс, запятая, 2 люкс");
+}
+
+#[test]
+fn si_derived_1_with_prefixes() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 кветта-беккерель, запятая; 2 ронна-беккереля; запятая; \
+ 1 иотта-кулон, запятая; 2 зетта-кулона, запятая; \
+ 1 экса-фарад, запятая; 2 пета-фарада, запятая; \
+ 1 тера-грей, запятая; 2 гига-грея, запятая; \
+ 1 мега-генри, запятая; 2 кило-генри, запятая; \
+ 1 дека-герц, запятая; 2 деци-герца, запятая; \
+ 1 санти-джоуль, запятая; 2 милли-джоуля, запятая; \
+ 1 микро-катал, запятая; 2 нано-катала, запятая; \
+ 1 пико-люмен, запятая; 2 фемто-люмена, запятая; \
+ 1 атто-люкс, запятая; 2 зепто-люкс, запятая; \
+ 1 милли-градус Цельсия; запятая; 2 микро-градуса Цельсия; запятая; \
+ 1 пико-градус Цельсия; запятая; 2 нано-градуса Цельсия");
+}
+
+#[test]
+fn si_derived_2() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 ньютон, запятая, 2 ньютона, запятая, \
+ 1 ом, запятая, 2 ома, запятая, \
+ 1 ом, запятая, 2 ома, запятая, \
+ 1 паскаль, запятая, 2 паскаля, запятая, \
+ 1 сименс, запятая, 2 сименс, запятая, \
+ 1 зиверт, запятая; 2 зиверта, запятая, \
+ 1 тесла, запятая, 2 теслы, запятая, \
+ 1 вольт, запятая, 2 вольта, запятая, \
+ 1 ватт, запятая, 2 ватта, запятая, \
+ 1 вебер, запятая, 2 вебера");
+}
+
+#[test]
+fn si_derived_2_with_prefixes() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 квекто-ньютон, запятая; 2 ронто-ньютона, запятая; \
+ 1 иокто-ом, запятая; 2 зепто-ома, запятая; \
+ 1 атто-ом, запятая; 2 фемто-ома, запятая; \
+ 1 пико-паскаль, запятая; 2 нано-паскаля, запятая; \
+ 1 микро-сименс, запятая; 2 милли-сименс, запятая; \
+ 1 санти-зиверт, запятая; 2 деци-зиверта, запятая; \
+ 1 дека-тесла, запятая; 2 гекто-теслы, запятая; \
+ 1 кило-вольт, запятая; 2 мега-вольта, запятая; \
+ 1 гига-ватт, запятая; 2 тера-ватта, запятая; \
+ 1 пета-вебер, запятая; 2 экса-вебера");
+}
+
+#[test]
+fn si_accepted() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 литр, запятая, 2 литра, запятая, \
+ 1 литр, запятая, 2 литра, запятая, \
+ 1 литр, запятая, 2 литра, запятая, \
+ 1 тонна, запятая; 2 тонны, запятая, \
+ 1 дальтон, запятая, 2 дальтона, запятая, \
+ 1 непер, запятая, 2 непера, запятая; \
+ 1 атомная единица массы, запятая; 2 атомные единицы массы, запятая; \
+ 1 электронвольт, запятая; 2 электронвольта, запятая, \
+ 1 радиан, запятая, 2 радиана, запятая, \
+ 1 стерадиан, запятая; 2 стерадиана, запятая, \
+ 1 год, запятая, 2 года, запятая, \
+ 1 угловая секунда, запятая; 2 угловые секунды, запятая, \
+ 1 бит, запятая, 2 бита, запятая, \
+ 1 байт, запятая, 2 байта, запятая, \
+ 1 бод, запятая, 2 бода");
+}
+
+#[test]
+fn si_accepted_with_prefixes() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 кветта-литр, запятая; 2 ронна-литра, запятая; \
+ 1 иотта-литр, запятая; 2 зетта-литра, запятая; \
+ 1 экса-литр, запятая; 2 пета-литра, запятая; \
+ 1 тера-тонна, запятая; 2 гига-тонны; запятая; \
+ 1 мега-дальтон, запятая; 2 кило-дальтона, запятая; \
+ 1 деци-непер, запятая; 2 санти-непера, запятая; \
+ 1 гекто-атомная единица массы; запятая; 2 дека-атомные единицы массы; запятая; \
+ 1 милли-электронвольт, запятая; 2 микро-электронвольта; запятая; \
+ 1 нано-радиан, запятая; 2 пико-радиана, запятая; \
+ 1 фемто-стерадиан, запятая; 2 атто-стерадиана; запятая; \
+ 1 гига-год, запятая; 2 мега-года, запятая; \
+ 1 зепто-угловая секунда, запятая; 2 иокто-угловые секунды; запятая; \
+ 1 кило-бит, запятая; 2 мега-бита, запятая; \
+ 1 гига-байт, запятая; 2 тера-байта, запятая; \
+ 1 тера-бод, запятая; 2 экса-бода");
+}
+
+#[test]
+fn without_prefix_time() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 секунда, запятая, 2 секунды, запятая, \
+ 1 секунда, запятая, 2 секунды, запятая, \
+ 1 минута, запятая, 2 минуты, запятая, \
+ 1 минута, запятая, 2 минуты, запятая, \
+ 1 минута, запятая, 2 минуты, запятая, \
+ 1 час, запятая, 2 часа, запятая, \
+ 1 час, запятая, 2 часа, запятая, \
+ 1 час, запятая, 2 часа, запятая, \
+ 1 день, запятая, 2 дня, запятая, \
+ 1 день, запятая, 2 дня, запятая, \
+ 1 неделя, запятая, 2 недели, запятая, \
+ 1 неделя, запятая, 2 недели, запятая, \
+ 1 год, запятая, 2 года, запятая, \
+ 1 год, запятая, 2 года");
+}
+
+#[test]
+fn without_prefix_angles() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 градус, запятая, 2 градуса, запятая, \
+ 1 градус, запятая, 2 градуса, запятая, \
+ 1 угловая минута, запятая; 2 угловые минуты, запятая, \
+ 1 угловая минута, запятая; 2 угловые минуты, запятая, \
+ 1 угловая минута, запятая; 2 угловые минуты, запятая, \
+ 1 угловая минута, запятая; 2 угловые минуты, запятая, \
+ 1 угловая секунда, запятая; 2 угловые секунды, запятая, \
+ 1 угловая секунда, запятая; 2 угловые секунды");
+}
+
+#[test]
+fn without_prefix_distance() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 астрономическая единица, запятая; 2 астрономические единицы, запятая, \
+ 1 световой год, запятая; 2 световых года, запятая, \
+ 1 парсек, запятая, 2 парсека, запятая, \
+ 1 ангстрем, запятая; 2 ангстрема, запятая, \
+ 1 ангстрем, запятая; 2 ангстрема, запятая, \
+ 1 ферми, запятая, 2 ферми");
+}
+
+#[test]
+fn without_prefix_other() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 гектар, запятая; 2 гектара, запятая, \
+ 1 децибел, запятая; 2 децибела, запятая, \
+ 1 атмосфера, запятая; 2 атмосферы, запятая; \
+ 1 атомная единица массы, запятая; 2 атомные единицы массы, запятая, \
+ 1 бар, запятая, 2 бара, запятая, \
+ 1 калория, запятая; 2 калории, запятая, \
+ 1 кюри, запятая, 2 кюри, запятая, \
+ 1 град, запятая; 2 града, запятая, \
+ 1 моляр, запятая, 2 моляра, запятая, \
+ 1 рентген, запятая; 2 рентгена, запятая; \
+ 1 оборот в минуту, запятая; 2 оборота в минуту, запятая, \
+ 1 эм-аш-о, запятая, 2 эм-аш-о, запятая, \
+ 1 дина, запятая, 2 дины, запятая, \
+ 1 эрг, запятая, 2 эрга");
+}
+
+#[test]
+fn without_prefix_powers_of_2() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1 кибибит, запятая; 2 кибибита, запятая, \
+ 1 мебибит, запятая; 2 мебибита, запятая, \
+ 1 гибибит, запятая; 2 гибибита, запятая, \
+ 1 тебибит, запятая; 2 тебибита, запятая, \
+ 1 пебибит, запятая; 2 пебибита, запятая, \
+ 1 эксбибит, запятая; 2 эксбибита, запятая, \
+ 1 зебибит, запятая; 2 зебибита, запятая, \
+ 1 йобибит, запятая; 2 йобибита, запятая, \
+ 1 кибибайт, запятая; 2 кибибайта, запятая, \
+ 1 мебибайт, запятая; 2 мебибайта, запятая, \
+ 1 гибибайт, запятая; 2 гибибайта, запятая, \
+ 1 тебибайт, запятая; 2 тебибайта, запятая, \
+ 1 пебибайт, запятая; 2 пебибайта, запятая, \
+ 1 эксбибайт, запятая; 2 эксбибайта, запятая, \
+ 1 зебибайт, запятая; 2 зебибайта, запятая, \
+ 1 йобибайт, запятая; 2 йобибайта");
+}
+
+#[test]
+fn si_other_numbers() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "1.0 литра, запятая; 2.0 метра, запятая; икс миллисекунд, запятая; игрек микросекунд, запятая, \
+ дека-граммы, запятая; 1235 дека-ньютонов; запятая; 2.5 микросекунды; запятая; 32.34 моля");
+}
+
+#[test]
+fn test_mtext_inference() {
+ let expr = r#""#;
+ test("ru", "SimpleSpeak", expr,
+ "открывающая квадратная скобка; 1 тонна, запятая; 2 пета-ампера, запятая, \
+ 3 паскаля, запятая; 4.5 милли-теслы; закрывающая квадратная скобка");
+}
diff --git a/tests/languages.rs b/tests/languages.rs
index b2b69e55..8a909fa7 100644
--- a/tests/languages.rs
+++ b/tests/languages.rs
@@ -6,6 +6,7 @@ mod Languages {
mod intent;
mod zh;
mod en;
+ mod ru;
mod fi;
mod sv;
mod vi {