i18n対応ではない
簡易的にマルチ言語対応にする、と書いておりますが、力技で日英の二言語表記に対応したのみです。 本格的な国際化 i18n対応ではないので、すいません。
サイト作成の経過まとめ
pythonを始めたので、なんでもpythonでしてみたい!ってことで、まずは基礎体力がありそうなところで、サイトを作ってみようということになり、DjangoかFlaskかで、お手軽っぽいFlaskを採用しました。
サイトの内容は、API経由でjson取得して表示、検索等ができるだけです。
最初はXreaサーバーで公開しました。 pythonをcgiで動作させることになるのですが、このあたりの情報はxrea、python、cgiなどで検索すればたくさんありました。
裏技?でpipをインストールすれば、Flaskはじめ必要なモジュール、requestsやdotenvもインストールできました。 裏技?はget-pip.pyで検索してみてください。
xreaサーバーのpythonのバージョンが3.6のため、matchが使えずif、elif、elseでの書き換えが必要だったりしました。
格安とはいえ有料なのでアクセスの望めないサイトにコストはかけられないので、他サーバーへ移行することにしました。
移行先は、Vercelです。こちらでは、Python runtimeで動作します。 サンプルも用意されているので、開発は簡単に開始できます。 pythonのバージョンは3.12と新しめです。
旧ドメインから新ドメインへサイト移行をSearch Consoleでも実施しました。 本来ならドメインは変更しないほうがよいのですが、xreaで安易に無料提供されたshopドメインを使ってしまったため、他サーバーへ移行となると新ドメインが必要になり、移行作業が必要になったというわけです。
Search Consoleの件もまとめてみたいのですが、状況が具体的に可視できないので、理解が進んでおりません。
まだ移行は終わっていないようなので、旧サイトでのリダイレクトが必要で有料契約を延長したぐらいです。数百円ですけど。
どうなれば移行終了なのかすらわかりません。。。
移行の方法はSearch ConsoleのサイトからGoogleヘルプをみればわかりますので、移行される、移行を余儀なくされる方は、旧サイトのインデックス等を捨ててしまうのはもったいないのでお試しされればと思います。
UIまわりだけでも英語表記に
現在はVercelにデプロイしてサイト運用?中ですが、サイトをカスタマイズする過程で、多言語化が候補になってきました。 APIからのjsonデータは日本語でしか提供されておらず、肝心のコンテンツ部分はまだ日本語のままですが、せめてUIまわりだけでも英語表記にしてみようと思いました。
Flaskにもあたりまえに国際化に対応するべく、あらかじめ環境変数や関数が用意されているようです。
pythonで多言語といえば、gettextあたりが標準?ぽいですが、今回は使いません。
また大規模なグローバルサイトであれば、ロケールごとに言語を切り替えるのだろうと思います。 その場合は、標準モジュールのlocale、getlocaleメソッドを使えば切り替え可能でした。
というのは当初、勘違いをして、getlocaleで自分案件も対応可能と考えてしまい、失敗したからです。 この対応ですと、Vercel展開の場合、言語設定が日本語であっても英語表記となってしまいます。 当然の結果です。
したいことは地域ごとの対応ではなく、ユーザーごとの対応なので、ユーザーの言語設定を推測するには、Flask、werkzeug?が用意してくれているrequest.accept_languagesを使います。 これでユーザーが言語設定に含めている言語が特定?推測できますので、なんとか日英表記を切り替えられるようにできました。
具体的な日英表記の切り替え方法
今回はとりあえず一部のUIまわりだけですので、jinja2のifステートメントを使って切り替えました。
{% if lang() == "j" %} <div>日本語</div> {% else %} <div>英語</div> {% endif %}
lang()はテンプレートで関数が利用可能になるcontext_processorで、メインのindex.pyから渡しています。
@app.context_processor def utility_processor(): def lang(): lang = request.accept_languages.best_match(['en', 'ja'], 'en') if 'ja' not in lang: lang_check = "e" else: lang_check = "j" return lang_check return dict(lang=lang)
このような具合です。
アクセスが微増するとうれしいのですが、ほぼオーガニック検索だよりの強気なので何事もゆっくりです。