You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
7.8 KiB
210 lines
7.8 KiB
#!/usr/bin/python3 -OO
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright 2011-2018 The SABnzbd-Team <team@sabnzbd.org>
|
|
#
|
|
# This program 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; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program 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 this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
"""
|
|
sabnzbd.lang - Language support
|
|
"""
|
|
|
|
# This module should be the first non-standard import to
|
|
# be done at the top of the application's main file.
|
|
# This will ensure that the default language is available
|
|
# and the special functions are active.
|
|
#
|
|
# Required keywords for pygettext.py: -k T -k Ta -k TT
|
|
#
|
|
# The following pseudo-builtins are provided.
|
|
# T() Unicode translation
|
|
# Ta() Latin-1 translation
|
|
# Tx() Unicode translation of an expression (not a literal string)
|
|
# TT() Dummy translation, use to mark table entries for POT scanning
|
|
|
|
|
|
import gettext
|
|
import builtins
|
|
import glob
|
|
import os
|
|
import operator
|
|
import locale
|
|
# This module cannot import any application modules!!
|
|
|
|
__all__ = ['set_locale_info', 'set_language', 'list_languages']
|
|
|
|
_DOMAIN = '' # Holds translation domain
|
|
_LOCALEDIR = '' # Holds path to the translation base folder
|
|
CODEPAGE = '1252'
|
|
|
|
|
|
def set_locale_info(domain, localedir):
|
|
""" Setup the domain and localedir for translations """
|
|
global _DOMAIN, _LOCALEDIR
|
|
_DOMAIN = domain
|
|
_LOCALEDIR = localedir
|
|
|
|
|
|
def set_language(language=None):
|
|
""" Activate language, empty language will set default texts. """
|
|
global CODEPAGE
|
|
if not language:
|
|
language = ''
|
|
CODEPAGE = str(LanguageTable.get(language, (0, 0, 0))[2] or 1252)
|
|
|
|
# 'codeset' will determine the output of lgettext
|
|
lng = gettext.translation(_DOMAIN, _LOCALEDIR, [language], fallback=True, codeset='latin-1')
|
|
|
|
# The unicode flag will make _() return Unicode
|
|
lng.install(names=['lgettext'])
|
|
builtins.__dict__['T'] = builtins.__dict__['_'] # Unicode
|
|
builtins.__dict__['Ta'] = builtins.__dict__['_'] # Unicode (Used to Latin-1, compatibility support)
|
|
builtins.__dict__['Tx'] = builtins.__dict__['_'] # Dynamic translation (unicode)
|
|
builtins.__dict__['TT'] = lambda x: str(x) # Use in text tables
|
|
|
|
|
|
def list_languages():
|
|
""" Return sorted list of (lang-code, lang-string) pairs,
|
|
representing the available languages.
|
|
When any language file is found, the default tuple ('en', 'English')
|
|
will be included. Otherwise an empty list is returned.
|
|
"""
|
|
# Findst find all the MO files.
|
|
# Each folder should also contain a dummy text file giving the language
|
|
# Example:
|
|
# <localedir>/nl/LC_MESSAGES/SABnzbd.mo
|
|
# <localedir>/nl/LC_MESSAGES/Nederlands
|
|
|
|
lst = []
|
|
for path in glob.glob(os.path.join(_LOCALEDIR, '*')):
|
|
if os.path.isdir(path) and not path.endswith('en'):
|
|
lngname = os.path.basename(path)
|
|
lng = locale.normalize(lngname)
|
|
# Example: 'pt_BR.ISO8859-1'
|
|
lng_short = lng[:lng.find('_')]
|
|
lng_full = lng[:lng.find('.')]
|
|
# First try full language string, e.g. 'pt_BR'
|
|
language = LanguageTable.get(lng_full, (lng_full, lng_full))
|
|
if language[0] == lng_full:
|
|
# Full language string not defined: try short form, e.g. 'pt'
|
|
language = LanguageTable.get(lng_short, (lng_short, lng_short))
|
|
lng = lng_short
|
|
else:
|
|
lng = lng_full
|
|
language = language[1]
|
|
lst.append((lng, language))
|
|
if lst:
|
|
lst.append(('en', 'English'))
|
|
return sorted(lst, key=operator.itemgetter(1))
|
|
else:
|
|
return lst
|
|
|
|
|
|
LanguageTable = {
|
|
'aa': ('Afar', 'Afaraf', 0),
|
|
'af': ('Afrikaans', 'Afrikaans', 0),
|
|
'ak': ('Akan', 'Akan', 0),
|
|
'sq': ('Albanian', 'Shqip', 0),
|
|
'an': ('Aragonese', 'Aragonés', 0),
|
|
'ae': ('Avestan', 'Avesta', 0),
|
|
'ay': ('Aymara', 'Aymararu', 0),
|
|
'bm': ('Bambara', 'Bamanankan', 0),
|
|
'eu': ('Basque', 'Euskara', 0),
|
|
'bi': ('Bislama', 'Bislama', 0),
|
|
'bs': ('Bosnian', 'Bosanskijezik', 0),
|
|
'br': ('Breton', 'Brezhoneg', 0),
|
|
'ca': ('Catalan', 'Català', 0),
|
|
'ch': ('Chamorro', 'Chamoru', 0),
|
|
'kw': ('Cornish', 'Kernewek', 0),
|
|
'co': ('Corsican', 'Corsu', 0),
|
|
'hr': ('Croatian', 'Hrvatski', 0),
|
|
'cs': ('Czech', 'Cesky, ceština', 0),
|
|
'da': ('Danish', 'Dansk', 0),
|
|
'nl': ('Dutch', 'Nederlands', 0),
|
|
'en': ('English', 'English', 0),
|
|
'eo': ('Esperanto', 'Esperanto', 0),
|
|
'et': ('Estonian', 'Eesti', 0),
|
|
'fo': ('Faroese', 'Føroyskt', 0),
|
|
'fj': ('Fijian', 'Vosa Vakaviti', 0),
|
|
'fi': ('Finnish', 'Suomi', 0),
|
|
'fr': ('French', 'Français', 0),
|
|
'gl': ('Galician', 'Galego', 0),
|
|
'de': ('German', 'Deutsch', 0),
|
|
'he': ('Hebrew', 'עִבְרִית', 1255),
|
|
'hz': ('Herero', 'Otjiherero', 0),
|
|
'ho': ('Hiri Motu', 'Hiri Motu', 0),
|
|
'hu': ('Hungarian', 'Magyar', 0),
|
|
'id': ('Indonesian', 'Bahasa Indonesia', 0),
|
|
'ga': ('Irish', 'Gaeilge', 0),
|
|
'io': ('Ido', 'Ido', 0),
|
|
'is': ('Icelandic', 'Íslenska', 0),
|
|
'it': ('Italian', 'Italiano', 0),
|
|
'jv': ('Javanese', 'BasaJawa', 0),
|
|
'rw': ('Kinyarwanda', 'Ikinyarwanda', 0),
|
|
'kg': ('Kongo', 'KiKongo', 0),
|
|
'kj': ('Kwanyama', 'Kuanyama', 0),
|
|
'la': ('Latin', 'Lingua latina', 0),
|
|
'lb': ('Luxembourgish', 'Lëtzebuergesch', 0),
|
|
'lg': ('Luganda', 'Luganda', 0),
|
|
'li': ('Limburgish', 'Limburgs', 0),
|
|
'ln': ('Lingala', 'Lingála', 0),
|
|
'lt': ('Lithuanian', 'Lietuviukalba', 0),
|
|
'lv': ('Latvian', 'Latviešuvaloda', 0),
|
|
'gv': ('Manx', 'Gaelg', 0),
|
|
'mg': ('Malagasy', 'Malagasy fiteny', 0),
|
|
'mt': ('Maltese', 'Malti', 0),
|
|
'nb': ('Norwegian Bokmål', 'Norsk bokmål', 0),
|
|
'nn': ('Norwegian Nynorsk', 'Norsk nynorsk', 0),
|
|
'no': ('Norwegian', 'Norsk', 0),
|
|
'oc': ('Occitan', 'Occitan', 0),
|
|
'om': ('Oromo', 'Afaan Oromoo', 0),
|
|
'pl': ('Polish', 'Polski', 0),
|
|
'pt': ('Portuguese', 'Português', 0),
|
|
'pt_BR': ('Portuguese Brazillian', 'Português Brasileiro', 0),
|
|
'rm': ('Romansh', 'Rumantsch grischun', 0),
|
|
'rn': ('Kirundi', 'kiRundi', 0),
|
|
'ro': ('Romanian', 'Româna', 1250),
|
|
'sc': ('Sardinian', 'Sardu', 0),
|
|
'se': ('Northern Sami', 'Davvisámegiella', 0),
|
|
'sm': ('Samoan', 'Gagana fa\'a Samoa', 0),
|
|
'gd': ('Gaelic', 'Gàidhlig', 0),
|
|
'ru': ('Russian', 'русский язык', 1251),
|
|
'sr': ('Serbian', 'српски', 1251),
|
|
'sn': ('Shona', 'Chi Shona', 0),
|
|
'sk': ('Slovak', 'Slovencina', 0),
|
|
'sl': ('Slovene', 'Slovenšcina', 0),
|
|
'st': ('Southern Sotho', 'Sesotho', 0),
|
|
'es': ('Spanish Castilian', 'Español, castellano', 0),
|
|
'su': ('Sundanese', 'Basa Sunda', 0),
|
|
'sw': ('Swahili', 'Kiswahili', 0),
|
|
'ss': ('Swati', 'SiSwati', 0),
|
|
'sv': ('Swedish', 'Svenska', 0),
|
|
'tn': ('Tswana', 'Setswana', 0),
|
|
'to': ('Tonga (Tonga Islands)', 'faka Tonga', 0),
|
|
'tr': ('Turkish', 'Türkçe', 0),
|
|
'ts': ('Tsonga', 'Xitsonga', 0),
|
|
'tw': ('Twi', 'Twi', 0),
|
|
'ty': ('Tahitian', 'Reo Tahiti', 0),
|
|
'wa': ('Walloon', 'Walon', 0),
|
|
'cy': ('Welsh', 'Cymraeg', 0),
|
|
'wo': ('Wolof', 'Wollof', 0),
|
|
'fy': ('Western Frisian', 'Frysk', 0),
|
|
'xh': ('Xhosa', 'isi Xhosa', 0),
|
|
'yo': ('Yoruba', 'Yorùbá', 0),
|
|
'zu': ('Zulu', 'isi Zulu', 0),
|
|
'zh_CN': ('SimpChinese', '简体中文', 936),
|
|
}
|
|
|
|
# Setup a safe null-translation
|
|
set_language()
|
|
|