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

feat: add i18n_js_namespace to support atlas - FC-0012 #81

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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()
Comment on lines +982 to +989
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd love to know the goal of adding this function? Do we really need a DummyTranslationService?

If it's a copy from the LTI Consumer XBlock, I'm afraid we should remove it.


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
24 changes: 24 additions & 0 deletions recommender/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""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
Loading