Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ include README.md

recursive-include sphinx_proof *.js
recursive-include sphinx_proof *.css

recursive-include *.pot *.po *.mo
9 changes: 9 additions & 0 deletions sphinx_proof/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -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:
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 6 additions & 2 deletions sphinx_proof/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand All @@ -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("</div>")


Expand All @@ -61,7 +65,7 @@ def depart_unenumerable_node(self, node: Node) -> None:
idx = list_rindex(self.body, '<p class="admonition-title">') + 1
else:
idx = list_rindex(self.body, title)
element = f"<span>{typ.title()} </span>"
element = f"<span>{_(typ.title())} </span>"
self.body.insert(idx, element)
self.body.append("</div>")

Expand Down
2 changes: 2 additions & 0 deletions sphinx_proof/translations/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.po
!*.mo
3 changes: 3 additions & 0 deletions sphinx_proof/translations/README.md
Original file line number Diff line number Diff line change
@@ -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`
Empty file.
57 changes: 57 additions & 0 deletions sphinx_proof/translations/_convert.py
Original file line number Diff line number Diff line change
@@ -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()
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Algorithm.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Algorithm"},{"language":"French","symbol":"fr","text":"Algorithme"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Axiom.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Axiom"},{"language":"French","symbol":"fr","text":"Axiome"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Conjecture.json
Original file line number Diff line number Diff line change
@@ -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"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Criterion.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Criterion"},{"language":"French","symbol":"fr","text":"Critère"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Definition.json
Original file line number Diff line number Diff line change
@@ -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"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Example"},{"language":"French","symbol":"fr","text":"Exemple"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Lemma.json
Original file line number Diff line number Diff line change
@@ -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"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Observation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Observation"},{"language":"French","symbol":"fr","text":"Observation"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Property.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Property"},{"language":"French","symbol":"fr","text":"Propriété"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Proposition.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"language":"English","symbol":"en","text":"Proposition"},{"language":"French","symbol":"fr","text":"Proposition"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Remark.json
Original file line number Diff line number Diff line change
@@ -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"}]
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Theorem.json
Original file line number Diff line number Diff line change
@@ -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"}]
Empty file.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.