--- # Note to translators: # most languages don't have two ways to pronounce 'a' -- if not need, remove the rules and change "B-Z" to "A-Z" # some languages say the word for "uppercase" after the letter. Make sure to change that where appropriate by moving some code around - "a": - test: if: "$TTS='none'" then: [t: "eigh"] # long "a" sound in all speech engines I tested (espeak, MS SAPI, eloquence, else: [spell: "'a'"] # AWS Polly, ReadSpeaker, NaturalReader, google cloud, nuance, ibm watson) - "b-z": - test: if: "$TTS='none'" then: [t: "."] else: [spell: "'.'"] # Capital letters are a little tricky: users can pick their favorite word (something that was requested) and # screen readers have options to use pitch changes or beeps instead of or in addition to say "cap" # Also, if a user can see the screen, they probably don't need to hear "cap", but if they specified an override, they must want to hear the override. - "A": - 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: "cap"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" replace: - test: if: "$TTS='none'" then: [t: "eigh"] else: [spell: "'a'"] - "B-Z": - 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: "cap"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" # note: processing of ranges converts '.' into the character, so it needs to be in quotes below replace: [spell: "translate('.', 'BCDEFGHIJKLMNOPQRSTUVWXYZ', 'bcdefghijklmnopqrstuvwxyz')"] - "0-9": [t: "."] - " ": [t: " "] # 0x20 - "!": # 0x21 - test: if: "ancestor-or-self::*[contains(@data-intent-property, ':literal:')]" then_test: if: "$Verbosity = 'Terse'" then: [t: "bang"] # 0x21 else: [t: "exclamation point"] # 0x21 else: [t: "factorial"] # 0x21 - "\"": [t: "quotation mark"] # 0x22 - "#": [t: "number"] # 0x23 - "$": [t: "dollars"] # 0x24 - "%": [t: "percent"] # 0x25 - "&": [t: "ampersand"] # 0x26 - "'": [t: "apostrophe"] # 0x27 - "(": # 0x28 - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then_test: if: "$Verbosity='Terse'" then: [t: "open"] # 0x28 else: [t: "open paren"] # 0x28 else: [t: "left paren"] # 0x28 - ")": # 0x29 - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then_test: if: "$Verbosity='Terse'" then: [t: "close"] # 0x29 else: [t: "close paren"] # 0x29 else: [t: "right paren"] # 0x29 - "*": # 0x2a test: if: "parent::*[name(.)='msup' or name(.)='msubsup' or name(.)='skip-super']" then: [t: "star"] # 0x2a else: [t: "times"] # 0x2a - "+": [t: "plus"] # 0x2b - ",": # 0x2c # the following deals with the interaction of "," with "…" which sometimes wants the ',' to be silent # that this test is here and not with "…" is not ideal, but seems simplest test: if: - "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_Ellipses = 'Auto' or " # must be ClearSpeak and $ClearSpeak_Ellipses = 'AndSoOn' # speak "comma" when not adjacent to '…' - "( following-sibling::*[1][text()!= '…'] and preceding-sibling::*[1][text()!='…'] ) or " # except if expression starts with '…' - "../*[1][text()='…'] " then: [t: "comma"] # else silent - "-": [t: "minus"] # 0x2d - ".": # 0x2e - test: if: "parent::*[1][self::m:mn]" then: [t: "point"] else: [t: "dot"] - "/": [t: "divided by"] # 0x2f - ":": [t: "colon"] # 0x3a - ";": [t: "semicolon"] # 0x3b - "<": # 0x3c - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "less than" - "=": # 0x3d - test: if: "$Verbosity!='Terse'" then: [t: "is equal to"] else: [t: "equals"] - ">": # 0x3e - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "greater than" - "?": [t: "question mark"] # 0x3f - "@": [t: "at sign"] # 0x40 - "[": # 0x5b - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then: [t: "open bracket"] else: [t: "left bracket"] - "\\": [t: "back slash"] # 0x5c - "]": # 0x5d - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then: [t: "close bracket"] else: [t: "right bracket"] - "^": # 0x5e - test: if: "parent::m:modified-variable or parent::m:mover" then: [t: "hat"] else: [t: "caret"] - "_": [t: "under bar"] # 0x5f - "`": [t: "grave"] # 0x60 - "{": # 0x7b - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then: [t: "open brace"] else: [t: "left brace"] - "|": # 0x7c # note: for ClearSpeak and SimpleSpeak, "|" inside of sets is handled at the mrow level, same for 'sets' - with: variables: [DefaultToGiven: "count(preceding-sibling::*)=1 and count(following-sibling::*)=1 and ../../../*[1][.='P']"] # P(A|B) replace: - test: - if: "$SpeechStyle != 'ClearSpeak'" then_test: if: "$DefaultToGiven" then: [t: "given"] else: [t: "vertical line"] - else_if: "not(preceding-sibling::*) or not(following-sibling::*)" then: [t: "vertical line"] - else_if: "$ClearSpeak_VerticalLine = 'SuchThat'" then: [t: "such that"] - else_if: "$ClearSpeak_VerticalLine = 'Given' or $DefaultToGiven" then: [t: "given"] - else: [t: "divides"] - "}": # 0x7d - test: if: $SpeechStyle = 'ClearSpeak' or $SpeechStyle = 'SimpleSpeak' then: [t: "close brace"] else: [t: "right brace"] - "~": [t: "tilde"] # 0x7e - " ": # 0xa0 - test: if: "@data-empty-in-2D" then: [t: "empty"] # want to say something for fraction (etc) with empty child else: [t: ""] - "¬": [t: "not"] # 0xac - "°": [t: "degrees"] # 0xb0 - "±": [t: "plus or minus"] # 0xb1 - "´": [t: "acute"] # 0xb4 - "·": # 0xB7 - test: if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolDot = 'Auto'" then: [t: "times"] else: [t: "dot"] - "×": # 0xd7 - test: if: "$SpeechStyle != 'ClearSpeak' or $ClearSpeak_MultSymbolX = 'Auto'" then: [t: "times"] else_test: if: $ClearSpeak_MultSymbolX = 'By' then: [t: "by"] else: [t: "cross"] - "÷": [t: "divided by"] # 0xf7 - "̀": [t: "grave accent embellishment"] # 0x300 - "́": [t: "acute accent embellishment"] # 0x301 - "̂": [t: "circumflex accent embellishment"] # 0x302 - "̃": [t: "tilde embellishment"] # 0x303 - "̄": [t: "macron embellishment"] # 0x304 - "̅": [t: "overbar embellishment"] # 0x305 - "̆": [t: "breve"] # 0x306 - "̇": [t: "dot above embellishment"] # 0x307 # Note: ClearSpeak has pref TriangleSymbol for "Δ", but that is wrong - "Α-Ω": - 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: "cap"] else: [x: "$SpeechOverrides_CapitalLetters"] - pitch: value: "$CapitalLetters_Pitch" # note: processing of ranges converts '.' into the character, so it needs to be in quotes below replace: [spell: "translate('.', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩ', 'αβγδεζηθικλμνξοπρςστυφχψω')"] - "α": [t: "alpha"] # 0x3b1 - "β": [t: "beta"] # 0x3b2 - "γ": [t: "gamma"] # 0x3b3 - "δ": [t: "delta"] # 0x3b4 - "ε": [t: "epsilon"] # 0x3b5 - "ζ": [t: "zeta"] # 0x3b6 - "η": [t: "eta"] # 0x3b7 - "θ": [t: "theta"] # 0x3b8 - "ι": [t: "iota"] # 0x3b9 - "κ": [t: "kappa"] # 0x3ba - "λ": [t: "lambda"] # 0x3bb - "μ": [t: "mu"] # 0x3bc - "ν": [t: "nu"] # 0x3bd - "ξ": [t: "zai"] # 0x3be - "ο": [t: "omicron"] # 0x3bf - "π": [t: "pi"] # 0x3c0 - "ρ": [t: "rho"] # 0x3c1 - "ς": [t: "final sigma"] # 0x3c2 - "σ": [t: "sigma"] # 0x3c3 - "τ": [t: "tau"] # 0x3c4 - "υ": [t: "upsilon"] # 0x3c5 - "φ": [t: "phi"] # 0x3c6 - "χ": [t: "chi"] # 0x3c7 - "ψ": [t: "psi"] # 0x3c8 - "ω": [t: "omega"] # 0x3c9 - "ϕ": [t: "phi"] # 0x3d5 - "ϖ": [t: "pi"] # 0x3d6 - "ϵ": [t: "epsilon"] # 0x3f5 - "϶": [t: "reversed epsilon"] # 0x3f6 - "–": [t: "en dash"] # 0x2013 - "—": [t: "em dash"] # 0x2014 - "―": [t: "horizontal bar"] # 0x2015 - "‖": [t: "double vertical line"] # 0x2016 - "…": # 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][text()='…']" then: [t: "dot dot dot"] else_test: # must have $ClearSpeak_Ellipses = 'AndSoOn' if: "count(following-sibling::*) = 0" then: [t: "and so on"] else: [t: "and so on up to"] - "⁡": # 0x2061 - test: if: "$Verbosity!='Terse' and not(preceding-sibling::*[1][IsInDefinition(., 'GeometryShapes')]) and not(@data-changed='added' and ancestor-or-self::*[contains(@data-intent-property, ':literal:')])" then: [t: "of"] - "⁢": [t: ""] # 0x2062 - "⁣": [t: ""] # 0x2063 - "⁤": [t: "and"] # 0x2064 - "′": [t: "prime"] # 0x2032 - "″": [t: "double prime"] # 0x2033 - "‴": [t: "triple prime"] # 0x2034 - "ℂℕℚℝℤ": # here we rely on this running through the table again to speak "cap xxx" - t: "double-struck" - spell: "translate('.', 'ℂℕℚℝℤ', 'CNQRZ')" - "℃": [t: "degrees celsius"] # 0x2103 - "℉": [t: "degrees fahrenheit"] # 0x2109 - "ℋℛℓ": # 0x210b - t: "script" - spell: "translate('.', 'ℋℛℓ', 'HRl')" - "ℎ": [t: "planck constant"] # 0x210e - "ℜ": # 0x211c - t: "fraktur" - spell: "'R'" - "Ω": [t: "ohms"] # 0x2126 - "K": [t: "kelvin"] # 0x212a - "Å": [t: "angstroms"] # 0x212b - "ⅆⅇⅈⅉ": # 0x2146-9 - t: "double-struck italic" - spell: "translate('.', 'ⅆⅇⅈⅉ', 'deij')" - "←": [t: "leftwards arrow"] # 0x2190 - "↑": [t: "upwards arrow"] # 0x2191 - "→": # 0x2192 - test: if: "ancestor::*[2][self::m:limit]" then: [t: "approaches"] else: [t: "right arrow"] - "↓": [t: "downwards arrow"] # 0x2193 - "⇒": [t: "rightwards double arrow"] # 0x21d2 - "∀": [t: "for all"] # 0x2200 - "∂": # 0x2202 - test: if: "$Verbosity='Terse'" then: [t: "partial"] else: [t: "partial derivative"] - "∃": [t: "there exists"] # 0x2203 - "∄": [t: "there does not exist"] # 0x2204 - "∅": [t: "empty set"] # 0x2205 - "∆": # 0x2206 - test: if: "$Verbosity!='Terse'" then: [t: "the"] - t: "laplacian of" - "∇": # 0x2207 - test: if: "$Verbosity!='Terse'" then: [t: "the"] - t: "gradient of" - "∈": # 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" then: - test: if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" then: [t: "is"] - t: "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: if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [t: "in"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' then: [t: "member of"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' then: [t: "element of"] - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' then: [t: "is a member of"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' then: [t: "is an element of"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' then: [t: "is in"] - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∉": # 0x2209 # rule is identical to 0x2208 - test: if: "$SpeechStyle != 'ClearSpeak'" then: - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "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: if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [t: "not in"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' then: [t: "not member of"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' then: [t: "not element of"] - else: [t: "not belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' then: [t: "is not a member of"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' then: [t: "is not an element of"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' then: [t: "is not in"] - else: [t: "does not belong to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∊": # 0x220a - test: if: "$SpeechStyle != 'ClearSpeak'" then: - test: if: "$Verbosity!='Terse' and not(ancestor::*[self::m:set])" # "the set x is an element of ..." sounds bad" then: [t: "is"] - t: "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: if: "../../self::m:set or ../../../self::m:set" # inside a set then_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'In' then: [t: "in"] - else_if: $ClearSpeak_SetMemberSymbol = 'Member' then: [t: "member of"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' then: [t: "element of"] - else: [t: "belonging to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' else_test: - if: $ClearSpeak_SetMemberSymbol = 'Auto' or $ClearSpeak_SetMemberSymbol = 'Member' then: [t: "is a member of"] - else_if: $ClearSpeak_SetMemberSymbol = 'Element' then: [t: "is an element of"] - else_if: $ClearSpeak_SetMemberSymbol = 'In' then: [t: "is in"] - else: [t: "belongs to"] # $ClearSpeak_SetMemberSymbol = 'Belongs' - "∏": [t: "product"] # 0x220f - "∐": [t: "co-product"] # 0x2210 - "∑": [t: "sum"] # 0x2211 - "−": [t: "minus"] # 0x2212 - "∓": [t: "minus or plus"] # 0x2213 - "∗": [t: "times"] # 0x2217 - "∘": [t: "composed with"] # 0x2218 - "√": # 0x221a - test: if: "$Verbosity!='Terse'" then: [t: "the"] - t: "square root of" - "∝": # 0x221d - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "proportional to" - "∞": [t: "infinity"] # 0x221e - "∟": [t: "right angle"] # 0x221f - "∠": [t: "angle"] # 0x2220 - "∡": [t: "measured angle"] # 0x2221 - "∣": [t: "divides"] # 0x2223 - "∤": [t: "does not divide"] # 0x2224 - "∥": # 0x2225 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "parallel to" - "∦": # 0x2226 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "not parallel to" - "∧": [t: "and"] # 0x2227 - "∨": [t: "or"] # 0x2228 - "∩": [t: "intersection"] # 0x2229 - "∪": [t: "union"] # 0x222a - "∫": [t: "integral"] # 0x222b - "∬": [t: "double integral"] # 0x222c - "∭": [t: "triple integral"] # 0x222d - "∮": [t: "contour integral"] # 0x222e - "∶": # 0x2236 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "to" - "∷": [t: "as"] # 0x2237 - "∼": [t: "varies with"] # 0x223c - "∽": [t: "reversed tilde"] # 0x223d - "∾": # 0x223e - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "most positive" - "∿": [t: "sine wave"] # 0x223f - "≠": # 0x2260 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "not equal to" - "≡": # 0x2261 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "identical to" - "≤": # 0x2264 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "less than or equal to" - "≥": # 0x2265 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "greater than or equal to" - "≦": [t: "less than over equal to"] # 0x2266 - "≧": [t: "greater than over equal to"] # 0x2267 - "≺": [t: "precedes"] # 0x227a - "≻": [t: "succeeds"] # 0x227b - "⊂": # 0x2282 - test: if: "$Verbosity!='Terse'" then: [t: "is a"] - t: "subset of" - "⊃": # 0x2283 - test: if: "$Verbosity!='Terse'" then: [t: "is a"] - t: "superset of" - "⊄": # 0x2284 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "not a subset of" - "⊅": # 0x2285 - test: if: "$Verbosity!='Terse'" then: [t: "is"] - t: "not a superset of" - "⊆": # 0x2286 - test: if: "$Verbosity!='Terse'" then: [t: "is a"] - t: "subset of or equal to" - "⊇": # 0x2287 - test: if: "$Verbosity!='Terse'" then: [t: "is a"] - t: "superset of or equal to"