Skip to content

Commit

Permalink
feat: add i18n_js_namespace to support atlas - FC-0012
Browse files Browse the repository at this point in the history
  • Loading branch information
shadinaif committed Feb 28, 2024
1 parent c05fd61 commit 43d77e4
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 5 deletions.
31 changes: 28 additions & 3 deletions recommender/recommender.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
from xblock.reference.plugins import Filesystem
from xblockutils.resources import ResourceLoader

from recommender.utils import DummyTranslationService

# TODO: Should be updated once XBlocks and tracking logs have finalized APIs
# and documentation.
try:
Expand Down Expand Up @@ -278,6 +280,8 @@ class RecommenderXBlock(HelperXBlock):
'url', 'title', 'description', 'descriptionText'
]

i18n_js_namespace = 'RecommenderXBlockI18N'

def _get_onetime_url(self, filename):
"""
Return one time url for uploaded screenshot
Expand Down Expand Up @@ -949,9 +953,10 @@ def _construct_view_resource(self, resource):
return result

@staticmethod
def _get_statici18n_js_url(): # pragma: no cover
def _get_deprecated_i18n_js_url(): # pragma: no cover
"""
Returns the Javascript translation file for the currently selected language, if any found by `pkg_resources`
Returns the deprecated Javascript translation file for the currently selected language, if any found by
`pkg_resources`
"""
lang_code = translation.get_language()
if not lang_code:
Expand All @@ -963,6 +968,26 @@ def _get_statici18n_js_url(): # pragma: no cover
return text_js.format(lang_code=code)
return None

def _get_statici18n_js_url(self):
"""Return the JavaScript translation file provided by the XBlockI18NService."""
if url_getter_func := getattr(self.i18n_service, 'get_javascript_i18n_catalog_url', None):
if javascript_url := url_getter_func(self):
return javascript_url

if deprecated_url := self._get_deprecated_i18n_js_url():
return self.resource_string(deprecated_url)

return None

@property
def i18n_service(self):
""" Obtains translation service """
i18n_service = self.runtime.service(self, "i18n")
if i18n_service:
return i18n_service
else:
return DummyTranslationService()

def student_view(self, _context=None): # pylint: disable=unused-argument
"""
The primary view of the RecommenderXBlock, shown to students
Expand Down Expand Up @@ -1011,7 +1036,7 @@ def student_view(self, _context=None): # pylint: disable=unused-argument
frag.add_javascript(self.resource_string("static/js/src/jquery.tooltipster.min.js"))
statici18n_js_url = self._get_statici18n_js_url()
if statici18n_js_url:
frag.add_javascript(self.resource_string(statici18n_js_url))
frag.add_javascript(statici18n_js_url)
frag.add_javascript(self.resource_string("static/js/src/cats.js"))
frag.add_javascript(self.resource_string("static/js/src/recommender.js"))
frag.initialize_js('RecommenderXBlock', self.get_client_configuration())
Expand Down
23 changes: 23 additions & 0 deletions recommender/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Utils for the Recommender XBlock"""

def _(text):
"""
Make '_' a no-op so we can scrape strings
"""
return text


def ngettext_fallback(text_singular, text_plural, number):
""" Dummy `ngettext` replacement to make string extraction tools scrape strings marked for translation """
if number == 1:
return text_singular
else:
return text_plural


class DummyTranslationService:
"""
Dummy drop-in replacement for i18n XBlock service
"""
gettext = _
ngettext = ngettext_fallback
4 changes: 2 additions & 2 deletions translation_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
from __future__ import absolute_import
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
BASE_DIR = os.path.dirname(__file__)


# Quick-start development settings - unsuitable for production
Expand Down Expand Up @@ -81,7 +81,7 @@
('zh_CN', 'Chinese (China)'),
]

LOCALE_PATHS = [os.path.join(BASE_DIR, "locale")]
LOCALE_PATHS = [os.path.join(BASE_DIR, "recommender", "conf", "locale")]

STATICI18N_DOMAIN = 'text'
STATICI18N_NAMESPACE = 'RecommenderXBlockI18N'
Expand Down

0 comments on commit 43d77e4

Please sign in to comment.