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: fix missing gettext functions if translations aren't pulled in development environments #34416

Merged
merged 2 commits into from
Mar 27, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cms/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@
% endif

<script type="text/javascript" src="${static.url(jsi18n_path)}"></script>
% if settings.DEBUG:
## Provides a fallback for gettext functions in development environment
<script type="text/javascript" src="${static.url('js/src/gettext_fallback.js')}"></script>
% endif
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="path_prefix" content="${EDX_ROOT_URL}">
<%block name="header_meta"></%block>
Expand Down
132 changes: 132 additions & 0 deletions common/static/js/src/gettext_fallback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
'use strict';

/**
* This is a fallback file for the Django JavaScript internationalization library if the language gettext catalog
* is not available.
*/

(function(globals) {
const django = globals.django || (globals.django = {});

/* gettext library */
if (!django.jsi18n_initialized) {
django.catalog = django.catalog || {};

django.pluralidx = function(n) {
const v = (n != 1);
if (typeof v === 'boolean') {
return v ? 1 : 0;
} else {
return v;
}
};

django.gettext = function(msgid) {
const value = django.catalog[msgid];
if (typeof value === 'undefined') {
return msgid;
} else {
return (typeof value === 'string') ? value : value[0];
}
};

django.ngettext = function(singular, plural, count) {
const value = django.catalog[singular];
if (typeof value === 'undefined') {
return (count == 1) ? singular : plural;
} else {
return value.constructor === Array ? value[django.pluralidx(count)] : value;
}
};

django.gettext_noop = function(msgid) {
return msgid;
};

django.pgettext = function(context, msgid) {
let value = django.gettext(context + '\x04' + msgid);
if (value.includes('\x04')) {
value = msgid;
}
return value;
};

django.npgettext = function(context, singular, plural, count) {
let value = django.ngettext(context + '\x04' + singular, context + '\x04' + plural, count);
if (value.includes('\x04')) {
value = django.ngettext(singular, plural, count);
}
return value;
};

django.interpolate = function(fmt, obj, named) {
if (named) {
return fmt.replace(/%\(\w+\)s/g, function(match) {
return String(obj[match.slice(2, -2)])
});
} else {
return fmt.replace(/%s/g, function(match) {
return String(obj.shift())
});
}
};

/* formatting library */
django.formats = {
DATETIME_FORMAT: 'N j, Y, P',
DATETIME_INPUT_FORMATS: [
'%Y-%m-%d %H:%M:%S',
'%Y-%m-%d %H:%M:%S.%f',
'%Y-%m-%d %H:%M',
'%m/%d/%Y %H:%M:%S',
'%m/%d/%Y %H:%M:%S.%f',
'%m/%d/%Y %H:%M',
'%m/%d/%y %H:%M:%S',
'%m/%d/%y %H:%M:%S.%f',
'%m/%d/%y %H:%M',
'%Y-%m-%d'
],
DATE_FORMAT: 'N j, Y',
DATE_INPUT_FORMATS: [
'%Y-%m-%d',
'%m/%d/%Y',
'%m/%d/%y'
],
DECIMAL_SEPARATOR: '.',
FIRST_DAY_OF_WEEK: 0,
MONTH_DAY_FORMAT: 'F j',
NUMBER_GROUPING: 3,
SHORT_DATETIME_FORMAT: 'm/d/Y P',
SHORT_DATE_FORMAT: 'm/d/Y',
THOUSAND_SEPARATOR: ',',
TIME_FORMAT: 'P',
TIME_INPUT_FORMATS: [
'%H:%M:%S',
'%H:%M:%S.%f',
'%H:%M'
],
YEAR_MONTH_FORMAT: 'F Y'
};

django.get_format = function(format_type) {
const value = django.formats[format_type];
if (typeof value === 'undefined') {
return format_type;
} else {
return value;
}
};

/* add to global namespace */
globals.pluralidx = django.pluralidx;
globals.gettext = django.gettext;
globals.ngettext = django.ngettext;
globals.gettext_noop = django.gettext_noop;
globals.pgettext = django.pgettext;
globals.npgettext = django.npgettext;
globals.interpolate = django.interpolate;
globals.get_format = django.get_format;

django.jsi18n_initialized = true;
}
}(this));
4 changes: 4 additions & 0 deletions lms/templates/main.html
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@
</script>
% endif
<script type="text/javascript" src="${static.url(jsi18n_path)}"></script>
% if settings.DEBUG:
## Provides a fallback for gettext functions in development environment
<script type="text/javascript" src="${static.url('js/src/gettext_fallback.js')}"></script>
% endif
<script type="text/javascript" src="${static.url(ie11_fix_path)}"></script>
<% favicon_url = branding_api.get_favicon_url() %>
<link rel="icon" type="image/x-icon" href="${favicon_url}"/>
Expand Down
Loading