2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flask Paginateでページネーション情報を日本語化する

Posted at

概要

Flaskでページネーションを実現する方法としてFlask-Paginateを使う方法があります。とても便利なのですが、デフォルトだと英語対応なので、日本語化する手順を紹介します。ドキュメントを読んでもわからなかったため、ソースコードを読みました。

一応、Flask-Paginateのミニマムな使用例にもなっています。
記事では部分的なコードしか書いていないので、全体を把握したかったり、手元で実行したい場合は、GitHubに置いてあります。

検証環境

  • Python 3.8.12
  • Flask 2.0.2
  • Flask Paginate 2021.10.29
  • Bootstrap 5.0.0 と 4.3.1

解決したい問題

app.py
from flask import Flask, render_template, request
from flask_paginate import Pagination, get_page_parameter
app = Flask(__name__)

@app.route('/')
def index():
    page = request.args.get(get_page_parameter(), type=int, default=1)
    limit = 5

    # DBアクセスのつもり
    users = search_users(page=page, limit=limit)
    user_count = count_users()

    pagination = Pagination(page=page, per_page=limit, total=user_count, record_name='users', css_framework='bootstrap5')

    return render_template('index.html', users=users, pagination=pagination)
templates/index.html
    {{ pagination.info }}
    <table class="table">
      {% for user in users %}
        <tr>
          <td>{{ user }}</td>
        </tr>
      {% endfor %}
    </table>
    {{ pagination.links }}

スクリーンショット 2021-11-15 2.53.59.png

infoプロパティで表示できるページの情報displaying 1 - 5 users in total 103を日本語にしたいです。しかし、infoはメソッドではないので、引数で表示形式を変えるなどができません。

infoのバリエーションとしてもう一つ、search=Trueとすると検索結果風にもできます。これは謎ですが、totalfoundは両方指定する必要があります。

app.py
pagination = Pagination(page=page, per_page=limit, search=True, total=user_count, found=user_count, record_name='users', css_framework='bootstrap5')

スクリーンショット 2021-11-15 2.05.03.png

でも、やっぱり英語です。

日本語化

display_msgにpythonのフォーマット文字列として直接HTMLを指定できます。

app.py
    pagination = Pagination(
        page=page,
        per_page=limit,
        total=user_count,
        display_msg='<b>{total}</b> {record_name}中の <b>{start} - {end}</b> {record_name}',
        record_name='ユーザー',
        css_framework='bootstrap5',
    )

スクリーンショット 2021-11-15 1.30.27.png

そう!これがやりたかった。

ちなみに、デフォルトがどうなっているのかはFlask Paginateのソースコードを見るとわかります。

__init__.py
DISPLAY_MSG = "displaying <b>{start} - {end}</b> {record_name} in \
total <b>{total}</b>"

https://github.com/lixxu/flask-paginate/blob/v2021.10.29/flask_paginate/__init__.py#L185-L186

ページネーション部分の日本語化

ここまで触れませんでしたが、ページネーション部分はBootstrap 5を利用しています。Paginationの引数部分でcss_framework='bootstrap5'として、htmlのheadタグにもBootstrap5へのリンクを埋め込んでいます。

問題はcss_framework='bootstrap4'を指定したいときです。css_frameworkを指定しなかったときのデフォルトでもあります。

スクリーンショット 2021-11-15 3.12.39.png

なんと!英語が現れました。これくらいであれば、日本語のページにあってもそこまで違和感ないですが、変更ができません。

解決策としては、css_framework='bootstrap5'を指定します(強引)。手元では、Bootstrap 4.3.1を実際に使っていてもちゃんと表示されました。

参考

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?