Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti

Sat, 10 Jun 2017 17:00:53 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 10 Jun 2017 17:00:53 +0300
changeset 10
843c6ee340e7
parent 9
f95892def64e
child 11
e18ad36fbbf5

Refaktoroitu käännä-funktio, kaikki kielet luetaan automaattisesti

service.py file | annotate | diff | comparison | revisions
--- a/service.py	Sat Jun 10 16:48:15 2017 +0300
+++ b/service.py	Sat Jun 10 17:00:53 2017 +0300
@@ -1,41 +1,48 @@
 #!/usr/bin/env python3
 from flask import Flask, render_template, abort
 from datetime import datetime, date, time, timedelta
+from os import path, listdir
+from configparser import ConfigParser
+import locale
+
 from misc import *
-import locale
 from busroute import supista_reitti
-from configparser import ConfigParser
-from os import path
 
 app = Flask(__name__)
+
+# Varmista ettei järjestelmän kieliasetukset sotke muotoiluja
 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
 
-kielet = ['fi', 'sv', 'en', 'ru']
-kieli_ini = {}
-for kieli in kielet:
-	ini = ConfigParser()
-	ini.read(path.join('tr', kieli + '.ini'))
-	kieli_ini[kieli] = ini
+# Lataa käännökset
+class Translator:
+	def __init__(self):
+		self.languages = {}
+	def load_language(self, file_path):
+		language_name = path.splitext(path.basename(file_path))[0]
+		ini = ConfigParser()
+		ini.read(path.join(file_path))
+		self.languages[language_name] = ini
+	def __call__(self, name, section, language = None):
+		language = language or language_for_page()
+		try:
+			return self.languages[language][section][name]
+		except KeyError:
+			return name
 
-def käännä(nimi, osio):
-	kieli = sivun_kieli()
-	try:
-		return kieli_ini[kieli][osio][nimi]
-	except KeyError:
-		return nimi
+tr = Translator()
+for file in listdir('tr'):
+	tr.load_language(path.join('tr', file))
 
-def sivun_kieli():
+def language_for_page():
 	from flask import request
-	if request.args.get('sv') is not None:
-		return 'sv'
-	elif request.args.get('en') is not None:
-		return 'en'
-	elif request.args.get('ru') is not None:
-		return 'ru'
-	elif request.args.get('kääntämätön') is None:
-		return 'fi'
+	if request.args.get('kääntämätön') is not None:
+		return None
 	else:
-		return None
+		for language_name in tr.languages:
+			if request.args.get(language_name) is not None:
+				return language_name
+		else:
+			return None
 
 @app.route('/pysäkki/<tunniste>')
 def pysäkkiaikataulu(tunniste):
@@ -48,7 +55,7 @@
 		abort(404)
 	for (aika, pysähdys) in pysäkki.aikataulu(100):
 		kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
-		kyltti = [käännä(paikka, 'paikat') for paikka in kyltti]
+		kyltti = [tr(paikka, 'paikat') for paikka in kyltti]
 		kylttiesitys = ' - '.join(kyltti)
 		if len(kylttiesitys) > 25:
 			k = ceil(len(kyltti) / 2)
@@ -64,7 +71,7 @@
 		'pysäkki.html',
 		aikataulu = aikataulu,
 		viite = tunniste,
-		nimi = käännä(pysäkki.nimi, 'pysäkit'),
+		nimi = tr(pysäkki.nimi, 'pysäkit'),
 		linkki_karttaan = pysäkki.linkki_karttaan,
 		alue = pysäkki.alue,
 		sijainti = pysäkki.sijainti,
@@ -88,8 +95,8 @@
 		reitti.append({
 			'aika': muotoiltu_aika,
 			'tunniste': pysähdys.pysäkki.tunniste,
-			'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'),
-			'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'),
+			'alue': tr(pysähdys.pysäkki.alue or '', 'paikat'),
+			'nimi': tr(pysähdys.pysäkki.nimi, 'pysäkit'),
 		})
 		alue = pysähdys.pysäkki.alue
 		if alue:
@@ -103,7 +110,7 @@
 	sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html'
 	return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti,
 						numero = numero, linja = ajovuoro.linja.viite,
-						selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti),
+						selite = ' - '.join(tr(paikka, 'paikat') for paikka in kyltti),
 						yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
 						)
 
@@ -111,5 +118,6 @@
 	from argparse import ArgumentParser
 	parser = ArgumentParser()
 	parser.add_argument('-p', '--port', type = int, default = 5000)
+	parser.add_argument('-d', '--debug', action = 'store_true')
 	args = parser.parse_args()
-	app.run(debug = True, port = args.port)
+	app.run(debug = args.debug, port = args.port)

mercurial