diff --git a/src/Mod/Help/Help.py b/src/Mod/Help/Help.py
index 113bf3c627..65f8e62487 100644
--- a/src/Mod/Help/Help.py
+++ b/src/Mod/Help/Help.py
@@ -54,6 +54,9 @@ Defaults are to open the wiki in the desktop browser
"""
import os
+import re
+import urllib.request
+import urllib.error
import FreeCAD
@@ -101,7 +104,7 @@ def show(page, view=None, conv=None):
"""
page = underscore_page(page)
- location = get_location(page)
+ location, _pagename = get_location(page)
FreeCAD.Console.PrintLog("Help: opening " + location + "\n")
if not location:
FreeCAD.Console.PrintError(LOCTXT + "\n")
@@ -109,7 +112,10 @@ def show(page, view=None, conv=None):
md = get_contents(location)
html = convert(md, conv)
baseurl = get_uri(location)
- pagename = os.path.basename(page.replace("_", " ").replace(".md", ""))
+ if _pagename != "":
+ pagename = _pagename
+ else:
+ pagename = os.path.basename(page.replace("_", " ").replace(".md", ""))
title = translate("Help", "Help") + ": " + pagename
if FreeCAD.GuiUp:
if PREFS.GetBool("optionTab", False) and get_qtwebwidgets():
@@ -150,6 +156,27 @@ def get_uri(location):
return baseurl
+def location_url(url_localized: str, url_english: str) -> tuple:
+ """
+ Returns localized documentation url and page name, if they exist,
+ otherwise defaults to english version.
+ """
+ try:
+ req = urllib.request.Request(url_localized)
+ with urllib.request.urlopen(req) as response:
+ html = response.read().decode("utf-8")
+ if re.search(r"https://wiki.freecad.org", url_localized):
+ pagename_match = re.search(r"
(.*?) - .*?", html)
+ else:
+ pagename_match = re.search(r"Name/.*?:\s*(.+)", html)
+ if pagename_match is not None:
+ return (url_localized, pagename_match.group(1))
+ else:
+ return (url_localized, "")
+ except urllib.error.HTTPError as e:
+ return (url_english, "")
+
+
def get_location(page):
"""retrieves the location (online or offline) of a given page"""
@@ -166,24 +193,33 @@ def get_location(page):
page = page.replace("wiki/", "")
page = page.split("#")[0]
suffix = PREFS.GetString("Suffix", "")
+ pagename = ""
if suffix:
if not suffix.startswith("/"):
suffix = "/" + suffix
if PREFS.GetBool("optionWiki", True): # default
- location = WIKI_URL + "/" + page + suffix
+ location, pagename = location_url(WIKI_URL + "/" + page + suffix, WIKI_URL + "/" + page)
elif PREFS.GetBool("optionMarkdown", False):
if PREFS.GetBool("optionBrowser", False):
location = MD_RENDERED_URL
else:
location = MD_RAW_URL
if suffix:
- location += "/" + MD_TRANSLATIONS_FOLDER + suffix
- location += "/" + page + ".md"
+ location, pagename = location_url(
+ location + "/" + MD_TRANSLATIONS_FOLDER + suffix + "/" + page + ".md",
+ location + "/" + page + ".md",
+ )
+ else:
+ location += "/" + page + ".md"
elif PREFS.GetBool("optionGithub", False):
location = MD_RENDERED_URL
if suffix:
- location += "/" + MD_TRANSLATIONS_FOLDER + suffix
- location += "/" + page + ".md"
+ location, pagename = location_url(
+ location + "/" + MD_TRANSLATIONS_FOLDER + suffix + "/" + page + ".md",
+ location + "/" + page + ".md",
+ )
+ else:
+ location += "/" + page + ".md"
elif PREFS.GetBool("optionCustom", False):
location = PREFS.GetString("Location", "")
if not location:
@@ -195,7 +231,7 @@ def get_location(page):
"wiki",
)
location = os.path.join(location, page + ".md")
- return location
+ return (location, pagename)
def show_browser(url):