Список доступных языков для строк интерфейса PyGTK - PullRequest
3 голосов
/ 23 мая 2010

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 мая 2010

Вы можете использовать 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, здесь есть ссылка на это тоже.

1 голос
/ 22 апреля 2011

Вот функция, вдохновленная 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
...