Список доступных языков для строк пользовательского интерфейса PyGTK

Я очищаю некоторые настройки локализации и перевода в нашем приложении PyGTK. Приложение предназначено для использования только в системах GNU/Linux. Одной из функций, которую мы хотим, является то, что пользователи могут выбирать язык, используемый для приложений (некоторые предпочитают свой родной язык, некоторые предпочитают английский для единообразия, некоторым нравится французский, потому что он звучит романтично и т. д.).

Чтобы это работало, мне нужно показать поле со списком с различными доступными языками. Как я могу получить этот список? На самом деле мне нужен список пар кода языка ("en", "ru" и т.д.) и названия языка на родном языке ("Английский (США)", "Русские" ).

Если бы мне пришлось реализовать метод грубой силы, я бы сделал что-то вроде: посмотрел в каталоге локали системы (например, "/usr/share/locale") все каталоги кода языка (например, "en/"), содержащие относительный путь "LC_MESSAGES/OurAppName.mo".

Есть ли более программный способ?


person detly    schedule 23.05.2010    source источник


Ответы (2)


Вы можете использовать gettext, чтобы узнать, доступен ли и установлен ли перевод, но вам нужен babel (который был доступен в моей системе Ubuntu как пакет python-pybabel), чтобы получить имена. Вот фрагмент кода, который возвращает нужный вам список:

import gettext
import babel

messagefiles = gettext.find('OurAppName', 
    languages=babel.Locale('en').languages.keys(),
    all=True)
messagefiles.sort()

languages = [path.split('/')[-3] for path in messagefiles]
langlist = zip(languages, 
    [babel.Locale.parse(lang).display_name for lang in languages])

print langlist

Чтобы изменить языки в середине вашей программы, см. соответствующий раздел документации Python. Это, вероятно, влечет за собой реконструкцию всех ваших виджетов GTK, хотя я не уверен.

Чтобы получить дополнительную информацию о gettext.find, перейдите по ссылке на нее.

person ptomato    schedule 26.05.2010
comment
Я не знал ни о методе gettext.find(...), ни о пакете babel — отлично! Я попробую это в ближайшее время. - person detly; 26.05.2010
comment
Довольно прилично, но не онлайн — они устанавливаются вместе с пакетом. - person ptomato; 27.05.2010

Вот функция, вдохновленная gettext.find, но она смотрит, какие файлы существуют, а не список языков из Babel. Он возвращает коды локалей, вам все равно придется использовать babel, чтобы получить display_name для каждого.

def available_langs(self, domain=None, localedir=None):
    if domain is None:
        domain = gettext._current_domain
    if localedir is None:
        localedir = gettext._default_localedir
    files = glob(os.path.join(localedir, '*', 'LC_MESSAGES', '%s.mo' % domain))
    langs = [file.split(os.path.sep)[-3] for file in files]
    return langs
person Dave Brondsema    schedule 22.04.2011