scratch-blocks/core/scratch_msgs.js
chrisgarrity 5659036d91 Separate updating translations from generating src.
* setLocale uses Object.assign so any new keys in Blockly.Msg are maintained after changing locale. I.e. if a translation doesn’t exist in the translation English default will be used. In theory, it could end up with something other than English if the key is in one translation, but not another.
However, it’s unlikely as we’re pulling the translations from transifex and either they will all have the key (if the key exists in the `en.json` source on transifex), or none of them will have the key.

* translate script only generates `en` sources.
* translate:update script generates new scratch_msgs.js file. It will fail if the keys in the downloaded files don’t match the ones in messages.
2018-07-12 11:04:50 -04:00

85 lines
2.6 KiB
JavaScript

/**
* @license
* Visual Blocks Editor
*
* Copyright 2018 Google Inc.
* https://developers.google.com/blockly/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Scratch Messages singleton, with function to override Blockly.Msg values.
* @author chrisg@media.mit.edu (Chris Garrity)
*/
'use strict';
/**
* Name space for the ScratchMsgs singleton.
* Msg gets populated in the message files.
*/
goog.provide('Blockly.ScratchMsgs');
goog.require('Blockly.Msg');
/**
* The object containing messages for all locales - loaded from msg/scratch_msgs.
* @type {Object}
*/
Blockly.ScratchMsgs.locales = {};
/**
* The current locale.
* @type {String}
* @private
*/
Blockly.ScratchMsgs.currentLocale_ = 'en';
/**
* Change the Blockly.Msg strings to a new Locale
* Does not exist in Blockly, but needed in scratch-blocks
* @param {string} locale E.g., 'de', or 'zh-tw'
* @package
*/
Blockly.ScratchMsgs.setLocale = function(locale) {
if (Object.keys(Blockly.ScratchMsgs.locales).includes(locale)) {
Blockly.ScratchMsgs.currentLocale_ = locale;
Blockly.Msg = Object.assign({}, Blockly.Msg, Blockly.ScratchMsgs.locales[locale]);
} else {
// keep current locale
console.warn('Ignoring unrecognized locale: ' + locale);
}
};
/**
* Gets a localized message, for use in the Scratch VM with json init.
* Does not interpolate placeholders. Provided to allow default values in
* dynamic menus, for example, 'next backdrop', or 'random position'
* @param {string} msgId id for the message, key in Msg table.
* @param {string} defaultMsg string to use if the id isn't found.
* @param {string} useLocale optional locale to use in place of currentLocale_.
* @return {string} message with placeholders filled.
* @package
*/
Blockly.ScratchMsgs.translate = function(msgId, defaultMsg, useLocale) {
var locale = useLocale || Blockly.ScratchMsgs.currentLocale_;
if (Object.keys(Blockly.ScratchMsgs.locales).includes(locale)) {
var messages = Blockly.ScratchMsgs.locales[locale];
if (Object.keys(messages).includes(msgId)) {
return messages[msgId];
}
}
return defaultMsg;
};