2016-06-13 12 views
1

Ich erstelle eine mehrsprachige Site (EN und FR) und brauche sie, um beim Klicken hin- und herzuwechseln, wenn der Benutzer dies wünscht. Ich benutze Flask-Babel und die Übersetzungen und Toggle funktionieren beim Klick korrekt, allerdings müssen auch die URLs übersetzt werden. Ich habe zur Zeit meine URL Routen wie so eingewickelt, sowohl mit dem Englisch und Französisch URLs:Flask-Babel Mehrsprachiges URL-Routing

@main.route('/accueil') 
@main.route('/home') 
def index(): 
    return render('index.html', {}) 

@main.route('/a-propos-de-nous') 
@main.route('/about-us') 
def about(): 
    return render('about.html', {}) 

Der Rest des Codes, der die Sprache und die Hin- und Herschalten ist grabbing sich wie folgt:

app = Flask(__name__, static_folder=settings.STATIC_ROOT) 
main = Blueprint('main', __name__, url_prefix='/language/<lang_code>') 

@app.url_defaults 
def set_language_code(endpoint, values): 
    if 'lang_code' in values or not session['lang_code']: 
     return 
    if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'): 
     values['lang_code'] = session['lang_code'] 

@app.url_value_preprocessor 
def get_lang_code(endpoint, values): 
    if values is not None: 
     session['lang_code'] = values.pop('lang_code', None) 

@app.before_request 
def ensure_lang_support(): 
    lang_code = session['lang_code'] 
    if lang_code and lang_code not in app.config['SUPPORTED_LANGUAGES'].keys(): 
     return abort(404) 

@babel.localeselector 
def get_locale(): 
    if session.get('lang_code') is None: 
     session['lang_code'] = request.accept_languages.best_match(app.config['SUPPORTED_LANGUAGES'].keys()) 
    return session['lang_code'] 

Die Vorlage das sieht aus wie, wo der Benutzer klickt auf dem Link Sprachen zu ändern:

{% if session['lang_code']=='en' %} 
    {% set new_lang_code='fr' %} 
{% else %} 
    {% set new_lang_code='en' %} 
{% endif %} 
<li><a href="{{ request.path|replace("/"+session['lang_code']+"/", "/"+new_lang_code+"/") }}">{{ _('Fr') }}</a></li> 

wie ich wenig Erfahrung mit Python/Flask habe ... ich mit dem besten Weg zum übersetzte UR wechseln habe Schwierigkeiten L. Wie würde ich das machen? Jede Information würde geschätzt werden. Danke im Voraus.

Antwort

0

Ich habe eine Lösung gefunden! Ich hatte Endpunkte auf die URL Routen hinzufügen wie folgt:

@main.route('accueil', endpoint="index_fr") 
@main.route('home', endpoint="index_en") 
def index(): 
    return render('index.html', {}) 

@main.route('a-propos-de-nous', endpoint="about_fr") 
@main.route('about-us', endpoint="about_en") 
def about(): 
    return render('about.html', {}) 

Die erlaubten mir Babel zu verwenden, um die URL-Endpunkte zu übersetzen, wie es für den Rest des Textes hat, und die richtige URL zusammen mit der Sprache endet greifen Code aus der Sitzung. Der Schalter funktioniert jetzt wie folgt:

{% if session['lang_code']=='en' %} 
    {% set new_lang_code='fr' %} 
{% else %} 
    {% set new_lang_code='en' %} 
{% endif %} 

<li><a href="{{ url_for(request.endpoint|replace("_"+session['lang_code'], "_"+new_lang_code))|replace("/"+session['lang_code']+"/", "/"+new_lang_code+"/") }}">{{ _('Fr') }}</a></li>