サイトアイコン アマチュア無線局JS2IIU

【Streamlit】Streamlitアプリの国際化(多言語対応)

Streamlit、アプリの国際化対応

こんにちは、JS2IIUです。
多言語対応についてはブラウザの機能でユーザ側が翻訳する方法が手っ取り早く、制作側は何も用意しなくても良いというメリットがありますが、内容によってはおかしな翻訳になってしまうこともあります。今回は多言語対応を制作側で準備する方法についてみていきます。今回もよろしくお願いします。

はじめに

WebアプリやGUIアプリを作成する際、ユーザーに合わせて複数の言語に対応(=国際化/i18n)することはとても重要です。たとえば、日本語・英語などを切り替えられることで、より多くのユーザーに使ってもらえるアプリになります。

この記事では、PythonのStreamlitで作るアプリを多言語対応にする方法を、初心者向けにやさしく解説します。具体的な事例を通して、実用的な知識を身につけましょう。

1. Streamlitで国際化する方法とは?

国際化の基本的な考え方は以下の3つです。

  1. テキストを辞書化して言語ごとの翻訳を用意する
  2. ユーザーが使いたい言語を選べるようにする
  3. 選ばれた言語に応じて画面上のテキストを切り替える

これをStreamlitでもシンプルな構造で実現できます。

国際化/i18nについて

i18n(Internationalization、国際化)とは、ソフトウェアやアプリケーションを複数の言語や文化圏に対応できるように設計・開発することを指します。「Internationalization」の単語の最初と最後の文字「i」と「n」の間に18文字あることから、略して「i18n」と呼ばれます。
i18nでは、文字の翻訳だけでなく、日付や数値の表記方法、通貨、右から左への文字表示など、地域固有の要素に柔軟に対応することが求められます。i18nを適切に実装することで、世界中のユーザーにとって使いやすいアプリケーションを提供できます。

国際化と地域化 – Wikipedia

2. 翻訳辞書を用意する(日本語・英語)

まずは、表示する文言を辞書形式で用意します。

Python
# translations.py

translations = {
    'en': {
        'title': 'Welcome to the App',
        'greeting': 'Hello!',
        'description': 'This is a multilingual Streamlit application.',
        'input_label': 'Enter your name',
        'output_message': 'Nice to meet you, {name}!'
    },
    'ja': {
        'title': 'アプリへようこそ',
        'greeting': 'こんにちは!',
        'description': 'これは多言語対応のStreamlitアプリです。',
        'input_label': '名前を入力してください',
        'output_message': 'はじめまして、{name}さん!'
    }
}

これは単純なPython辞書です。各言語ごとにキーを用意し、その中に表示する文言を格納しています。

3. 言語選択UIの作成

次に、Streamlitアプリ内で言語を選ぶためのUIを作成します。

Python
# app.py

import streamlit as st
from translations import translations

# 利用可能な言語一覧(キー)
available_languages = {
    '日本語': 'ja',
    'English': 'en'
}

# サイドバーで言語を選ぶ
lang_display = st.sidebar.selectbox("言語を選択 / Choose Language", list(available_languages.keys()))
lang_code = available_languages[lang_display]

# 選択した言語の翻訳辞書
t = translations[lang_code]

これで、ユーザーがサイドバーから言語を選ぶと、対応する翻訳データがtとして取得されます。

4. 選択言語に応じて表示を切り替える

以下は、言語によって表示を切り替えるStreamlitコードの一例です。

Python
st.title(t['title'])
st.subheader(t['greeting'])
st.write(t['description'])

# ユーザーの名前を入力してもらう
name = st.text_input(t['input_label'])

if name:
    st.success(t['output_message'].format(name=name))

これだけで、日本語と英語の切り替えが可能になります。

5. 【応用編】複数ページ対応で共通の言語設定を使う

Streamlitの**複数ページ構成(Multipage App)**でも、選んだ言語を共有するにはst.session_stateを使います。

Python
# サイドバーで選んだ言語をセッションに保持
if 'lang' not in st.session_state:
    st.session_state.lang = 'ja'  # デフォルト言語

# 選択があれば更新
if lang_code != st.session_state.lang:
    st.session_state.lang = lang_code

# セッションから翻訳辞書を取得
t = translations[st.session_state.lang]

このようにしておけば、ページをまたいでも選択した言語が保持され、統一された表示が可能になります。

6. 【応用編】動的テキスト(変数を含む文章)の翻訳

文の中にユーザー名などの変数を含む場合も、f-stringやstr.format()を使えば対応できます。

Python
t['output_message'].format(name=name)

この方法を使うことで、自由度の高い表示ができます。

7. よくある注意点とベストプラクティス

項目内容
ハードコーディング禁止テキストは直接書かず、必ず辞書から取得するようにしましょう。
辞書の管理辞書が大きくなってきたら、JSON形式にして外部ファイルで管理すると便利です。
スプレッドシート連携Googleスプレッドシートなどで翻訳管理 → JSONエクスポートで更新も効率化できます。

8. まとめ

Streamlitでの多言語対応は、辞書の活用言語選択のUIさえしっかり作れば、驚くほど簡単に実現できます。

対応手順のおさらい:

  1. 翻訳辞書を用意する
  2. 言語選択のUIを用意する
  3. 選んだ言語の辞書でテキストを表示する

アプリの国際化に対応することで、世界中のユーザーに届けられるアプリに一歩近づきます!

9. 参考リンク

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了