From 4478487c7e1e80ca0c396d8e86b16d0e72b37a5c Mon Sep 17 00:00:00 2001
From: Geert Hesselink
Date: Fri, 23 Aug 2024 15:25:20 +0200
Subject: [PATCH 1/6] update checkout directory in documentation
---
code/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/README.md b/code/README.md
index 30c2f0160..96d36adef 100644
--- a/code/README.md
+++ b/code/README.md
@@ -432,7 +432,7 @@ To load example files, you can clone the sample files into a directory called
```bash
$ cd /path/to/IFC4.3.x-development
$ cd ..
-$ git clone https://github.com/buildingSMART/Sample-Test-Files.git examples
+$ git clone https://github.com/buildingSMART/IFC4.3.x-sample-models examples
```
You can now visit `http://127.0.0.1:5000/` to see the running website.
From 42c37332819c573397da21eef57959ebf1e8558f Mon Sep 17 00:00:00 2001
From: Geert Hesselink
Date: Fri, 20 Sep 2024 18:29:17 +0200
Subject: [PATCH 2/6] First draft of translation system
---
.gitmodules | 4 +
code/requirements.txt | 1 +
code/server.py | 90 +++++++++++++++++++--
code/templates/entity.html | 24 +++++-
code/templates/main.html | 36 ++++++++-
code/templates/property.html | 10 +++
code/templates/type.html | 25 +++++-
code/translate.py | 149 +++++++++++++++++++++++++++++++++++
code/translate_repo | 1 +
docs/assets/js/app.js | 55 +++++++++++++
10 files changed, 384 insertions(+), 11 deletions(-)
create mode 100644 .gitmodules
create mode 100644 code/translate.py
create mode 160000 code/translate_repo
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..baea2a84b
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "code/translate_repo"]
+ path = code/translate_repo
+ url = https://github.com/buildingSMART/IFC4.3.x-output.git
+ branch = translations
diff --git a/code/requirements.txt b/code/requirements.txt
index c57c027ef..fd1511a97 100644
--- a/code/requirements.txt
+++ b/code/requirements.txt
@@ -10,3 +10,4 @@ numpy
pydot
pysolr
tabulate
+polib
\ No newline at end of file
diff --git a/code/server.py b/code/server.py
index 725475358..a7d4ae310 100644
--- a/code/server.py
+++ b/code/server.py
@@ -49,6 +49,8 @@ def BeautifulSoup(*args):
import md as mdp
from extract_concepts_from_xmi import parse_bindings
+from translate import translate
+
app = Flask(__name__)
is_iso = os.environ.get('ISO', '0') == '1'
@@ -58,6 +60,44 @@ def BeautifulSoup(*args):
else:
base = "/IFC/RELEASE/IFC4x3/HTML"
+language_flag_map = {
+ "English_UK": "๐ฌ๐ง",
+ "Arabic": "๐ธ๐ฆ",
+ "Chinese Simplified": "๐จ๐ณ",
+ "Croatian": "๐ญ๐ท",
+ "Czech": "๐จ๐ฟ",
+ "Danish": "๐ฉ๐ฐ",
+ "Dutch": "๐ณ๐ฑ",
+ "English": "๐บ๐ธ",
+ "Finnish": "๐ซ๐ฎ",
+ "French": "๐ซ๐ท",
+ "German": "๐ฉ๐ช",
+ "Hindi": "๐ฎ๐ณ",
+ "Icelandic": "๐ฎ๐ธ",
+ "Italian": "๐ฎ๐น",
+ "Japanese": "๐ฏ๐ต",
+ "Korean": "๐ฐ๐ท",
+ "Lithuanian": "๐ฑ๐น",
+ "Norwegian": "๐ณ๐ด",
+ "Polish": "๐ต๐ฑ",
+ "Portuguese": "๐ต๐น",
+ "Portuguese_Brazilian": "๐ง๐ท",
+ "Romanian": "๐ท๐ด",
+ "Slovenian": "๐ธ๐ฎ",
+ "Spanish": "๐ช๐ธ",
+ "Swedish": "๐ธ๐ช",
+ "Turkish": "๐น๐ท",
+}
+
+def get_translation_data(resource):
+ language_preference = request.cookies.get('languagePreference', 'English_UK')
+ translation = translate(resource, language_preference)
+ language_icon = language_flag_map.get(language_preference, '๐ฌ๐ง')
+ return {
+ 'translation': translation,
+ 'language_icon': language_icon,
+ 'language_preference': language_preference
+ }
def make_url(fragment=None):
@@ -850,6 +890,7 @@ def api_resource(resource):
@app.route(make_url("property/.htm"))
def property(prop):
+ translation_data = get_translation_data(prop)
prop = "".join(c for c in prop if c.isalnum() or c in "_")
md = os.path.join(REPO_DIR, "docs", "properties", prop[0].lower(), prop + ".md")
try:
@@ -865,13 +906,15 @@ def property(prop):
html = process_markdown(prop, mdc)
html += tabulate.tabulate(psets, headers=["Referenced in"], tablefmt="html")
-
+
return render_template(
"property.html",
navigation=get_navigation(),
content=html,
number=idx,
entity=prop,
+ translation=translation_data.get('translation', ''),
+ language_icon = translation_data.get('language_icon', '๐ฌ๐ง'),
path=md[len(REPO_DIR) + 1 :].replace("\\", "/"),
)
@@ -1000,6 +1043,7 @@ def process_markdown(resource, mdc, process_quotes=True, number_headings=False,
@app.route(make_url("lexical/.htm"))
def resource(resource):
+ translation_data = get_translation_data(resource)
try:
idx = name_to_number()[resource]
except:
@@ -1054,7 +1098,9 @@ def resource(resource):
is_deprecated=resource in R.deprecated_entities,
is_abstract=resource in R.abstract_entities,
mvds=mvds,
- is_product_or_type=is_product_or_type
+ is_product_or_type=is_product_or_type,
+ translation=translation_data.get('translation'),
+ language_icon=translation_data.get('language_icon')
)
elif resource in R.pset_definitions.keys():
return render_template(
@@ -1068,25 +1114,47 @@ def resource(resource):
applicability=get_applicability(resource),
properties=get_properties(resource, mdc),
changelog=get_changelog(resource),
+ translation=translation_data.get('translation'),
+ language_icon = translation_data.get('language_icon')
)
builder = resource_documentation_builder(resource)
+ content = get_definition(resource, mdc)
+ type_values = get_type_values(resource, mdc, request.cookies.get('languagePreference', 'English_UK'))
+
+ # check and append if the translated type values contain an addition to class description translation.
+ additional_class_description_translation = next(iter(s), None) if len(s := set([v['translated_description'] for v in type_values['schema_values'] if v['translated_description'].strip()])) == 1 else None
+
+ # in case there is a translated description, add it to the class description (one block down)
+ if additional_class_description_translation:
+ soup = BeautifulSoup(content)
+ translated_p = soup.new_tag("p")
+ translated_p['style'] = 'color: #0277bd' # to be adjusted to the BSI style color
+ translated_p.string = f"{translation_data.get('language_icon')} {additional_class_description_translation}"
+
+ last_p = soup.body.find_all('p')[-1]
+ last_p.insert_after(translated_p)
+
+ content = str(soup)
+
return render_template(
"type.html",
navigation=get_navigation(resource),
- content=get_definition(resource, mdc),
+ content=content,
number=idx,
definition_number=definition_number,
entity=resource,
path=md[len(REPO_DIR) :].replace("\\", "/"),
- type_values=get_type_values(resource, mdc),
+ type_values=type_values,
formal_propositions=get_formal_propositions(resource, builder),
formal_representation=get_formal_representation(resource),
references=get_references(resource),
changelog=get_changelog(resource),
+ translation=translation_data.get('translation'),
+ language_icon = translation_data.get('language_icon')
)
-def get_type_values(resource, mdc):
+def get_type_values(resource, mdc, language_preference):
values = R.type_values.get(resource)
if not values:
return
@@ -1105,7 +1173,17 @@ def get_type_values(resource, mdc):
break
description.append(sibling)
description = str(description)
- described_values.append({"name": value, "description": description})
+ translation_lookup_v = f"{resource.removesuffix('Enum')}{value}"
+ translation = translate(translation_lookup_v, language_preference)
+ described_values.append(
+ {
+ "name": value,
+ "name_translation": translation.get('resource_translation'),
+ "description": description,
+ "translated_definition": translation.get('definition'),
+ 'translated_description': translation.get('description')
+ }
+ )
values = described_values
return {"number": SectionNumberGenerator.generate(), "has_description": has_description, "schema_values": values}
diff --git a/code/templates/entity.html b/code/templates/entity.html
index 42f91d045..64d7af920 100644
--- a/code/templates/entity.html
+++ b/code/templates/entity.html
@@ -1,8 +1,30 @@
{% extends "main.html" %}
{% block pagecontent %}
-{{ number }} {{ entity}}
+{{ number }} {{ entity }}
+
+
+
{% if not is_iso %}
{% if is_product_or_type %}
diff --git a/code/templates/main.html b/code/templates/main.html
index f160a02a9..e76ddbd34 100644
--- a/code/templates/main.html
+++ b/code/templates/main.html
@@ -28,8 +28,42 @@
{% endif %}
{% endif %}
-
+
{% if not is_iso %}
+
+
+
+
+
+
+