2
0
mirror of https://github.com/frappe/books.git synced 2024-12-23 19:39:07 +00:00
books/frappe/utils/translation.js
18alantom 838ae87642 fix: error type
- allow translation string folding
2022-02-07 14:31:28 +05:30

91 lines
1.8 KiB
JavaScript

import { ValueError } from '../common/errors';
function stringReplace(str, args) {
if (!Array.isArray(args)) {
args = [args];
}
if (str == undefined) return str;
let unkeyed_index = 0;
return str.replace(/\{(\w*)\}/g, (match, key) => {
if (key === '') {
key = unkeyed_index;
unkeyed_index++;
}
if (key == +key) {
return args[key] !== undefined ? args[key] : match;
}
});
}
class TranslationString {
constructor(...args) {
this.args = args;
}
get s() {
return this.toString();
}
ctx(context) {
this.context = context;
return this;
}
#translate(segment) {
const startSpace = segment.match(/^\s+/)?.[0] ?? '';
const endSpace = segment.match(/\s+$/)?.[0] ?? '';
segment = segment.replace(/\s+/g, ' ').trim();
// TODO: implement translation backend
// segment = translate(segment)
return startSpace + segment + endSpace;
}
#formatArg(arg) {
return arg ?? '';
}
#stitch() {
if (typeof this.args[0] === 'string') {
return stringReplace(this.args[0], this.args.slice(1));
}
if (!(this.args[0] instanceof Array)) {
throw new ValueError(
`invalid args passed to TranslationString ${
this.args
} of type ${typeof this.args[0]}`
);
}
const strList = this.args[0];
const argList = this.args.slice(1);
return strList
.map((s, i) => this.#translate(s) + this.#formatArg(argList[i]))
.join('')
.replace(/\s+/g, ' ')
.trim();
}
toString() {
return this.#stitch();
}
toJSON() {
return this.#stitch();
}
valueOf() {
return this.#stitch();
}
}
export function T(...args) {
return new TranslationString(...args);
}
export function t(...args) {
return new TranslationString(...args).s;
}