diff --git a/app.py b/app.py index e104f65..20af1eb 100644 --- a/app.py +++ b/app.py @@ -1,15 +1,11 @@ # -*- coding: utf-8 -*- -""" -My super duper codelookup replacement. -""" - -from flask import Flask, redirect, render_template, request, url_for, Markup import time -import requests -import json import re +from flask import Flask, redirect, render_template, request, url_for +import requests + app = Flask(__name__) HEADERS = { @@ -29,10 +25,7 @@ def get_language_code(code, state="code"): "zh-min-nan": "nan", "zh-yue": "yue" } - if code in remap: - return remap[code] - else: - return code.split("-")[0] + return remap.get(code, code.partition("-")[0]) elif state == "sitecode": remap = { "sgs": "bat-smg", @@ -43,26 +36,27 @@ def get_language_code(code, state="code"): "nan": "zh-min-nan", "yue": "zh-yue" } - if code in remap: - return remap[code] - else: - return code + return remap.get(code, code) else: return code else: return "INVALID" def get_code_data(lang): - api = "https://hub.toolforge.org/{}:{}?format=json&lang=en" - if len(lang) == 2: - api = api.format("P218", lang) - else: - api = api.format("P220", lang) - req = requests.get(api, headers=HEADERS).json() - if "destination" in req: - return req - else: - return False + prop = "P218" if len(lang) == 2 else "P220" + + res = requests.get( + "https://hub.toolforge.org/{}:{}".format(prop, lang), + headers=HEADERS, + params={"format": "json", "lang": "en"} + ) + res.raise_for_status() + data = res.json() + + if "destination" not in data: + return None + + return data def get_twn_stats(lang): api = "https://translatewiki.net/w/api.php" @@ -72,20 +66,23 @@ def get_twn_stats(lang): "meta": "languagestats", "lslanguage": lang } - req = requests.get(api, params=params, headers=HEADERS).json() - if "error" in req and req["error"]["code"] == "translate-invalidlanguage": - return False - else: - return req["query"]["languagestats"] + + res = requests.get(api, params=params, headers=HEADERS) + data = res.json() + errorCode = data.get("error", {}).get("code") + if errorCode == "translate-invalidlanguage": + return None + return data["query"]["languagestats"] def get_group_stats(stats, groups): ret = {} for group in stats: - if group["group"] in groups: + _group = group["group"] + if _group in groups: total = group["total"] translated = group["translated"] percentage = int(translated) / int(total) * 100 - ret[group["group"]] = { + ret[_group] = { "translated": translated, "total": total, "percentage": round(percentage, 2) @@ -100,14 +97,14 @@ def get_mediawiki_languages(code): "meta": "siteinfo", "siprop": "languages" } - req = requests.get(api, params=params, headers=HEADERS).json()["query"]["languages"] - match = False - for entry in req: - if entry["code"] == code: - match = True - break - return match - + + res = requests.get(api, params=params, headers=HEADERS) + data = res.json() + + languages = data["query"]["languages"] + + return any(entry.get("code") == code for entry in languages) + def get_wikidata_languages(code): api = "https://www.wikidata.org/w/api.php" params = { @@ -115,11 +112,13 @@ def get_wikidata_languages(code): "format": "json", "meta": "wbcontentlanguages" } - req = requests.get(api, params=params, headers=HEADERS).json()["query"]["wbcontentlanguages"] - if code in req: - return True - else: - return False + + res = requests.get(api, params=params, headers=HEADERS) + data = res.json() + + wbcontentlanguages = data["query"]["wbcontentlanguages"] + + return code in wbcontentlanguages def get_wikimedia_sites(code): api = "https://meta.wikimedia.org/w/api.php" @@ -129,25 +128,31 @@ def get_wikimedia_sites(code): "smtype": "language", "smlimit": 5000 } - req = requests.get(api, params=params, headers=HEADERS).json()["sitematrix"] - match = False - for entry in req: + + req = requests.get(api, params=params, headers=HEADERS) + data = req.json() + sitematrix = data["sitematrix"] + + match = None + for entry, val in sitematrix.items(): if entry == "count": continue - else: - if req[entry]["code"] == code: - match = req[entry] - break - if match: - ret = {} - for site in match["site"]: - if "closed" in site: - continue - else: - ret[site["code"]] = site["sitename"] - return ret - else: - return False + + if val.get("code") == code: + match = val + break + + if match is None: + return None + + ret = {} + + for site in match["site"]: + if "closed" in site: + continue + ret[site["code"]] = site["sitename"] + + return ret def get_everything(langcode): code = get_language_code(langcode) @@ -175,179 +180,57 @@ def get_everything(langcode): }, "groupstats": {} } - - if code != "INVALID": - res["wellformed"] = True - else: + + if code == "INVALID": return res - - if get_code_data(lang): - res["actual"] = get_code_data(lang)["origin"]["qid"] - try: - res["languagename"] = get_code_data(lang)["destination"]["preferedSitelink"]["title"] - except: - pass - + + res["wellformed"] = True + + codeData = get_code_data(lang) + + if codeData: + res["actual"] = codeData["origin"]["qid"] + languagename = codeData.get("destination", {}).get("preferedSitelink", {}).get("title") + if languagename is not None: + res["languagename"] = languagename + twnstats = get_twn_stats(code) - groups_to_find = ["core-0-mostused", "core", "ext-proofreadpage-user", "ext-collection-user", "wikimedia-main", "out-wikimedia-mobile-wikipedia-android-strings", "out-wikimedia-mobile-wikipedia-ios"] - + + groups_to_find = ( + "core-0-mostused", + "core", + "ext-proofreadpage-user", + "ext-collection-user", + "wikimedia-main", + "out-wikimedia-mobile-wikipedia-android-strings", + "out-wikimedia-mobile-wikipedia-ios" + ) + if twnstats: res["twn-enabled"] = True res["groupstats"] = get_group_stats(twnstats, groups_to_find) - + if get_mediawiki_languages(code): res["mw-enabled"] = True res["wd-enabled"] = True else: res["wd-enabled"] = get_wikidata_languages(code) - + wmsites = get_wikimedia_sites(sitecode) - if wmsites: - res["wm-sites"].update(wmsites) - - return res -def encapsulate_p(x): - if x[0] == "<": - return x - else: - return "
" + x + "
" - -def statblurb(code, stats, group, displaystats=True): - groupnames = { - "core-0-mostused": "Most important messages", - "core": "MediaWiki core messages", - "ext-collection-user": "Collection extension", - "ext-proofreadpage-user": "ProofreadPage extension", - "wikimedia-main": "Main extensions used by Wikimedia", - "out-wikimedia-mobile-wikipedia-android-strings": "Android Wikipedia app", - "out-wikimedia-mobile-wikipedia-ios": "iOS Wikipedia app" - } - svg = """""".format(stats["percentage"], "stat-" + group) - locstats = "" - if displaystats: - locstats = "{0} {6}: {3} %: {4} / {5} messages" - else: - locstats = "{0} {6}" - - return locstats.format( - svg, - code, - group, - stats["percentage"], - stats["translated"], - stats["total"], - groupnames[group] - ) + if wmsites is not None: + res["wm-sites"].update(wmsites) -def build_content(langcode): - results = get_everything(langcode) - content = [] - infobutton = "{} is not a well-formed language code.".format(langcode) + infobutton.format("wellformed"))
- content.append(infobox.format("wellformed", "A well-formed language code conists of 2 letters (ISO 639-1) or three letters (ISO 639-3), and optionally has one or more subtags separated by hyphens. The code you entered does not conform to this."))
- return Markup("\n".join(content))
- else:
- verifybox = "{} is a well-formed language code.".format(langcode) + infobutton.format("wellformed"))
- content.append(infobox.format("wellformed", "A well-formed language code consists of 2 letters (ISO 639-1) or three letters (ISO 639-3), and optionally has one or more subtags separated by hyphens. The code you entered conforms to this, but that doesn't necessarily mean that it is a valid language code."))
- if results["actual"]:
- content.append("✔️ This seems to be a code for an actual language.")
- content.insert(0, "{0}: {1}| Project | \nLocalization status | \n
|---|---|
| {} | \n{} |
✖ {{ langcode }} is not a well-formed language code. {{ infobutton('wellformed') }}
{{ results['lang'] }}: {{ results['languagename'] }}✔ {{ langcode }} is a well-formed language code. {{ infobutton('wellformed') }}
✔ This seems to be a code for an actual language.
+ {%- else -%} +✖ This doesn't seem to be an actual language code. {{ infobutton('actual') }}
+ {% call infobox('actual') -%} + This means that there is currently no item on Wikidata with this language code. Since there could be shortcomings in the data on Wikidata, please verify the language code with the SIL link on the right. + {%- endcall %} + {%- endif %} + {% if results['twn-enabled'] -%} +✔ This language code is enabled on Translatewiki.
+✖ This language code is not enabled on Translatewiki. {{ infobutton('twnenabled') }}
+ {% call infobox('twnenabled') -%} + In order to enable a language for translation on Translatewiki, you need to request that it be added on the Support page. Translatewiki is independent of Wikimedia wikis, so you may need to register an account there first.✔ This language code is available for general use in MediaWiki.
+ {%- else -%} +✖ This language is not yet available for general use in MediaWiki. {{ infobutton('mwenabled') }}
+ {% call infobox('mwenabled') -%} + The best way to make a language code available for general use in MediaWiki is to complete the translation of the most important messages into that language. + {%- endcall %} + {%- endif %} + {% if results['wd-enabled'] -%} +✔ This language is available for general use on Wikidata.
+ {%- else -%} +✖ This language is not yet available for general use on Wikidata. {{ infobutton('wdenabled') }}
+ {% call infobox('wdenabled') -%} + The best way to enable a language code for Wikidata is the same as for MediaWiki: Translate the most important messages into that language. However, if you are not able to do that for some reason, but the language code is still needed in Wikidata, you can see the appropriate steps to take on Help:Monolingual text languages. + {%- endcall %} + {%- endif %} + {{ buildContentTable(results) }} + {% endif %} +{%- endmacro %} + +{% macro buildContentTable(results) -%} + {% set incubator = 'https://incubator.wikimedia.org/wiki/' %} + {% set projectmatrix = { + 'wiki': ('Wikipedia', 'https://{}.wikipedia.org/', incubator + 'Wp/{}'), + 'wiktionary': ('Wiktionary', 'https://{}.wiktionary.org/', incubator + 'Wt/{}'), + 'wikibooks': ('Wikibooks', 'https://{}.wikibooks.org/', incubator + 'Wb/{}'), + 'wikiquote': ('Wikiquote', 'https://{}.wikiquote.org/', incubator + 'Wq/{}'), + 'wikisource': ('Wikisource', 'https://{}.wikisource.org/', 'https://wikisource.org/wiki/Main_Page/{}'), + 'wikiversity': ('Wikiversity', 'https://{}.wikiversity.org/', 'https://beta.wikiversity.org/wiki/'), + 'wikivoyage': ('Wikivoyage', 'https://{}.wikivoyage.org/', incubator + 'Wy/{}') + } %} +| Project | +Localization status | +
|---|---|
| + {%- if site -%} + {{ site }} + {%- else -%} + {{ projectmatrix[project][0] }} (Incubator) + {%- endif -%} + | ++ {%- if results['groupstats'] | length == 0 -%} + The language is not enabled in Translatewiki. + {%- else -%} + {{ statblurb(results['code'], results['groupstats']['core-0-mostused'], 'core-0-mostused', False) }} + {{ statblurb(results['code'], results['groupstats']['core'], 'core', False) }} + {% if project in ('wikibooks', 'wikisource') -%} + {{ statblurb(results['code'], results['groupstats']['ext-collection-user'], 'ext-collection-user', False) }} + {%- elif project == 'wikisource' -%} + {{ statblurb(results['code'], results['groupstats']['ext-proofreadpage-user'], 'ext-proofreadpage-user', False) }} + {%- endif %} + {%- endif -%} + | +