# localization.py -- Code to manage/help portage localization. # Copyright 2004-2020 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 import locale import math from portage import _encodings, _unicode_decode # We define this to make the transition easier for us. def _(mystr): """ Always returns unicode, regardless of the input type. This is helpful for avoiding UnicodeDecodeError from __str__() with Python 2, by ensuring that string format operations invoke __unicode__() instead of __str__(). """ return _unicode_decode(mystr) def localization_example(): # Dict references allow translators to rearrange word order. print(_("You can use this string for translating.")) print(_("Strings can be formatted with %(mystr)s like this.") % {"mystr": "VALUES"}) a_value = "value.of.a" b_value = 123 c_value = [1, 2, 3, 4] print(_(f"A: {a_value} -- B: {b_value} -- C: {c_value}")) def localized_size(num_bytes): """ Return pretty localized size string for num_bytes size (given in bytes). The output will be in kibibytes. """ # always round up, so that small files don't end up as '0 KiB' num_kib = math.ceil(num_bytes / 1024) try: formatted_num = locale.format_string("%d", num_kib, grouping=True) except UnicodeDecodeError: # failure to decode locale data formatted_num = str(num_kib) unicode_num = _unicode_decode(formatted_num, encoding=_encodings["stdio"]) return f"{unicode_num} KiB"