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