Python:Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.

Python:Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.

Django:Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.

多言語化のためのsettings.pyの設定を終えコマンドを走らせました。

このコマンドで【/locale/ja/LC_MESSAGES/django.po】が作成されるはずでしたがエラーが返ってきました。
ちなみに、環境はこんな感じです。

  • OS:CentOS8
  • Dockerにて 【 python:3.9 】イメージを利用

まず最初に正解から

私の場合はDockerfile に下のコードを追加しビルドして解決しました。

エラーの内容はgettextのプログラムがないと言う事

Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.
翻訳:msguniqが見つかりません。GNU gettext tools 0.15 以降がインストールされていることを確認してください。

上記エラーはgettextが存在しない為に発生しています。存在しないといわれる時に考えられることは2つです。

私の環境ではそのままその通り『gettextが存在しない』事が原因でエラーが発生していました。
しかし『gettextへパスが通っていない』場合も同じメッセージが出てくるので注意が必要です。

四苦八苦したgettextのインストール

苦戦の状況は下の通りです。

  1. gettext とpython-gettext は同じものだと思い python-gettext をインストールして解決せず
  2. django.po作成コマンドが違うのかと思い [ djangoadmin makemessagesl ja ]として実行。結果変わらず
  3. Dockerfileに [ apt-get install -y gettext ] を書き加え再ビルド。Package ‘gettext’ has no installation candidateと撥ねられる
  4. Dockerfile で python:3.9-buster 使えば入ってないかと期待し実行。結果gettextは存在せず
  5. パッケージ指定してみようと再度探すが対応パッケージがどれかわからず断念
  6. gettext libgettextpo-devで取れるという情報に行き当たり実行。やっとコンテナが起動する。
  7. [ django-admin makemessages -l ja ] を実行。locale\ja 作成に成功。

ググって先頭の方に出てくる情報はMacOSの例が多かったです。
そのため、下のようなインストール方法がよく出てきました。

でもね、環境違うのよ。

python-gettextって何者?

こんなコマンドでインストールできるので「環境構築は簡単」と思っていたら…どうやら終わったプロジェクトの様です。
公式ページ(?)抜粋

Project description
Overview

This implementation of Gettext for Python includes a Msgfmt class which can be used to generate compiled mo files from Gettext po files and includes support for the newer msgctxt keyword.The idea for this project had been rather ambitious, but never lived up to what is was supposed to do. Look at Babel (http://pypi.python.org/pypi/Babel) for a project more worthy of this projects name.

Development takes place at https://github.com/hannosch/python-gettext


【翻訳】プロジェクトの説明概要概要このGettextfor Pythonの実装には、Gettext poファイルからコンパイルされたmoファイルを生成するために使用できるMsgfmtクラスが含まれており、新しいmsgctxtキーワードのサポートが含まれています。

このプロジェクトのアイデアはかなり野心的でしたが、本来の目的を果たせませんでした。このプロジェクト名にふさわしいプロジェクトについては、Babel(http://pypi.python.org/pypi/Babel)を参照してください。
開発はhttps://github.com/hannosch/python-gettextで行われます

『本来の目的を果たせませんでした』って…。
はい、こいつは不要です。
python-gettextインストール後に「なんでできない」って足掻いていたのですが全てが無駄だったようです。

apt-get install -y gettextでインストールできなかった理由

Dockerfile にこんなコマンドを書いたところ、下のようなエラーが出てきました。

E: Package ‘gettext’ has no installation candidate
gettext’ パッケージにはインストール候補がありません

「インストールはどのパッケージがいいの?」って事ですよね。

これに対して指定すべきバージョンを探していたのですが、依存関係などよくわからずインストールに失敗してしまいました。そんな時に見つけたのが次のコマンドです。

何をしているかよくわかってないですけど【-dev】だからDeveloper用ってことなんでしょうか。
まぁ、DockerのPythonイメージにGettext入れようとした場合、このコマンドで走れます。

単独で動かなかった場合は[ apt-get update ] と合わせて下のように書いてみましょう。

現在のDockerfile

今回の事案を受け、Dockerfileはこんな感じになりました。

まとめ

最初に出てきたErrorを見て「わかったよ。GNU gettext toolsをインストールすればいいのね。」と簡単に考えていたのですが解決まで1時間。

こういうのは備忘録書いとかなきゃね。