| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- class translation {
- /**
- * @var {string}
- * This is translated content.
- */
- #content;
-
- /**
- * @var {bool}
- * This is true, when content is translated from dict, and false
- * when could not being found.
- */
- #translated;
- /**
- * This create new translation. Translation store content of the
- * translation, make avairable to format translated phrase and also
- * store that translation was found in the phrasebook.
- *
- * @param {string} content - Content of the translation.
- * @param {bool} translated - True when translation could be found.
- */
- constructor(content, translated = true) {
- if (typeof(content) !== "string") {
- throw new TypeError("Translated content must be string.");
- }
- if (typeof(translated) !== "boolean") {
- throw new TypeError("Result of translation must be boolean.");
- }
- this.#content = content;
- this.#translated = translated;
- Object.freeze(this);
- }
- /**
- * This convert transiation to string.
- *
- * @returns {string} - Content of the translation.
- */
- toString() {
- return this.#content;
- }
- /**
- * @returns {string} - Content of the translation.
- */
- get text() {
- return this.#content;
- }
- /**
- * @returns {bool} - True when translation was found, false when not.
- */
- get valid() {
- return this.translated;
- }
- /**
- * This would format ready translation, with numbers, dats, and
- * other content, which could not being statically places into
- * translation. To use it, place name of content object key into
- * "#{}" in translation.
- *
- * @example ```
- * Translation: "I have more than #{how_many} apples!"
- * Object: { how_many: 10 }
- * Result: "I have more than 10 apples!"
- * ```
- *
- * @param {string} content
- * @returns {string}
- */
- format(content) {
- if (typeof(content) !== "object") {
- throw new TypeError("Content to format from must be object.");
- }
- if (!this.#translated) {
- return this.#content;
- }
- return this.#parse_format(content);
- }
- /**
- * This infill prepared translation with data from content
- * object.
- *
- * @see format
- *
- * @param {object} content - Content to load data from.
- * @returns {string} - Formater translation.
- */
- #parse_format(content) {
- let parts = this.#content.split("#{");
- let result = parts[0];
- for (let count = 1; count < parts.length; ++count) {
- const part = parts[count];
- const splited = part.split("}");
- if (splited.length === 1) {
- return result + splited[0];
- }
- const name = splited.splice(0, 1)[0].trim();
- const rest = splited.join("}");
- if (!(name in content)) {
- DEBUG: throw new RangeError(
- "Could not find \"" + name + "\"."
- );
-
- result += rest;
- continue;
- }
- result += content[name] + rest;
- }
- return result;
- }
- }
- exports.translation = translation;
|