mirror of
https://github.com/discourse/discourse.git
synced 2024-11-28 12:45:40 +08:00
880311dd4d
- Themes can supply translation files in a format like `/locales/{locale}.yml`. These files should be valid YAML, with a single top level key equal to the locale being defined. For now these can only be defined using the `discourse_theme` CLI, importing a `.tar.gz`, or from a GIT repository. - Fallback is handled on a global level (if the locale is not defined in the theme), as well as on individual keys (if some keys are missing from the selected interface language). - Administrators can override individual keys on a per-theme basis in the /admin/customize/themes user interface. - Theme developers should access defined translations using the new theme prefix variables: JavaScript: `I18n.t(themePrefix("my_translation_key"))` Handlebars: `{{theme-i18n "my_translation_key"}}` or `{{i18n (theme-prefix "my_translation_key")}}` - To design for backwards compatibility, theme developers can check for the presence of the `themePrefix` variable in JavaScript - As part of this, the old `{{themeSetting.setting_name}}` syntax is deprecated in favour of `{{theme-setting "setting_name"}}`
70 lines
1.8 KiB
JavaScript
70 lines
1.8 KiB
JavaScript
import { get } from "discourse-common/lib/raw-handlebars";
|
|
|
|
export function htmlHelper(fn) {
|
|
return Ember.Helper.helper(function(...args) {
|
|
args =
|
|
args.length > 1 ? args[0].concat({ hash: args[args.length - 1] }) : args;
|
|
return new Handlebars.SafeString(fn.apply(this, args) || "");
|
|
});
|
|
}
|
|
|
|
const _helpers = {};
|
|
|
|
export function registerHelper(name, fn) {
|
|
_helpers[name] = Ember.Helper.helper(fn);
|
|
}
|
|
|
|
export function findHelper(name) {
|
|
return _helpers[name] || _helpers[name.dasherize()];
|
|
}
|
|
|
|
export function registerHelpers(registry) {
|
|
Object.keys(_helpers).forEach(name => {
|
|
registry.register(`helper:${name}`, _helpers[name], { singleton: false });
|
|
});
|
|
}
|
|
|
|
function resolveParams(ctx, options) {
|
|
let params = {};
|
|
const hash = options.hash;
|
|
|
|
if (hash) {
|
|
if (options.hashTypes) {
|
|
Object.keys(hash).forEach(function(k) {
|
|
const type = options.hashTypes[k];
|
|
if (type === "STRING" || type === "StringLiteral") {
|
|
params[k] = hash[k];
|
|
} else if (type === "ID" || type === "PathExpression") {
|
|
params[k] = get(ctx, hash[k], options);
|
|
}
|
|
});
|
|
} else {
|
|
params = hash;
|
|
}
|
|
}
|
|
return params;
|
|
}
|
|
|
|
export function registerUnbound(name, fn) {
|
|
const func = function(...args) {
|
|
const options = args.pop();
|
|
const properties = args;
|
|
|
|
for (let i = 0; i < properties.length; i++) {
|
|
if (
|
|
options.types &&
|
|
(options.types[i] === "ID" || options.types[i] === "PathExpression")
|
|
) {
|
|
properties[i] = get(this, properties[i], options);
|
|
}
|
|
}
|
|
|
|
return fn.call(this, ...properties, resolveParams(this, options));
|
|
};
|
|
|
|
_helpers[name] = Ember.Helper.extend({
|
|
compute: (params, args) => fn(...params, args)
|
|
});
|
|
Handlebars.registerHelper(name, func);
|
|
}
|