Skip to content

Commit

Permalink
[ENH] Adding translations infrastructure and a word translation (#71)
Browse files Browse the repository at this point in the history
* Adding translations infrastructure and a word translation

This is a copy from
[sphinx-book-theme](https://github.com/executablebooks/sphinx-book-theme/tree/master/sphinx_book_theme/translations).

* Get the translation on the nodes

Signed-off-by: Vincent-Xavier JUMEL <vincent-xavier.jumel@ac-paris.fr>

* Update nodes.py

* Delete theorem.json

* Added some translations and remove old catalog

Signed-off-by: Vincent-Xavier JUMEL <vincent-xavier.jumel@ac-paris.fr>

* Adding french translation

Signed-off-by: Vincent-Xavier JUMEL <endymion@thetys-retz.net>

* Adding French translation only

Signed-off-by: Vincent-Xavier JUMEL <endymion@thetys-retz.net>

* Adding endline

Signed-off-by: Vincent-Xavier JUMEL <endymion@thetys-retz.net>

* Forgot the generated po files

Signed-off-by: Vincent-Xavier JUMEL <endymion@thetys-retz.net>

Co-authored-by: Vincent-Xavier JUMEL <vincent-xavier.jumel@ac-paris.fr>
  • Loading branch information
vincentxavier and Vincent-Xavier JUMEL committed Feb 2, 2022
1 parent 75b4e15 commit e400bd9
Show file tree
Hide file tree
Showing 28 changed files with 91 additions and 2 deletions.
2 changes: 2 additions & 0 deletions MANIFEST.in
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
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
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
@@ -0,0 +1,2 @@
*.po
!*.mo
3 changes: 3 additions & 0 deletions 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`
Empty file.
57 changes: 57 additions & 0 deletions 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()
1 change: 1 addition & 0 deletions sphinx_proof/translations/jsons/Algorithm.json
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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.

0 comments on commit e400bd9

Please sign in to comment.