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-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
diff --git a/Rules/Languages/ru/unicode.yaml b/Rules/Languages/ru/unicode.yaml
index ba904886..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,32 +69,32 @@
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)
- 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:
@@ -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,44 +132,44 @@
- "<": # 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'
- 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)
- - "_": [t: "под баром"] # 0x5f (en: 'under bar', google translation)
- - "`": [t: "могила"] # 0x60 (en: 'grave', 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)
- "{": # 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:
@@ -179,23 +179,23 @@
- 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
- 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?
@@ -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
- "Α-Ω":
@@ -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"
@@ -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:
@@ -296,14 +296,14 @@
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:
# 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,24 +312,24 @@
- "‴": [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)
+ - "℃": [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)
+ - 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)
@@ -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')
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 {