diff --git a/MANIFEST.in b/MANIFEST.in index b1c2a22..d6be4cb 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,3 +9,5 @@ include README.md recursive-include sphinx_proof *.js recursive-include sphinx_proof *.css + +recursive-include *.pot *.po *.mo diff --git a/sphinx_proof/__init__.py b/sphinx_proof/__init__.py index f0074e9..607bc5d 100644 --- a/sphinx_proof/__init__.py +++ b/sphinx_proof/__init__.py @@ -5,10 +5,12 @@ A Sphinx extension for producing proofs, theorems, lemmas, etc. """ +import os from pathlib import Path from typing import Any, Dict, Set, Union from sphinx.config import Config from sphinx.application import Sphinx +from sphinx.locale import get_translation from sphinx.environment import BuildEnvironment from .nodes import visit_enumerable_node, depart_enumerable_node from .nodes import ( @@ -24,6 +26,8 @@ from sphinx.util.fileutil import copy_asset logger = logging.getLogger(__name__) +MESSAGE_CATALOG_NAME = "proof" +_ = get_translation(MESSAGE_CATALOG_NAME) def purge_proofs(app: Sphinx, env: BuildEnvironment, docname: str) -> None: @@ -76,6 +80,11 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.connect("env-purge-doc", purge_proofs) app.connect("env-merge-info", merge_proofs) + # add translations + package_dir = os.path.abspath(os.path.dirname(__file__)) + locale_dir = os.path.join(package_dir, "translations", "locales") + app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir) + app.add_domain(ProofDomain) app.add_node( proof_node, diff --git a/sphinx_proof/nodes.py b/sphinx_proof/nodes.py index eb9dc62..8e7a429 100644 --- a/sphinx_proof/nodes.py +++ b/sphinx_proof/nodes.py @@ -10,6 +10,10 @@ from docutils import nodes from docutils.nodes import Node from sphinx.writers.latex import LaTeXTranslator +from sphinx.locale import get_translation + +MESSAGE_CATALOG_NAME = "proof" +_ = get_translation(MESSAGE_CATALOG_NAME) CR = "\n" latex_admonition_start = CR + "\\begin{sphinxadmonition}{note}" @@ -36,7 +40,7 @@ def depart_enumerable_node(self, node: Node) -> None: # Find index in list of 'Proof #' number = get_node_number(self, node, typ) idx = self.body.index(f"{typ} {number} ") - self.body[idx] = f"{typ.title()} {number} " + self.body[idx] = f"{_(typ.title())} {number} " self.body.append("") @@ -61,7 +65,7 @@ def depart_unenumerable_node(self, node: Node) -> None: idx = list_rindex(self.body, '

') + 1 else: idx = list_rindex(self.body, title) - element = f"{typ.title()} " + element = f"{_(typ.title())} " self.body.insert(idx, element) self.body.append("") diff --git a/sphinx_proof/translations/.gitignore b/sphinx_proof/translations/.gitignore new file mode 100644 index 0000000..0d1e76b --- /dev/null +++ b/sphinx_proof/translations/.gitignore @@ -0,0 +1,2 @@ +*.po +!*.mo diff --git a/sphinx_proof/translations/README.md b/sphinx_proof/translations/README.md new file mode 100644 index 0000000..320f6b2 --- /dev/null +++ b/sphinx_proof/translations/README.md @@ -0,0 +1,3 @@ +JSONs created using https://smodin.me/translate-one-text-into-multiple-languages + +To convert to locale files run `python sphinx_proof/translations/_convert.py` diff --git a/sphinx_proof/translations/__init__.py b/sphinx_proof/translations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sphinx_proof/translations/_convert.py b/sphinx_proof/translations/_convert.py new file mode 100755 index 0000000..8fc9928 --- /dev/null +++ b/sphinx_proof/translations/_convert.py @@ -0,0 +1,57 @@ +import json +import os +from pathlib import Path +import subprocess + + +def convert_json(folder=None): + folder = folder or Path(__file__).parent + + # remove exising + for path in (folder / "locales").glob("**/proof.po"): + path.unlink() + + # compile po + for path in (folder / "jsons").glob("*.json"): + data = json.loads(path.read_text("utf8")) + assert data[0]["symbol"] == "en" + english = data[0]["text"] + for item in data[1:]: + language = item["symbol"] + out_path = folder / "locales" / language / "LC_MESSAGES" / "proof.po" + if not out_path.parent.exists(): + out_path.parent.mkdir(parents=True) + if not out_path.exists(): + header = f""" +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Proof\\n" +"MIME-Version: 1.0\\n" +"Content-Type: text/plain; charset=UTF-8\\n" +"Content-Transfer-Encoding: 8bit\\n" +"Language: {language}\\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\\n" +""" + out_path.write_text(header) + + with out_path.open("a") as f: + f.write("\n") + f.write(f'msgid "{english}"\n') + text = item["text"].replace('"', '\\"') + f.write(f'msgstr "{text}"\n') + + # compile mo + for path in (folder / "locales").glob("**/proof.po"): + print(path) + subprocess.check_call( + [ + "msgfmt", + os.path.abspath(path), + "-o", + os.path.abspath(path.parent / "proof.mo"), + ] + ) + + +if __name__ == "__main__": + convert_json() diff --git a/sphinx_proof/translations/jsons/Algorithm.json b/sphinx_proof/translations/jsons/Algorithm.json new file mode 100644 index 0000000..75b5833 --- /dev/null +++ b/sphinx_proof/translations/jsons/Algorithm.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Algorithm"},{"language":"French","symbol":"fr","text":"Algorithme"}] diff --git a/sphinx_proof/translations/jsons/Axiom.json b/sphinx_proof/translations/jsons/Axiom.json new file mode 100644 index 0000000..8159ad2 --- /dev/null +++ b/sphinx_proof/translations/jsons/Axiom.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Axiom"},{"language":"French","symbol":"fr","text":"Axiome"}] diff --git a/sphinx_proof/translations/jsons/Conjecture.json b/sphinx_proof/translations/jsons/Conjecture.json new file mode 100644 index 0000000..12c2d9e --- /dev/null +++ b/sphinx_proof/translations/jsons/Conjecture.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Conjecture"},{"language":"Arabic","symbol":"ar","text":"تخمين"},{"language":"Dutch","symbol":"nl","text":"Vermoeden"},{"language":"French","symbol":"fr","text":"Conjecture"},{"language":"German","symbol":"de","text":"Vermutung"},{"language":"Italian","symbol":"it","text":"Congetturare"},{"language":"Japanese","symbol":"ja","text":"推測"},{"language":"Russian","symbol":"ru","text":"Гипотеза"},{"language":"Spanish","symbol":"es","text":"Conjetura"}] diff --git a/sphinx_proof/translations/jsons/Criterion.json b/sphinx_proof/translations/jsons/Criterion.json new file mode 100644 index 0000000..aa9f523 --- /dev/null +++ b/sphinx_proof/translations/jsons/Criterion.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Criterion"},{"language":"French","symbol":"fr","text":"Critère"}] diff --git a/sphinx_proof/translations/jsons/Definition.json b/sphinx_proof/translations/jsons/Definition.json new file mode 100644 index 0000000..9f0080c --- /dev/null +++ b/sphinx_proof/translations/jsons/Definition.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Definition"},{"language":"Arabic","symbol":"ar","text":"تعريف"},{"language":"Dutch","symbol":"nl","text":"Definitie"},{"language":"French","symbol":"fr","text":"Définition"},{"language":"German","symbol":"de","text":"Definition"},{"language":"Italian","symbol":"it","text":"Definizione"},{"language":"Japanese","symbol":"ja","text":"意味"},{"language":"Russian","symbol":"ru","text":"Определение"},{"language":"Spanish","symbol":"es","text":"Definición"}] diff --git a/sphinx_proof/translations/jsons/Example.json b/sphinx_proof/translations/jsons/Example.json new file mode 100644 index 0000000..3d0529b --- /dev/null +++ b/sphinx_proof/translations/jsons/Example.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Example"},{"language":"French","symbol":"fr","text":"Exemple"}] diff --git a/sphinx_proof/translations/jsons/Lemma.json b/sphinx_proof/translations/jsons/Lemma.json new file mode 100644 index 0000000..4a78ae9 --- /dev/null +++ b/sphinx_proof/translations/jsons/Lemma.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Lemma"},{"language":"Arabic","symbol":"ar","text":"ليما"},{"language":"Dutch","symbol":"nl","text":"Lemma"},{"language":"French","symbol":"fr","text":"Lemme"},{"language":"German","symbol":"de","text":"Lemma"},{"language":"Italian","symbol":"it","text":"Lemma"},{"language":"Japanese","symbol":"ja","text":"補題"},{"language":"Russian","symbol":"ru","text":"Лемма"},{"language":"Spanish","symbol":"es","text":"Lema"}] diff --git a/sphinx_proof/translations/jsons/Observation.json b/sphinx_proof/translations/jsons/Observation.json new file mode 100644 index 0000000..e146b5e --- /dev/null +++ b/sphinx_proof/translations/jsons/Observation.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Observation"},{"language":"French","symbol":"fr","text":"Observation"}] diff --git a/sphinx_proof/translations/jsons/Property.json b/sphinx_proof/translations/jsons/Property.json new file mode 100644 index 0000000..7ac24e3 --- /dev/null +++ b/sphinx_proof/translations/jsons/Property.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Property"},{"language":"French","symbol":"fr","text":"Propriété"}] diff --git a/sphinx_proof/translations/jsons/Proposition.json b/sphinx_proof/translations/jsons/Proposition.json new file mode 100644 index 0000000..e6f9a18 --- /dev/null +++ b/sphinx_proof/translations/jsons/Proposition.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Proposition"},{"language":"French","symbol":"fr","text":"Proposition"}] diff --git a/sphinx_proof/translations/jsons/Remark.json b/sphinx_proof/translations/jsons/Remark.json new file mode 100644 index 0000000..8bee93b --- /dev/null +++ b/sphinx_proof/translations/jsons/Remark.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Remark"},{"language":"Arabic","symbol":"ar","text":"ملاحظة"},{"language":"Dutch","symbol":"nl","text":"Opmerking"},{"language":"French","symbol":"fr","text":"Remarque"},{"language":"German","symbol":"de","text":"Anmerkung"},{"language":"Italian","symbol":"it","text":"osservazione"},{"language":"Japanese","symbol":"ja","text":"述べる"},{"language":"Russian","symbol":"ru","text":"Замечание"},{"language":"Spanish","symbol":"es","text":"Observación"}] diff --git a/sphinx_proof/translations/jsons/Theorem.json b/sphinx_proof/translations/jsons/Theorem.json new file mode 100644 index 0000000..253b076 --- /dev/null +++ b/sphinx_proof/translations/jsons/Theorem.json @@ -0,0 +1 @@ +[{"language":"English","symbol":"en","text":"Theorem"},{"language":"Arabic","symbol":"ar","text":"نظرية"},{"language":"Dutch","symbol":"nl","text":"Stelling"},{"language":"French","symbol":"fr","text":"Théorème"},{"language":"German","symbol":"de","text":"Satz"},{"language":"Italian","symbol":"it","text":"Teorema"},{"language":"Japanese","symbol":"ja","text":"定理"},{"language":"Russian","symbol":"ru","text":"Теорема"},{"language":"Spanish","symbol":"es","text":"Teorema"}] diff --git a/sphinx_proof/translations/locales/__init__.py b/sphinx_proof/translations/locales/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sphinx_proof/translations/locales/ar/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/ar/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..530a52f Binary files /dev/null and b/sphinx_proof/translations/locales/ar/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/de/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/de/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..b81403d Binary files /dev/null and b/sphinx_proof/translations/locales/de/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/es/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/es/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..5d3fbc1 Binary files /dev/null and b/sphinx_proof/translations/locales/es/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/fr/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/fr/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..6940395 Binary files /dev/null and b/sphinx_proof/translations/locales/fr/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/it/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/it/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..79acb27 Binary files /dev/null and b/sphinx_proof/translations/locales/it/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/ja/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/ja/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..4e27f87 Binary files /dev/null and b/sphinx_proof/translations/locales/ja/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/nl/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/nl/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..f728a5f Binary files /dev/null and b/sphinx_proof/translations/locales/nl/LC_MESSAGES/proof.mo differ diff --git a/sphinx_proof/translations/locales/ru/LC_MESSAGES/proof.mo b/sphinx_proof/translations/locales/ru/LC_MESSAGES/proof.mo new file mode 100644 index 0000000..c9b9ba2 Binary files /dev/null and b/sphinx_proof/translations/locales/ru/LC_MESSAGES/proof.mo differ