# -*- coding:utf-8 -*- ## src/common/i18n.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2004 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2009 Benjamin Richter
## Copyright (C) 2018 Philipp Hörist ## ## This file is part of Gajim. ## ## Gajim is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation; version 3 only. ## ## Gajim is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Gajim. If not, see . ## import locale import gettext import os import unicodedata DOMAIN = 'gajim' LANG = 'en' direction_mark = '\u200E' _translations = None def initialize(): global _translations try: locale.setlocale(locale.LC_ALL, '') except locale.Error as error: print(error) initialize_lang() set_i18n_env() localedir = get_locale_dir() if hasattr(locale, 'bindtextdomain'): locale.bindtextdomain(DOMAIN, localedir) gettext.install(DOMAIN, localedir) if gettext._translations: _translations = list(gettext._translations.values())[0] else: _translations = gettext.NullTranslations() def set_i18n_env(): if os.name == 'nt': os.environ['LANG'] = LANG def initialize_lang(): global LANG try: # en_US, fr_FR, el_GR etc.. default = locale.getdefaultlocale()[0] if default is None: # LC_ALL=C return LANG = default[:2] except (ValueError, locale.Error): pass def get_locale_dir(): if os.name == 'nt': return None # try to find domain in localedir path = gettext.find(DOMAIN) if path: # extract localedir from localedir/language/LC_MESSAGES/domain.mo path, tail = os.path.split(path) path, tail = os.path.split(path) localedir, tail = os.path.split(path) elif os.path.exists('/app/share/run-as-flatpak'): # Check if we run as flatpak return '/app/share/locale' else: # fallback to user locale base = os.getenv('XDG_DATA_HOME') if base is None or base[0] != '/': base = os.path.expanduser('~/.local/share') localedir = os.path.join(base, "locale") return localedir def initialize_direction_mark(): from gi.repository import Gtk global direction_mark if Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL: direction_mark = '\u200F' def paragraph_direction_mark(text): """ Determine paragraph writing direction according to http://www.unicode.org/reports/tr9/#The_Paragraph_Level Returns either Unicode LTR mark or RTL mark. """ for char in text: bidi = unicodedata.bidirectional(char) if bidi == 'L': return '\u200E' elif bidi == 'AL' or bidi == 'R': return '\u200F' return '\u200E' def Q_(text): """ Translate the given text, optionally qualified with a special construction, which will help translators to disambiguate between same terms, but in different contexts. When translated text is returned - this rudimentary construction will be stripped off, if it's present. Here is the construction to use: Q_("?vcard:Unknown") Everything between ? and : - is the qualifier to convey the context to the translators. Everything after : - is the text itself. """ text = _(text) if text.startswith('?'): qualifier, text = text.split(':', 1) return text def ngettext(s_sing, s_plural, n, replace_sing=None, replace_plural=None): """ Use as: i18n.ngettext('leave room %s', 'leave rooms %s', len(rooms), 'a', 'a, b, c') In other words this is a hack to ngettext() to support %s %d etc.. """ text = _translations.ngettext(s_sing, s_plural, n) if n == 1 and replace_sing is not None: text = text % replace_sing elif n > 1 and replace_plural is not None: text = text % replace_plural return text initialize()