mirror of
https://github.com/frappe/books.git
synced 2025-01-03 15:17:30 +00:00
incr: type translation
This commit is contained in:
parent
0201844fd0
commit
d69dec1ca7
@ -1,4 +1,4 @@
|
|||||||
import NumberSeries from './NumberSeries.js';
|
import NumberSeries from './NumberSeries';
|
||||||
import SystemSettings from './SystemSettings';
|
import SystemSettings from './SystemSettings';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
import { pesa } from 'pesa';
|
|
||||||
|
|
||||||
export function slug(str) {
|
|
||||||
return str
|
|
||||||
.replace(/(?:^\w|[A-Z]|\b\w)/g, function (letter, index) {
|
|
||||||
return index == 0 ? letter.toLowerCase() : letter.toUpperCase();
|
|
||||||
})
|
|
||||||
.replace(/\s+/g, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getRandomString() {
|
|
||||||
return Math.random().toString(36).substr(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function sleep(seconds) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
setTimeout(resolve, seconds * 1000);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getQueryString(params) {
|
|
||||||
if (!params) return '';
|
|
||||||
let parts = [];
|
|
||||||
for (let key in params) {
|
|
||||||
if (key != null && params[key] != null) {
|
|
||||||
parts.push(
|
|
||||||
encodeURIComponent(key) + '=' + encodeURIComponent(params[key])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return parts.join('&');
|
|
||||||
}
|
|
||||||
|
|
||||||
export function asyncHandler(fn) {
|
|
||||||
return (req, res, next) =>
|
|
||||||
Promise.resolve(fn(req, res, next)).catch((err) => {
|
|
||||||
console.log(err);
|
|
||||||
// handle error
|
|
||||||
res.status(err.statusCode || 500).send({ error: err.message });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns array from 0 to n - 1
|
|
||||||
* @param {Number} n
|
|
||||||
*/
|
|
||||||
export function range(n) {
|
|
||||||
return Array(n)
|
|
||||||
.fill()
|
|
||||||
.map((_, i) => i);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function unique(list, key = (it) => it) {
|
|
||||||
var seen = {};
|
|
||||||
return list.filter((item) => {
|
|
||||||
var k = key(item);
|
|
||||||
return seen.hasOwnProperty(k) ? false : (seen[k] = true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getDuplicates(array) {
|
|
||||||
let duplicates = [];
|
|
||||||
for (let i in array) {
|
|
||||||
let previous = array[i - 1];
|
|
||||||
let current = array[i];
|
|
||||||
|
|
||||||
if (current === previous) {
|
|
||||||
if (!duplicates.includes(current)) {
|
|
||||||
duplicates.push(current);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return duplicates;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isPesa(value) {
|
|
||||||
return value instanceof pesa().constructor;
|
|
||||||
}
|
|
52
frappe/utils/index.ts
Normal file
52
frappe/utils/index.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import { pesa } from 'pesa';
|
||||||
|
|
||||||
|
export function slug(str: string) {
|
||||||
|
return str
|
||||||
|
.replace(/(?:^\w|[A-Z]|\b\w)/g, function (letter, index) {
|
||||||
|
return index == 0 ? letter.toLowerCase() : letter.toUpperCase();
|
||||||
|
})
|
||||||
|
.replace(/\s+/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRandomString() {
|
||||||
|
return Math.random().toString(36).substr(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function sleep(seconds: number) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
setTimeout(resolve, seconds * 1000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function range(n: number) {
|
||||||
|
return Array(n)
|
||||||
|
.fill(null)
|
||||||
|
.map((_, i) => i);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function unique(list: unknown[], key = (it: unknown) => String(it)) {
|
||||||
|
const seen: Record<string, boolean> = {};
|
||||||
|
return list.filter((item) => {
|
||||||
|
const k = key(item);
|
||||||
|
return seen.hasOwnProperty(k) ? false : (seen[k] = true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDuplicates(array: unknown[]) {
|
||||||
|
const duplicates: unknown[] = [];
|
||||||
|
for (const i in array) {
|
||||||
|
const previous = array[parseInt(i) - 1];
|
||||||
|
const current = array[i];
|
||||||
|
|
||||||
|
if (current === previous) {
|
||||||
|
if (!duplicates.includes(current)) {
|
||||||
|
duplicates.push(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return duplicates;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isPesa(value: unknown): boolean {
|
||||||
|
return value instanceof pesa().constructor;
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
import { LanguageMap } from 'utils/types';
|
||||||
import {
|
import {
|
||||||
getIndexFormat,
|
getIndexFormat,
|
||||||
getIndexList,
|
getIndexList,
|
||||||
@ -7,7 +8,13 @@ import {
|
|||||||
import { ValueError } from './errors';
|
import { ValueError } from './errors';
|
||||||
|
|
||||||
class TranslationString {
|
class TranslationString {
|
||||||
constructor(...args) {
|
args: TemplateStringsArray;
|
||||||
|
argList?: string[];
|
||||||
|
strList?: string[];
|
||||||
|
context?: string;
|
||||||
|
languageMap?: LanguageMap;
|
||||||
|
|
||||||
|
constructor(...args: TemplateStringsArray) {
|
||||||
this.args = args;
|
this.args = args;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15,12 +22,12 @@ class TranslationString {
|
|||||||
return this.toString();
|
return this.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx(context) {
|
ctx(context?: string) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
#formatArg(arg) {
|
#formatArg(arg: string) {
|
||||||
return arg ?? '';
|
return arg ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -29,16 +36,16 @@ class TranslationString {
|
|||||||
indexFormat = getWhitespaceSanitized(indexFormat);
|
indexFormat = getWhitespaceSanitized(indexFormat);
|
||||||
|
|
||||||
const translatedIndexFormat =
|
const translatedIndexFormat =
|
||||||
this.languageMap[indexFormat]?.translation ?? indexFormat;
|
this.languageMap![indexFormat]?.translation ?? indexFormat;
|
||||||
|
|
||||||
this.argList = getIndexList(translatedIndexFormat).map(
|
this.argList = getIndexList(translatedIndexFormat).map(
|
||||||
(i) => this.argList[i]
|
(i) => this.argList![i]
|
||||||
);
|
);
|
||||||
this.strList = getSnippets(translatedIndexFormat);
|
this.strList = getSnippets(translatedIndexFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
#stitch() {
|
#stitch() {
|
||||||
if (!(this.args[0] instanceof Array)) {
|
if (!((this.args[0] as any) instanceof Array)) {
|
||||||
throw new ValueError(
|
throw new ValueError(
|
||||||
`invalid args passed to TranslationString ${
|
`invalid args passed to TranslationString ${
|
||||||
this.args
|
this.args
|
||||||
@ -46,15 +53,14 @@ class TranslationString {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.strList = this.args[0];
|
this.strList = this.args[0] as any as string[];
|
||||||
this.argList = this.args.slice(1);
|
this.argList = this.args.slice(1);
|
||||||
|
|
||||||
if (this.languageMap) {
|
if (this.languageMap) {
|
||||||
this.#translate();
|
this.#translate();
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.strList
|
return this.strList!.map((s, i) => s + this.#formatArg(this.argList![i]))
|
||||||
.map((s, i) => s + this.#formatArg(this.argList[i]))
|
|
||||||
.join('')
|
.join('')
|
||||||
.replace(/\s+/g, ' ')
|
.replace(/\s+/g, ' ')
|
||||||
.trim();
|
.trim();
|
||||||
@ -73,14 +79,16 @@ class TranslationString {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function T(...args) {
|
export function T(...args: TemplateStringsArray): TranslationString {
|
||||||
|
// @ts-ignore
|
||||||
return new TranslationString(...args);
|
return new TranslationString(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function t(...args) {
|
export function t(...args: TemplateStringsArray): string {
|
||||||
|
// @ts-ignore
|
||||||
return new TranslationString(...args).s;
|
return new TranslationString(...args).s;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setLanguageMapOnTranslationString(languageMap) {
|
export function setLanguageMapOnTranslationString(languageMap: LanguageMap) {
|
||||||
TranslationString.prototype.languageMap = languageMap;
|
TranslationString.prototype.languageMap = languageMap;
|
||||||
}
|
}
|
@ -39,6 +39,7 @@
|
|||||||
"@types/assert": "^1.5.6",
|
"@types/assert": "^1.5.6",
|
||||||
"@types/electron-devtools-installer": "^2.2.0",
|
"@types/electron-devtools-installer": "^2.2.0",
|
||||||
"@types/lodash": "^4.14.179",
|
"@types/lodash": "^4.14.179",
|
||||||
|
"@types/luxon": "^2.3.1",
|
||||||
"@types/mocha": "^9.1.0",
|
"@types/mocha": "^9.1.0",
|
||||||
"@types/node": "^17.0.23",
|
"@types/node": "^17.0.23",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.15.1",
|
"@typescript-eslint/eslint-plugin": "^4.15.1",
|
||||||
|
@ -11,16 +11,14 @@ const fs = require('fs/promises');
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fetch = require('node-fetch').default;
|
const fetch = require('node-fetch').default;
|
||||||
const { splitCsvLine } = require('../scripts/helpers');
|
const { splitCsvLine } = require('../scripts/helpers');
|
||||||
|
import { LanguageMap } from '../utils/types';
|
||||||
|
|
||||||
const VALENTINES_DAY = 1644796800000;
|
const VALENTINES_DAY = 1644796800000;
|
||||||
|
|
||||||
type Translation = { translation: string; context?: string };
|
|
||||||
type TranslationMap = Record<string, Translation>;
|
|
||||||
|
|
||||||
export async function getLanguageMap(
|
export async function getLanguageMap(
|
||||||
code: string,
|
code: string,
|
||||||
isDevelopment: boolean = false
|
isDevelopment: boolean = false
|
||||||
): Promise<TranslationMap> {
|
): Promise<LanguageMap> {
|
||||||
const contents = await getContents(code, isDevelopment);
|
const contents = await getContents(code, isDevelopment);
|
||||||
return getMapFromContents(contents);
|
return getMapFromContents(contents);
|
||||||
}
|
}
|
||||||
@ -46,7 +44,7 @@ async function getContents(code: string, isDevelopment: boolean) {
|
|||||||
return contents;
|
return contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMapFromContents(contents: string): TranslationMap {
|
function getMapFromContents(contents: string): LanguageMap {
|
||||||
const lines: string[] = contents.split('\n').slice(1);
|
const lines: string[] = contents.split('\n').slice(1);
|
||||||
return lines
|
return lines
|
||||||
.map((l) => splitCsvLine(l) as string[])
|
.map((l) => splitCsvLine(l) as string[])
|
||||||
@ -62,7 +60,7 @@ function getMapFromContents(contents: string): TranslationMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return acc;
|
return acc;
|
||||||
}, {} as TranslationMap);
|
}, {} as LanguageMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getContentsIfExists(code: string): Promise<string> {
|
async function getContentsIfExists(code: string): Promise<string> {
|
||||||
|
2
utils/types.ts
Normal file
2
utils/types.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export type Translation = { translation: string; context?: string };
|
||||||
|
export type LanguageMap = Record<string, Translation>;
|
12
yarn.lock
12
yarn.lock
@ -1348,6 +1348,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.179.tgz#490ec3288088c91295780237d2497a3aa9dfb5c5"
|
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.179.tgz#490ec3288088c91295780237d2497a3aa9dfb5c5"
|
||||||
integrity sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==
|
integrity sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==
|
||||||
|
|
||||||
|
"@types/luxon@^2.3.1":
|
||||||
|
version "2.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.3.1.tgz#e34763178b46232e4c5f079f1706e18692415519"
|
||||||
|
integrity sha512-nAPUltOT28fal2eDZz8yyzNhBjHw1NEymFBP7Q9iCShqpflWPybxHbD7pw/46jQmT+HXOy1QN5hNTms8MOTlOQ==
|
||||||
|
|
||||||
"@types/mime@^1":
|
"@types/mime@^1":
|
||||||
version "1.3.2"
|
version "1.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
|
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
|
||||||
@ -7887,12 +7892,7 @@ minimatch@4.2.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
|
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
|
||||||
version "1.2.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
|
||||||
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
|
||||||
|
|
||||||
minimist@^1.2.6:
|
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
||||||
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
||||||
|
Loading…
Reference in New Issue
Block a user