PythonのFlaskで日付・時間・通貨を多言語対応!ローカライズ完全ガイド
生徒
「先生、Webサイトの文字を翻訳する方法は分かりましたが、日付の書き方やお金の表示も国によって違いますよね?これも自動で変えられるんですか?」
先生
「その通りです!日本では『年・月・日』の順ですが、海外では『日・月・年』の順だったりします。これを自動で調整することを『ローカライズ』と呼びます。」
生徒
「ローカライズ……なんだか専門的で難しそうですが、初心者の私でも設定できますか?」
先生
「Flask-Babelという道具を使えば、実はとても簡単に実現できるんですよ。具体的なやり方を見ていきましょう!」
1. ローカライズとは?初心者にもわかりやすく解説
プログラミングの世界でよく聞く「ローカライズ(地域化)」とは、特定の国や地域の習慣に合わせて、情報の見せ方を最適化することを指します。単なる言葉の翻訳(こんにちはをHelloにするなど)だけでなく、その土地の文化に合わせた表示形式に整える作業のことです。
例えば、日付を想像してみてください。日本では「2026年3月26日」と書くのが一般的ですが、アメリカでは「March 26, 2026」、イギリスでは「26 March 2026」のように、並び順が全く異なります。
また、お金の単位(通貨)も重要です。日本なら「円」で、数字の後に単位が来ることが多いですが、アメリカなら「$(ドル)」で、数字の前に記号がつきます。これらを一つずつ手書きで直すのは大変ですが、PythonのFlask-Babelを使えば、システムがアクセスした人の場所を判断して自動的に表示を切り替えてくれるのです。
2. 日付を表示するための基本的な準備
まずは、Pythonのプログラムで日付や時間を扱うための準備をしましょう。Pythonには標準で「datetime(デートタイム)」という、日付と時間を専門に扱う道具が備わっています。
このdatetimeと、多言語化を助けてくれるFlask-Babelを組み合わせて使います。最初に、現在時刻を取得して画面に表示するだけのシンプルなコードを書いてみましょう。
from flask import Flask, render_template
from flask_babel import Babel, format_datetime
from datetime import datetime
app = Flask(__name__)
babel = Babel(app)
@app.route('/date-test')
def date_test():
# 今現在の正確な日時を取得します
now = datetime.now()
# format_datetimeを使うと、設定された言語に合わせた形に変換してくれます
return render_template('index.html', current_time=now)
このコードの中にある「format_datetime」という命令が、ローカライズの魔法の言葉です。これを使うだけで、後の面倒な変換作業はすべてコンピュータが裏側でやってくれます。
3. HTMLファイルでの日付表示の書き方
次に、Webサイトの見た目を作るHTMLファイル側で、どのように日付を表示させるかを確認しましょう。Flaskでは「Jinja2(ジンジャツー)」という仕組みを使って、プログラムから送られたデータを表示します。
HTMLの中では、以下のように二重の波括弧を使ってデータを埋め込みます。
<!DOCTYPE html>
<html>
<head>
<title>日付のローカライズテスト</title>
</head>
<body>
<h1>現在の時刻を表示します</h1>
<p>今日の日時:{{ format_datetime(current_time) }}</p>
</body>
</html>
このように記述しておけば、閲覧している人が日本語設定なら「2026/03/26 13:00」のように表示され、英語設定なら「Mar 26, 2026, 1:00 PM」のように、その国の人にとって自然な形に自動変換されます。
4. 通貨や数値をその国の形式に合わせる方法
日付の次は、お金や数字の表示です。数字の区切り文字も、実は国によって違います。日本では「1,000,000」のように3桁ごとにカンマを打ちますが、ヨーロッパの一部の国ではカンマではなくドット(.)を使ったり、スペースを空けたりすることもあります。
これを適切に表示するためには、Flask-Babelの「format_decimal(フォーマット・デシマル)」や「format_currency(フォーマット・カレンシー)」という機能を使います。
from flask_babel import format_decimal, format_currency
@app.route('/money-test')
def money_test():
price = 1234567.89
# 数値をその国の区切り方で表示します
formatted_number = format_decimal(price)
# 通貨として表示します(JPYは日本円、USDは米ドルの意味です)
formatted_money = format_currency(price, 'JPY')
return f"数字の表示: {formatted_number}, お金の表示: {formatted_money}"
「format_currency」の二つ目の言葉(JPYなど)を変えるだけで、記号の位置や桁区切りを自動で調整してくれるため、通販サイトなどの国際展開には欠かせない機能です。
5. タイムゾーンの設定で時間のズレを防ぐ
多言語サイトを作るときに初心者がハマりやすい落とし穴が「タイムゾーン(時差)」です。サーバーがアメリカにあって、ユーザーが日本にいる場合、そのまま時間を表示すると日本の時間よりも10時間以上遅れて表示されてしまいます。
これを解決するために、Flask-Babelには「ユーザーごとにタイムゾーンを選択する」機能があります。以下の設定を加えることで、ユーザーの居場所に合わせた時刻を表示できるようになります。
# どのタイムゾーンを使うか決めるための設定です
@babel.timezoneselector
def get_timezone():
# 本来はユーザーの設定画面などから取得しますが、
# ここでは例として日本(Asia/Tokyo)を指定します
return 'Asia/Tokyo'
タイムゾーンとは、地球上の地域ごとに決められた標準時刻のことです。これを正しく設定することで、世界中のどこからアクセスしても「その人にとっての今」を正確に表示できるようになります。
6. 複雑な日付フォーマットを自分好みに変更する
自動で表示される形式だけでなく、時には「曜日だけ出したい」「時刻は秒まで出したい」というこだわりが出てくることもありますよね。そんなときは、format_datetimeのオプションを使いましょう。
代表的な形式として「full(フル)」「long(ロング)」「medium(ミディアム)」「short(ショート)」の4段階が用意されています。
# 表示の長さを選ぶことができます
short_date = format_datetime(now, format='short')
full_date = format_datetime(now, format='full')
# 実行結果のイメージ
# short: 26/03/26
# full: 2026年3月26日木曜日 1時38分34秒 日本標準時
これを使い分けることで、スマホの狭い画面では「short」を使い、パソコンの広い画面では「full」を使って詳しく説明する、といった細かい配慮ができるようになります。
7. インストールが必要な関連ライブラリの紹介
Flask-Babelで高度なローカライズを行うためには、「Babel」という大元のライブラリと、時差計算を助けてくれる「pytz(ピーワイティーゼット)」というライブラリも一緒にインストールされていることが望ましいです。
これらは、最初にご紹介したインストールコマンドで一緒に取り込まれることが多いですが、もし動かない場合は以下のコマンドを試してみてください。
pip install Flask-Babel pytz
「pytz」は世界中のタイムゾーン情報をぎっしり詰め込んだ辞書のようなものです。これがあるおかげで、サマータイム(夏時間)がある国の複雑な時間計算も、私たちが頭を悩ませることなく自動で行われます。
8. ローカライズ設定を反映させるためのコツ
設定がうまくいかないとき、よくある原因は「言語の優先順位」です。ブラウザには複数の言語が登録されていることがあるため、アプリ側で「どの言語を一番に優先するか」を明確に決めておく必要があります。
また、開発中は自分のパソコンの時計や、ブラウザの言語設定を一時的に英語に変えてテストしてみることをおすすめします。自分の目で表示が変わるのを確認するのが、一番の学習になります。
多言語化やローカライズは、一度仕組みを作ってしまえば、あとはデータを入れるだけです。最初は面倒に感じるかもしれませんが、世界中のユーザーがあなたのサイトを自分の国の言葉と習慣で利用できるメリットは非常に大きいです。
9. 数値をパーセントや単位付きで表示する応用
最後に、もう少しだけ便利な機能を紹介します。割合(パーセント)の表示も、ローカライズの対象です。日本では「10%」と書きますが、国によっては数字と記号の間にスペースを入れるのがマナーの場所もあります。
from flask_babel import format_percent
@app.route('/percent')
def show_percent():
value = 0.15 # 15パーセントのこと
# その国の習慣に合わせたパーセント表示にします
return format_percent(value)
こうした細かい配慮の積み重ねが、Webサイトの信頼感を生みます。「このサイト、自分の国のことをよく分かっているな」とユーザーに感じてもらえるような、親切なサイト作りを目指しましょう。