1

私はしばらくFlask-babelを掘り下げてきましたurl routingが、単純なblueprint. 縮小版アプリはこちら

私の__ init __.py ファイルで、

app = Flask(__name__)
babel.init_app(app)


@babel.localeselector
def get_locale():
    return g.get('lang_code', 'fr')


from .mod_main import mod_main as main_blueprint
app.register_blueprint(main_blueprint,url_prefix='/<lang_code>')

ブループリントのviews.pyファイル内

@mod_main.url_defaults
def add_language_code(endpoint, values):
    values.setdefault('lang_code', g.lang_code)


@mod_main.url_value_preprocessor
def pull_lang_code(endpoint, values):
    g.lang_code = values.pop('lang_code')


@mod_main.route('/', methods=['GET', 'POST'])
def index():
    return render_template('main/index.html')

に移動する限り、これは完全に正常に機能しますhttp://localhost:5000/frが、(言語なしで) に移動するとhttp://localhost:5000/、404 エラーが発生します。通常 - ブループリントはプレフィックスとして lang_code を想定しているため。

ユーザーが初めてhttp://localhost:5000/(lang なしで) に移動したときに、サイトが「fr」の言語を含むページを表示することを期待しています。ユーザーが英語に切り替えてに移動するとhttp://localhost:5000/、フランス語ではなく英語で表示されます。これが機能していないようです!!!

4

1 に答える 1

3

私は最終的に解決策を見つけましbefore_requestた.request.view_argsをチェックし、セッション変数に基づいて適切な言語を提供する関数をアプリに追加するだけでした。

またg、フラスコの変数はアクティブなリクエストに対してのみ有効であり、リクエスト間で値を保存するために使用できないこともわかりました。(リクエスト間でg変数にlangを保存しようとしていたため、セッション変数を使用してリクエスト間で値を転送する必要がありました)

ここに青写真を使用してbabelを実装する簡素化されたアプリをアップロードしました: https://github.com/shankararul/simple-babel

于 2014-11-30T17:27:33.060 に答える