Как я могу локализовать сгенерированные argparse сообщения переносимым способом? - PullRequest
0 голосов
/ 05 ноября 2018

Контекст:

Я разрабатываю небольшой модуль для автоматического переименования фотографий в каталоге в соответствии с их временной меткой exif (цель: простое смешивание изображений с разных камер или смартфонов). Он работает как пакет Python или напрямую из командной строки через крошечную оболочку, используя argparse.

И у меня только что была (довольно глупая) идея локализовать ее на неанглийском языке. Хорошо, gettext мой друг по всему моему коду, но когда я пришел к agparse сгенерированным сообщениям, я оказался на неаккуратной земле ...

Текущее исследование:

Я уже нашел некоторые ресурсы на SO:

Оба заканчиваются добавлением соответствующих строк из argparse в файл po / mo и позволяют модулю argparse автоматически использовать переведенные строки, потому что внутри он использует оболочку _(...). Пока все хорошо.

Моя проблема:

Мне кажется, что это скорее обходной путь, чем чистое и аккуратное решение, потому что:

  • Я не смог найти слова, рекомендующего это в официальной документации Python
  • Похоже на незавершенную работу : реализовано не документировано, поэтому некоторые строки могут измениться в будущем выпуске Python (или я что-то упустил?)

Текущий код:

parser = argparse.ArgumentParser(
    prog = prog,
    description="Rename pictures according to their exif timestamp")
parser.add_argument("-v", "--version", action="version",
                    version="%(prog)s " + __version__)
parser.add_argument("--folder", "-f", default = ".",
                    help = "folder containing files to rename")
parser.add_argument("-s", "--src_mask", default="DSCF*.jpg",
                    help = "pattern to select the files to rename")
parser.add_argument("-d", "--dst_mask", default="%Y%m%d_%H%M%S",
                    help = "format for the new file name")
parser.add_argument("-e", "--ext", default=".jpg", dest="ext_mask",
                    help = "extension for the new file name")
parser.add_argument("-r", "--ref_file", default="names.log",
                    help = "a file to remember the old names")
parser.add_argument("-D", "--debug", action="store_true",
                    help = "print a line per rename")
parser.add_argument("-X", "--dry_run", action="store_true", dest="dummy",
                    help = "process normally except no rename occurs")

# subcommands configuration (rename, back, merge)
subparser = parser.add_subparsers(dest='subcommand', help="sub-commands")
ren = subparser.add_parser("rename", help=
                           "rename files by using their exif timestamp")
ren.add_argument("files", nargs="*",
                  help = "files to process (default: src_mask)")
back = subparser.add_parser("back",
                            help="rename files back to their original name")
back.add_argument("files", nargs="*",
                   help = "files to process (default: content of ref_file)")
merge = subparser.add_parser("merge",
                             help="merge files from a different folder")
merge.add_argument("src_folder", metavar="folder",
                    help = "folder from where merge picture files")
merge.add_argument("files", nargs="*",
                  help = "files to process (default: src_mask)")

Я знаю, как обернуть мои собственные строки с помощью _(), и, возможно, у меня могли бы быть приемлемые переводы для сообщений using и help , но существует множество сообщений об ошибках, когда пользователь дает неправильный синтаксис, и я хотел бы предотвратить сообщения об ошибках на английском языке в середине франкоязычной программы ...

Вопрос:

Есть ли какая-либо гарантия того, что реализация строк в модуле argparse не изменится, или существует более надежный / переносимый способ предоставления переводов для его сообщений?

1 Ответ

0 голосов
/ 08 ноября 2018

После еще нескольких исследований и замечательных комментариев @ hpaulj я могу подтвердить:

  • локализуемые сообщения от argparse совместимы с версией 3.3 до текущей версии (старые сообщения никогда не менялись, но новые сообщения добавлялись для новых функций)
  • вышеупомянутое неверно до 3.3
  • Есть небольшие различия в 2,7

Это означает, что здесь возможны только 2 пути:

  • принять риск и предоставить перевод для текущей версии, который будет принимать любую версию Python> = 3.3 - риск состоит в том, что будущая версия нарушит перевод или добавит новые (непереведенные) сообщения. Больше сказать нечего, потому что здесь явно используются подробности реализации модуля
  • не использовать вообще модуль argparse и создавать собственный анализатор на основе getopt. Это, вероятно, приемлемый вариант для простых случаев использования, которые не требуют полной мощности argparse

Ни один из них не очень хорош, но я не могу представить лучшего ...

Я попытаюсь настроить проект на github или gitlab, предоставив файл pot и французский перевод для текущего argparse, и сделаю его доступным в PyPI. Если он когда-либо будет существовать, я добавлю сюда ссылки на него и буду рад включить в него другие языки.


Бета-версия проекта, предоставляющего перевод на французский язык для модуля argparse, в настоящее время доступна на GitHUB

Я называю это бета, потому что в настоящее время он не был тщательно протестирован, но его можно использовать либо напрямую, либо в качестве примера того, что можно сделать. Двоичное колесо содержит небольшой порядковый номер mo-файла, но исходный дистрибутив позволяет автоматически генерировать mo-файл на целевой системе без дополнительной зависимости, включая копию файла msgfmt.py из Tools i18n из CPython.

...