Skip to content

Commit 8b86f90

Browse files
committed
Add a shared function to translate language names
1 parent 830a2d9 commit 8b86f90

File tree

6 files changed

+39
-17
lines changed

6 files changed

+39
-17
lines changed

novelwriter/common.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,11 @@ def processLangCode(code: str) -> str:
327327
return QLocale(code).name().replace("_", "-") if code else ""
328328

329329

330+
def languageName(code: str) -> str:
331+
"""Return the local name of a language."""
332+
return QLocale(code).nativeLanguageName().title()
333+
334+
330335
def elide(text: str, length: int) -> str:
331336
"""Elide a piece of text to a maximum length."""
332337
if len(text) > (cut := max(4, length)):

novelwriter/config.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
from novelwriter.common import (
4545
NWConfigParser, checkInt, checkPath, describeFont, fontMatcher,
46-
formatTimeStamp, joinLines, processDialogSymbols, simplified
46+
formatTimeStamp, joinLines, languageName, processDialogSymbols, simplified
4747
)
4848
from novelwriter.constants import nwFiles, nwQuotes, nwUnicode
4949
from novelwriter.enum import nwTheme
@@ -507,11 +507,11 @@ def listLanguages(self, lngSet: int) -> list[tuple[str, str]]:
507507
if lngSet == self.LANG_NW:
508508
fPre = "nw_"
509509
fExt = ".qm"
510-
langList = {"en_GB": QLocale("en_GB").nativeLanguageName().title()}
510+
langList = {"en_GB": languageName("en_GB")}
511511
elif lngSet == self.LANG_PROJ:
512512
fPre = "project_"
513513
fExt = ".json"
514-
langList = {"en_GB": QLocale("en_GB").nativeLanguageName().title()}
514+
langList = {"en_GB": languageName("en_GB")}
515515
else:
516516
return []
517517

@@ -521,7 +521,7 @@ def listLanguages(self, lngSet: int) -> list[tuple[str, str]]:
521521
continue
522522

523523
qmLang = qmName[len(fPre):-len(fExt)]
524-
qmName = QLocale(qmLang).nativeLanguageName().title()
524+
qmName = languageName(qmLang)
525525
if qmLang and qmName and qmLang != "en_GB":
526526
langList[qmLang] = qmName
527527

novelwriter/core/spellcheck.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
from pathlib import Path
3131
from typing import TYPE_CHECKING
3232

33-
from PyQt6.QtCore import QLocale
34-
33+
from novelwriter.common import languageName
3534
from novelwriter.constants import nwFiles
3635
from novelwriter.error import logException
3736

@@ -139,7 +138,7 @@ def listDictionaries(self) -> list[tuple[str, str]]:
139138
try:
140139
import enchant
141140
tags = [x for x, _ in enchant.list_dicts()]
142-
lang = [(x, f"{QLocale(x).nativeLanguageName().title()} [{x}]") for x in set(tags)]
141+
lang = [(x, f"{languageName(x)} [{x}]") for x in set(tags)]
143142
except Exception:
144143
logger.error("Failed to list languages for enchant spell checking")
145144
return sorted(lang, key=lambda x: x[1])

novelwriter/gui/statusbar.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828
from datetime import datetime
2929
from time import time
3030

31-
from PyQt6.QtCore import QLocale, pyqtSlot
31+
from PyQt6.QtCore import pyqtSlot
3232
from PyQt6.QtWidgets import QApplication, QLabel, QStatusBar, QWidget
3333

3434
from novelwriter import CONFIG, SHARED
35-
from novelwriter.common import formatTime
35+
from novelwriter.common import formatTime, languageName
3636
from novelwriter.constants import nwConst, nwLabels, nwStats, trStats
3737
from novelwriter.extensions.modified import NClickableLabel
3838
from novelwriter.extensions.statusled import StatusLED
@@ -208,7 +208,7 @@ def setLanguage(self, language: str, provider: str) -> None:
208208
self.langText.setText(self.tr("None"))
209209
self.langText.setToolTip("")
210210
else:
211-
self.langText.setText(QLocale(language).nativeLanguageName().title())
211+
self.langText.setText(languageName(language))
212212
self.langText.setToolTip(f"{language} ({provider})" if provider else language)
213213

214214
@pyqtSlot(bool)

novelwriter/tools/manussettings.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
from typing import TYPE_CHECKING
2929

30-
from PyQt6.QtCore import QEvent, QLocale, pyqtSignal, pyqtSlot
30+
from PyQt6.QtCore import QEvent, pyqtSignal, pyqtSlot
3131
from PyQt6.QtGui import QFont, QIcon, QSyntaxHighlighter, QTextCharFormat, QTextDocument
3232
from PyQt6.QtWidgets import (
3333
QAbstractButton, QAbstractItemView, QDialogButtonBox, QFrame, QGridLayout,
@@ -37,7 +37,10 @@
3737
)
3838

3939
from novelwriter import CONFIG, SHARED
40-
from novelwriter.common import describeFont, fontMatcher, processLangCode, qtAddAction, qtLambda
40+
from novelwriter.common import (
41+
describeFont, fontMatcher, languageName, processLangCode, qtAddAction,
42+
qtLambda
43+
)
4144
from novelwriter.constants import nwHeadFmt, nwKeyWords, nwLabels, nwUnicode, trConst
4245
from novelwriter.core.buildsettings import BuildSettings, FilterMode
4346
from novelwriter.enum import nwStandardButton
@@ -1633,7 +1636,7 @@ def _resetPageHeader(self) -> None:
16331636
def _refreshMetaLang(self) -> None:
16341637
"""Update the meta language helper info."""
16351638
code = self.metaLanguage.text().strip()
1636-
self.lblMetaLanguage.setText(QLocale(code).nativeLanguageName().title())
1639+
self.lblMetaLanguage.setText(languageName(code))
16371640

16381641
##
16391642
# Internal Functions

tests/test_base/test_base_common.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@
3737
fontMatcher, formatFileFilter, formatInt, formatTime, formatTimeStamp,
3838
formatVersion, fuzzyTime, getFileSize, hexToInt, isHandle, isItemClass,
3939
isItemLayout, isItemType, isListInstance, isTitleTag, joinLines,
40-
jsonCombine, jsonEncode, makeFileNameSafe, minmax, numberToRoman,
41-
openExternalPath, processDialogSymbols, readTextFile, simplified,
42-
transferCase, uniqueCompact, utf16CharMap, xmlElement, xmlIndent,
43-
xmlSubElem, yesNo
40+
jsonCombine, jsonEncode, languageName, makeFileNameSafe, minmax,
41+
numberToRoman, openExternalPath, processDialogSymbols, processLangCode,
42+
readTextFile, simplified, transferCase, uniqueCompact, utf16CharMap,
43+
xmlElement, xmlIndent, xmlSubElem, yesNo
4444
)
4545
from novelwriter.enum import nwItemClass
4646

@@ -411,6 +411,21 @@ def testBaseCommon_processDialogSymbols():
411411
assert processDialogSymbols("-\u2013\u2014\u2015") == "\u2013\u2014\u2015"
412412

413413

414+
@pytest.mark.base
415+
def testBaseCommon_processLangCode():
416+
"""Test the processLangCode function."""
417+
assert processLangCode("") == ""
418+
assert processLangCode(" ") == ""
419+
assert processLangCode("en") == "en-US"
420+
assert processLangCode("en_gb") == "en-GB"
421+
422+
423+
@pytest.mark.base
424+
def testBaseCommon_languageName():
425+
"""Test the languageName function."""
426+
assert languageName("en-GB") == "British English"
427+
428+
414429
@pytest.mark.base
415430
def testBaseCommon_elide():
416431
"""Test the elide function."""

0 commit comments

Comments
 (0)