Python flask web application with multilanguages support by host and prefix Python flask web application with multilanguages support by host and prefix flask flask

Python flask web application with multilanguages support by host and prefix


It's in the official doc: http://flask.pocoo.org/docs/patterns/urlprocessors/ (This is basically the same answer as Matthew Scragg's).


I worked on something similar few months back. I modified it a bit and pushed to github.You can do what codegeek suggested if you are unable to make your templates language neutral. With this method you can cut down on the template files needed.

https://github.com/scragg0x/Flask-Localisation-Example

mysite.py

from flask import Flask, Blueprint, g, redirect, requestapp = Flask(__name__)mod = Blueprint('mysite', __name__, url_prefix='/<lang_code>')sites = {    'mysite.com': 'en',    'myothersite.com': 'fr'}@app.url_defaultsdef add_language_code(endpoint, values):    values.setdefault('lang_code', g.lang_code)@app.url_value_preprocessordef pull_lang_code(endpoint, values):    url = request.url.split('/', 3)    g.lang_code = sites[url[2]]@mod.url_defaultsdef add_language_code(endpoint, values):    values.setdefault('lang_code', g.lang_code)@mod.url_value_preprocessordef pull_lang_code(endpoint, values):    g.lang_code = values.pop('lang_code')@app.route('/')@mod.route('/')def index():    # Use g.lang_code to pull localized data for template    return 'lang = %s' % g.lang_codeapp.register_blueprint(mod)

tests.py

import osimport unittestimport reimport requestsimport urllib2import jsonfrom mysite import appclass MySiteTestCase(unittest.TestCase):    def setUp(self):        app.config['TESTING'] = True        app.config['SERVER_NAME'] = 'mysite.com'        self.domain = 'http://mysite.com/'        self.app = app.test_client()    def tearDown(self):        pass    def test_en_index(self):        rv = self.app.get('/en/', self.domain)        self.assertEqual(rv.data, 'lang = en')        print self.domain, rv.data    def test_fr_index(self):        rv = self.app.get('/fr/', self.domain)        self.assertEqual(rv.data, 'lang = fr')        print self.domain, rv.data    def test_default(self):        rv = self.app.get('/', self.domain)        self.assertEqual(rv.data, 'lang = en')        print self.domain, rv.dataclass MyOtherSiteTestCase(unittest.TestCase):    def setUp(self):        app.config['TESTING'] = True        app.config['SERVER_NAME'] = 'myothersite.com'        self.domain = 'http://myothersite.com/'        self.app = app.test_client()    def tearDown(self):        pass    def test_en_index(self):        rv = self.app.get('/en/', self.domain)        self.assertEqual(rv.data, 'lang = en')        print self.domain, rv.data    def test_fr_index(self):        rv = self.app.get('/fr/', self.domain)        self.assertEqual(rv.data, 'lang = fr')        print self.domain, rv.data    def test_default(self):        rv = self.app.get('/', self.domain)        self.assertEqual(rv.data, 'lang = fr')        print self.domain, rv.dataif __name__ == '__main__':    unittest.main()


Disclaimer: This code is not tested. I am just giving you a ballpark idea of how to approach this.

I suggest you use blueprints in combination with an extension like Flask-Babel. For example, you can do something like:

views.py

mysitebp = Blueprint('mysitebp',__name__)

Then in your application package (usually __init__.py) , you can do:

__init__.py

from mysite.views import mysitebpapp = Flask(__name__)app.register_blueprint(mysitebp,url_prefix='/en/',template_folder='en')app.register_blueprint(mysitebp,url_prefix='/fr',template_folder='fr')

..and so on

Your directory structure could look like:

mysite/__init__.pyviews.pytemplates/    base.html    404.html    en/        en.html    fr/        french.html

Flask-Babel would help you translate the 404.html etc.