File indexing completed on 2024-05-05 17:52:55
0001 # -*- coding: UTF-8 -*- 0002 0003 """ 0004 Fill in Russian translations for units with metric prefixes. 0005 0006 Sieve has no options. 0007 0008 @author: Alexander Potashev <aspotashev@gmail.com> 0009 @license: GPLv3 0010 """ 0011 0012 from pology import _ 0013 from pology.msgreport import report_msg_content 0014 0015 0016 def setup_sieve (p): 0017 0018 p.set_desc(_("@info sieve discription", 0019 "Fill in Russian translations for units with metric prefixes." 0020 )) 0021 0022 0023 class Sieve (object): 0024 0025 def __init__ (self, params): 0026 self.prefixes = [ 0027 ('yotta', 'йотта', 'Y', 'Й'), 0028 ('zetta', 'зетта', 'Z', 'З'), 0029 ('exa', 'экса', 'E', 'Э'), 0030 ('peta', 'пета', 'P', 'П'), 0031 ('tera', 'тера', 'T', 'Т'), 0032 ('giga', 'гига', 'G', 'Г'), 0033 ('mega', 'мега', 'M', 'М'), 0034 ('kilo', 'кило', 'k', 'к'), 0035 ('hecto', 'гекто', 'h', 'г'), 0036 ('deca', 'дека', 'da', 'да'), 0037 ('', '', '', ''), 0038 ('deci', 'деци', 'd', 'д'), 0039 ('centi', 'санти', 'c', 'с'), 0040 ('milli', 'милли', 'm', 'м'), 0041 ('micro', 'микро', 'µ', 'мк'), 0042 ('nano', 'нано', 'n', 'н'), 0043 ('pico', 'пико', 'p', 'п'), 0044 ('femto', 'фемто', 'f', 'ф'), 0045 ('atto', 'атто', 'a', 'а'), 0046 ('zepto', 'зепто', 'z', 'з'), 0047 ('yocto', 'йокто', 'y', 'и'), 0048 0049 ('yobi', 'йоби', 'Yi', 'Йи'), 0050 ('zebi', 'зеби', 'Zi', 'Зи'), 0051 ('exbi', 'эксби', 'Ei', 'Эи'), 0052 ('pebi', 'пеби', 'Pi', 'Пи'), 0053 ('tebi', 'теби', 'Ti', 'Ти'), 0054 ('gibi', 'гиби', 'Gi', 'Ги'), 0055 ('mebi', 'меби', 'Mi', 'Ми'), 0056 ('kibi', 'киби', 'Ki', 'Ки'), 0057 ] 0058 0059 # {0} -> "giga", "гига" 0060 # {1} -> "G", "Г" 0061 def translate_with_unit_prefix(self, text, msgid_fmt, msgstr_fmt, bytes_exception): 0062 for prefix in self.prefixes: 0063 if text == msgid_fmt.format(prefix[0], prefix[2]): 0064 if bytes_exception and prefix[0] == 'kilo': 0065 return msgstr_fmt.format(prefix[1], 'К') # килобайт/КБ 0066 else: 0067 return msgstr_fmt.format(prefix[1], prefix[3]) 0068 0069 return None 0070 0071 def translate_with_unit_prefix_plural(self, texts, msgid_fmts, msgstr_fmts): 0072 for prefix in self.prefixes: 0073 if all(texts[i] == msgid_fmts[i].format(prefix[0], prefix[2]) for i in range(len(texts))): 0074 return list(msgstr_fmt.format(prefix[1], prefix[3]) for msgstr_fmt in msgstr_fmts) 0075 0076 return None 0077 0078 def translate_multiple_with_unit_prefix(self, text, unit_pairs, bytes_exception=False): 0079 for unit in unit_pairs: 0080 tr = self.translate_with_unit_prefix(text, unit[0], unit[1], len(unit) > 2 and unit[2]) 0081 if tr is not None: 0082 return tr 0083 0084 return None 0085 0086 def process_single(self, msg, cat): 0087 tr = None 0088 0089 # Example: "gigaamperes" -> "гигаамперы" 0090 if msg.msgctxt == 'unit description in lists': 0091 units = [ 0092 ('{0}amperes', '{0}амперы'), 0093 ('{0}ohms', '{0}омы'), 0094 ('{0}volts', '{0}вольты'), 0095 ('{0}bytes', '{0}байты'), 0096 ('{0}bits', '{0}биты'), 0097 ('{0}watts', '{0}ватты'), 0098 ] 0099 tr = self.translate_multiple_with_unit_prefix(msg.msgid, units) 0100 0101 if msg.msgctxt is not None and msg.msgctxt.endswith(' unit symbol'): 0102 units = [ 0103 ('{1}A', '{1}А'), 0104 ('{1}V', '{1}В'), 0105 ('{1}Ω', '{1}Ом'), 0106 # ('{0}ohms', u'{0}омы'), 0107 # ('{0}volts', u'{0}вольты'), 0108 ('{1}b', '{1}бит'), 0109 ('{1}W', '{1}Вт'), 0110 ] 0111 tr = self.translate_multiple_with_unit_prefix(msg.msgid, units) 0112 0113 if msg.msgctxt == 'unit synonyms for matching user input': 0114 # TODO replace these tuples with a structure 0115 units = [ 0116 ('{0}ampere;{0}amperes;{1}A', '{0}ампер;{0}ампера;{0}амперов;{0}амперы;{0}амперах;{1}А', False), 0117 ('{0}amp;{0}amps;{0}ampere;{0}amperes;{1}A', '{0}ампер;{0}ампера;{0}амперов;{0}амперы;{0}амперах;{1}А', False), 0118 ('{0}volt;{0}volts;{1}V', '{0}вольт;{0}вольта;{0}вольтов;{0}вольты;{0}вольтах;{1}В', False), 0119 ('{0}ohm;{0}ohms;{1}Ω', '{0}ом;{0}ома;{0}омов;{0}омы;{0}омах;{1}Ом', False), 0120 ('{1}B;{0}byte;{0}bytes', '{1}Б;{0}байт;{0}байта;{0}байтов;{0}байты;{0}байтах', True), 0121 ('{1}b;{0}bit;{0}bits', '{1}бит;{0}бит;{0}бита;{0}битов;{0}биты;{0}битах', False), 0122 ('{0}watt;{0}watts;{1}W', '{0}ватт;{0}ватта;{0}ваттов;{0}ватты;{0}ваттах;{1}Вт', False), 0123 ] 0124 tr = self.translate_multiple_with_unit_prefix(msg.msgid, units) 0125 0126 if msg.msgctxt == 'amount in units (real)': 0127 units = [ 0128 ('%1 {0}amperes', '%1 {0}ампера'), 0129 ('%1 {0}volts', '%1 {0}вольта'), 0130 ('%1 {0}ohms', '%1 {0}ома'), 0131 ('%1 {0}bytes', '%1 {0}байт'), 0132 ('%1 {0}bits', '%1 {0}бит'), 0133 ('%1 {0}watts', '%1 {0}ватт'), 0134 ] 0135 tr = self.translate_multiple_with_unit_prefix(msg.msgid, units) 0136 0137 return tr 0138 0139 def process_plural(self, msg, cat): 0140 if msg.msgctxt == 'amount in units (integer)': 0141 unit_pairs = [ 0142 (('%1 {0}ampere', '%1 {0}amperes'), 0143 ('%1 {0}ампер', '%1 {0}ампера', '%1 {0}ампер', '%1 {0}ампер')), 0144 (('%1 {0}ohm', '%1 {0}ohms'), 0145 ('%1 {0}ом', '%1 {0}ома', '%1 {0}ом', '%1 {0}ом')), 0146 (('%1 {0}volt', '%1 {0}volts'), 0147 ('%1 {0}вольт', '%1 {0}вольта', '%1 {0}вольт', '%1 {0}вольт')), 0148 (('%1 {0}byte', '%1 {0}bytes'), 0149 ('%1 {0}байт', '%1 {0}байта', '%1 {0}байт', '%1 {0}байт')), 0150 (('%1 {0}bit', '%1 {0}bits'), 0151 ('%1 {0}бит', '%1 {0}бита', '%1 {0}бит', '%1 {0}бит')), 0152 (('%1 {0}watt', '%1 {0}watts'), 0153 ('%1 {0}ватт', '%1 {0}ватта', '%1 {0}ватт', '%1 {0}ватт')), 0154 ] 0155 0156 for unit in unit_pairs: 0157 tr = self.translate_with_unit_prefix_plural((msg.msgid, msg.msgid_plural), unit[0], unit[1]) 0158 if tr is not None: 0159 return tr 0160 0161 return None 0162 0163 def process(self, msg, cat): 0164 # if msg.translated: 0165 # return 0166 0167 if msg.msgid_plural is None: 0168 tr = self.process_single(msg, cat) 0169 if tr is not None: 0170 msg.msgstr[0] = tr 0171 msg.unfuzzy() 0172 report_msg_content(msg, cat) 0173 else: 0174 tr = self.process_plural(msg, cat) 0175 if tr is not None: 0176 for i in range(len(tr)): 0177 msg.msgstr[i] = tr[i] 0178 msg.unfuzzy() 0179 report_msg_content(msg, cat) 0180 0181 def finalize(self): 0182 pass