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の設定を終えコマンドを走らせました。

python manage.py makemessages -l ja

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

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

まず最初に正解から

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

RUN apt-get install -y gettext libgettextpo-dev

エラーの内容は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作成コマンドが違うのかと思い [ django-admin makemessages -l 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の例が多かったです。
そのため、下のようなインストール方法がよく出てきました。

# brewを使うためにHomebrewをインストール
/usr/bin/Ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#brewコマンドでインストール
brew install gettext
#シンボリックリンク作成
brew link gettext --force

でもね、環境違うのよ。

python-gettextって何者?

pip install 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でインストールできなかった理由

RUN apt-get install -y gettext

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

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

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

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

RUN apt-get install -y gettext libgettextpo-dev

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

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

RUN apt-get update \
  && apt-get install -y python3-dev default-libmysqlclient-dev build-essential \
  && apt-get install -y gettext libgettextpo-dev

現在のDockerfile

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

FROM python:3.9-buster

# ユーザーを作成
ARG UID=1000
RUN useradd -m -u ${UID} ユーザー名

# 作成したユーザーに切り替える
#USER ${UID}

RUN mkdir /code
WORKDIR /code

ADD requirements.txt /code/
RUN pip install --upgrade pip \
    && pip install -r requirements.txt

ADD . /code/

RUN apt update; apt -y upgrade \
  && apt-get install -y vim \
  && apt install -y gnupg \
  && wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
  && apt install -y ./google-chrome-stable_current_amd64.deb \
  && apt clean \
  && rm -rf /var/lib/apt/lists/ \
  && rm google-chrome-stable_current_amd64.deb \
  && apt-get install -y gettext libgettextpo-dev

RUN pip install selenium chromedriver-binary~=$(/usr/bin/google-chrome --version | perl -pe 's/([^0-9]+)([0-9]+\.[0-9]+).+/$2/g') \
  && pip install django-allauth

まとめ

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

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

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。