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.