Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Close #9618: i18n: Add gettext_allow_fuzzy_translations #9828

Merged
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGES
Expand Up @@ -43,6 +43,8 @@ Features added
* #9691: C, added new info-field ``retval``
for :rst:dir:`c:function` and :rst:dir:`c:macro`.
* C++, added new info-field ``retval`` for :rst:dir:`cpp:function`.
* #9618: i18n: Add :confval:`gettext_allow_fuzzy_translations` to allow "fuzzy"
messages for translation
* #9672: More CSS classes on Python domain descriptions
* #9695: More CSS classes on Javascript domain descriptions
* #9683: Revert the removal of ``add_stylesheet()`` API. It will be kept until
Expand Down
7 changes: 7 additions & 0 deletions doc/usage/configuration.rst
Expand Up @@ -802,6 +802,13 @@ documentation on :ref:`intl` for details.
.. versionchanged:: 1.5
Use ``locales`` directory as a default value

.. confval:: gettext_allow_fuzzy_translations

If true, "fuzzy" messages in the message catalogs are used for translation.
The default is ``False``.

.. versionadded:: 4.3

.. confval:: gettext_compact

.. versionadded:: 1.1
Expand Down
3 changes: 2 additions & 1 deletion sphinx/application.py
Expand Up @@ -284,7 +284,8 @@ def _init_i18n(self) -> None:
self.config.language, self.config.source_encoding)
for catalog in repo.catalogs:
if catalog.domain == 'sphinx' and catalog.is_outdated():
catalog.write_mo(self.config.language)
catalog.write_mo(self.config.language,
self.config.gettext_allow_fuzzy_translations)

locale_dirs: List[Optional[str]] = list(repo.locale_dirs)
locale_dirs += [None]
Expand Down
3 changes: 2 additions & 1 deletion sphinx/builders/__init__.py
Expand Up @@ -217,7 +217,8 @@ def cat2relpath(cat: CatalogInfo) -> str:
for catalog in status_iterator(catalogs, __('writing output... '), "darkgreen",
len(catalogs), self.app.verbosity,
stringify_func=cat2relpath):
catalog.write_mo(self.config.language)
catalog.write_mo(self.config.language,
self.config.gettext_allow_fuzzy_translations)

def compile_all_catalogs(self) -> None:
repo = CatalogRepository(self.srcdir, self.config.locale_dirs,
Expand Down
1 change: 1 addition & 0 deletions sphinx/config.py
Expand Up @@ -103,6 +103,7 @@ class Config:
'language': (None, 'env', [str]),
'locale_dirs': (['locales'], 'env', []),
'figure_language_filename': ('{root}.{language}{ext}', 'env', [str]),
'gettext_allow_fuzzy_translations': (False, 'gettext', []),
tk0miya marked this conversation as resolved.
Show resolved Hide resolved

'master_doc': ('index', 'env', []),
'root_doc': (lambda config: config.master_doc, 'env', []),
Expand Down
4 changes: 2 additions & 2 deletions sphinx/util/i18n.py
Expand Up @@ -59,7 +59,7 @@ def is_outdated(self) -> bool:
not path.exists(self.mo_path) or
path.getmtime(self.mo_path) < path.getmtime(self.po_path))

def write_mo(self, locale: str) -> None:
def write_mo(self, locale: str, use_fuzzy: bool = False) -> None:
with open(self.po_path, encoding=self.charset) as file_po:
try:
po = read_po(file_po, locale)
Expand All @@ -69,7 +69,7 @@ def write_mo(self, locale: str) -> None:

with open(self.mo_path, 'wb') as file_mo:
try:
write_mo(file_mo, po)
write_mo(file_mo, po, use_fuzzy)
except Exception as exc:
logger.warning(__('writing error: %s, %s'), self.mo_path, exc)

Expand Down
38 changes: 38 additions & 0 deletions tests/test_intl.py
Expand Up @@ -1301,6 +1301,44 @@ def getwarning(warnings):
return strip_escseq(warnings.getvalue().replace(os.sep, '/'))


@pytest.mark.sphinx('html', testroot='basic',
srcdir='gettext_allow_fuzzy_translations',
confoverrides={
'language': 'de',
'gettext_allow_fuzzy_translations': True
})
def test_gettext_allow_fuzzy_translations(app):
locale_dir = app.srcdir / 'locales' / 'de' / 'LC_MESSAGES'
locale_dir.makedirs()
with (locale_dir / 'index.po').open('wb') as f:
catalog = Catalog()
catalog.add('features', 'FEATURES', flags=('fuzzy',))
pofile.write_po(f, catalog)

app.build()
content = (app.outdir / 'index.html').read_text()
assert 'FEATURES' in content


@pytest.mark.sphinx('html', testroot='basic',
srcdir='gettext_disallow_fuzzy_translations',
confoverrides={
'language': 'de',
'gettext_allow_fuzzy_translations': False
})
def test_gettext_disallow_fuzzy_translations(app):
locale_dir = app.srcdir / 'locales' / 'de' / 'LC_MESSAGES'
locale_dir.makedirs()
with (locale_dir / 'index.po').open('wb') as f:
catalog = Catalog()
catalog.add('features', 'FEATURES', flags=('fuzzy',))
pofile.write_po(f, catalog)

app.build()
content = (app.outdir / 'index.html').read_text()
assert 'FEATURES' not in content


@pytest.mark.sphinx('html', testroot='basic', confoverrides={'language': 'de'})
def test_customize_system_message(make_app, app_params, sphinx_test_tempdir):
try:
Expand Down