質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

646閲覧

djangoでバリデーションメッセージを日本語化したい

t_makino

総合スコア22

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/05/15 05:20

編集2023/05/15 21:59

実現したいこと

djangoでバリデーションメッセージを日本語化したいです。

前提

Pythonバージョン:3.11.3
Dyangoバージョン:4.2
※venv上で仮想サーバーを起動し(runserver)動作確認をしています。

発生している問題・エラーメッセージ

バリデーションメッセージが英語のまま出力されます。

該当のソースコード

現在Djangoの動作確認のため、テスト用のサイトを作成しています。
そのうち、今回の事例に関連する部分は下記になります。

poll.views.IndexView.py

Django

1from django.shortcuts import render 2from django.views.generic import View 3import logging 4 5class IndexView(View): 6 def get(self,request): 7 params = dict(request.GET) 8 serializer = PollsSerializer(data=params); 9 logger = logging.getLogger('django') 10 if (serializer.is_valid() == False): 11 logger.info(serializer.errors) 12 13 return render(request,"polls/index.html",params)
polls.serializers.PollsSerializers.py

Django

1from rest_framework import serializers 2 3class PollsSerializer(serializers.Serializer): 4 test_param_1 = serializers.CharField( 5 required=True, 6 )

現状

loclahost:8000?test_param_1=2222にアクセスしてみましたが、ログには英語のメッセージ(Not a valid string)しか表示されません。

表示されたメッセージ

app.log

1[INFO] 2023-05-15 13:05:20,081 django.get:23 {'test_param_1': [INFO] 2023-05-15 14:08:17,218 django.get:13 {'test_param_1': [ErrorDetail(string='Not a valid string.', code='invalid')]}

しかし、パラメータを渡さず、localhost:8000にアクセスすると、日本語のログが表示されます。

app.log

1[INFO] 2023-05-15 14:07:57,639 django.get:13 {'test_param_1': [ErrorDetail(string='このフィールドは必須です。', code='required')]}

確認したところ,「このフィールドは必須です。」のメッセージは、venv以下のフォルダに存在することが
おりますが、settings.pyはプロジェクトフォルダ上の国際化ファイルを見るように設定しているので、その設定が効いていないことはわかるのですが、どうすれば効くようになるのかをご享受願いたいです。

試したこと

1.settings.pyに国際化の設定をおこないました。

project/settings.py

Django

1from django.utils.translation import gettext_lazy as _ 2#------------------------------------------- 3# ミドルウェア 4#------------------------------------------- 5MIDDLEWARE = [ 6 'django.middleware.security.SecurityMiddleware', 7 'django.contrib.sessions.middleware.SessionMiddleware', 8 'django.middleware.locale.LocaleMiddleware', # 国際化のため追加 9 'django.middleware.common.CommonMiddleware', 10 'django.middleware.csrf.CsrfViewMiddleware', 11 'django.contrib.auth.middleware.AuthenticationMiddleware', 12 'django.contrib.messages.middleware.MessageMiddleware', 13 'django.middleware.clickjacking.XFrameOptionsMiddleware', 14] 15 16#------------------------------------------- 17# 国際化 18#------------------------------------------- 19LANGUAGE_CODE = 'ja' 20 21TIME_ZONE = 'Asia/Tokyo' 22 23USE_I18N = True 24 25USE_TZ = True 26 27LANGUAGES = ( 28 ('ja', _('Japanese')), 29 ('en', _('English')), 30) 31 32LOCALE_PATHS = ( 33 os.path.join(BASE_DIR, 'locale'), 34) 35

2.プロジェクトフォルダ直下にlocaleフォルダを作成、managedmakemessage -l jaで下記の言語ファイルを作成し、項目を追加後 django-admin compilemessages -l jaで.moファイルを生成しました。

project/locale/LC_MESSAGES/django.po

Django

1# SOME DESCRIPTIVE TITLE. 2# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3# This file is distributed under the same license as the PACKAGE package. 4# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. 5# 6#, fuzzy 7msgid "" 8msgstr "" 9"Project-Id-Version: PACKAGE VERSION\n" 10"Report-Msgid-Bugs-To: \n" 11"POT-Creation-Date: 2023-05-15 13:32+0900\n" 12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 14"Language-Team: LANGUAGE <LL@li.org>\n" 15"MIME-Version: 1.0\n" 16"Content-Type: text/plain; charset=UTF-8\n" 17"Content-Transfer-Encoding: 8bit\n" 18"Plural-Forms: nplurals=1; plural=0;\n" 19#: .\settings.py:126 20msgid "Japanese" 21msgstr "" 22 23#: .\settings.py:127 24msgid "English" 25msgstr "" 26 27msgid "Not a valid string." 28msgstr "文字列ではありません。" 29 30msgid "invalid" 31msgstr "文字列ではありません。"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

settings.pyのLOCALE_PATHSの設定が誤っていたようです。

BASE_DIRはデフォルトのものをしようしていたのですが、

BASE_DIR = Path(file).resolve().parent.parent

これは全体のルートパスを意味するようなので、settings.pyのLOCALE_PATHをプロジェクトフォルダに修正
したところ、正常に翻訳されるようになりました。

project/settings.py(修正前)

Django

1LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]
project/settings.py(修正後)

Django

1LOCALE_PATHS = [os.path.join(BASE_DIR, 'project', 'locale')]
修正後のログ

[INFO] 2023-05-16 08:32:05,517 django.get:13 {'test_param_1': [ErrorDetail(string='文字列が不正です。', code='invalid')]}

投稿2023/05/15 23:40

t_makino

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問