Как заставить gettext работать с русским языком в Python?

Всем доброго дня!
Пытаюсь выполнить перевод для CLI Python 3 программы с русского языка на английский с помощью gettext. Большинство строк в коде либо на русском, либо русский + английский. Файл исходного кода имеет кодировку UTF-8. Импортировал модуль, разметил строки, но когда пытаюсь сгенерировать файл .pot возникает ошибка с указанием на кодировку cp1552. Ниже команда, которую использую для генерации .pot и текст получаемой ошибки:

python pygettext.py -d base -o base.pot C:\Users\username\PycharmProjects\test\main.py
Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Programs\Python\Python311\Tools\i18n\pygettext.py", line 680, in <module>
    main()
  File "C:\Users\username\AppData\Local\Programs\Python\Python311\Tools\i18n\pygettext.py", line 673, in main
    eater.write(fp)
  File "C:\Users\username\AppData\Local\Programs\Python\Python311\Tools\i18n\pygettext.py", line 514, in write
    print('msgid', normalize(k, encoding), file=fp)
  File "C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-4: character maps to <undefined>

Если кто-то сталкивался с подобной ошибкой буду рад получить совет/краткое объяснение для её устранения.

Пример кода где возникает описанная проблема:

import gettext

_ = gettext.gettext

if __name__ == "__main__":
    print(_("тест"))

Ответы (1 шт):

Автор решения: Сергей Кох

Ошибка с кодировкой возникает при переименовании pot файла. Если просто извлечь все строки с помощью опции -a, --extract-all в файл с именем по умолчанию messages.pot, то все ок:

(venv) PS C:\Users\ф\PycharmProjects\imagerec>  python C:\Users\ф\AppData\Local\Programs\Python\Python311\Tools\i18n\pygettext.py --extract-all 
ppp.py

Файл messages.pot

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2024-02-18 23:51+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=cp1251\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"


#: ppp.py:7
msgid "тест"
msgstr ""

Почему кодировка файла изменяется при переименовании я не знаю. Я не понял, почему вы используете две синонимичные, почти, опции -d и -o читайте, но применение любой из них вызывает ошибку кодировки. И еще видно, что файл pot получается в кодировке cp1251 на винде.

→ Ссылка