Сделать приложение автоматически определять язык системы
Что должно делать приложение, разработанное в системе Linux, например Ubuntu, для автоматического определения языка системы? Существуют приложения, такие как Liferea, которые автоматически меняют свой язык в соответствии с языком системы, не изменяя предпочтения самой программы: Должно ли это быть поведением по умолчанию для всех программ?
Должна ли в программе быть опция, позволяющая пользователю выбирать язык?
Все эти переводы идут вместе с самой программой? Что если пользователь установил системный язык, недоступный в переводах программы?
Это Ubuntu или большинство Linux-дистрибутивов?
2 ответа
Я знаю, что разработка приложений с помощью Quickly и Launchpad поддерживает Translations для этого. Я не эксперт, поэтому проверьте эти ссылки в дополнение к моему ответу:
http://www.gnu.org/software/gettext/
https://help.launchpad.net/Translations
Мое приложение импортирует модуль gettext, который позволяет мне отмечать строки, которые будут отображаться пользователю в программе. Когда моя программа отправляется на Launchpad через Quickly, Launchpad настроен на автоматическое сканирование исходного кода и создание специальных файлов шаблонов перевода для помеченных строк. Добрые пользователи Launchpad (или разработчик) могут затем использовать шаблон для генерации переводов для каждой строки и языка, которые они хотят. Эти файлы перевода затем могут быть синхронизированы с вашей исходной веткой и объединены перед выпуском. Во время выполнения модуль gettext затем заменяет помеченные строки соответствующим переводом в зависимости от языкового стандарта вашей системы.
Подводя итог, вот список процесса:
- импортировать gettext в вашу программу
- Отметьте строки, которые нужно перевести
- Настройка переводов в Launchpad
- Перевести шаблоны и синхронизировать с источником
Вот заголовок моей программы, куда я импортирую gettext через локаль (обратите внимание, что Quickly добавляет все это для меня! Локаль и bindtextdomain добавлены, потому что они помещаются в /opt/extras.ubuntu.com, я думаю):
import locale
from locale import gettext as _
locale.bindtextdomain('drawers', '/opt/extras.ubuntu.com/drawers/share/locale')
locale.textdomain('drawers')
Теперь я просто отмечаю текст для перевода _("text to be translated")
на протяжении всей моей программы.
В будущем, даже если они связаны между собой, я бы предложил открыть отдельные вопросы для каждого. В любом случае, я постараюсь ответить на них:
Что должно делать приложение, разработанное в системе Linux, например Ubuntu, для автоматического определения языка системы?
Вам просто нужно инициализировать gettext
в вашем приложении. Gettext - это стандартная технология интернационализации и локализации Ubuntu и подавляющее большинство других дистрибутивов на основе Linux (если мы рассмотрим Android как дистрибутив, то это будет единственное исключение).
В самом простом случае и с использованием Python
import gettext
from gettext import gettext as _
locale.bindtextdomain('yourapp', '/usr/share/locale')
locale.textdomain('yourapp')
Заметки:
- В Python, чтобы поддержать
/opt
установка вам нужно использоватьlocale
библиотека вместоgettext
(для большинства практических целей они эквивалентны) - Есть привязки gettext практически для любого языка программирования, не только для Python.
Должно ли это быть поведением по умолчанию для всех программ?
Да.
Должна ли в программе быть опция, позволяющая пользователю выбирать язык?
Нет. Если вы хотите иметь такую возможность, вы сами по себе и должны будете реализовать ее самостоятельно. Соглашение состоит в том, что для каждого пользователя существует только один язык, и вы изменяете его только в одном месте, затрагивая все приложения в системе.
Все эти переводы идут вместе с самой программой?
Да, они поставляются вместе с приложением в двоичном виде .mo
файлы, по одному на каждый язык переведены.
Что если пользователь установил системный язык, недоступный в переводах программы?
Тогда по умолчанию для gettext используется английский как запасной вариант.
Это Ubuntu или большинство Linux-дистрибутивов?
Это стандартное поведение для дистрибутивов Linux.