tachybase_todo/packages/plugins/localization-management/src/server/resources.ts
YANG QIA 70d5b9e44b
feat: localization management (#2210)
* feat: init localization-management

* feat: resource api

* Merge branch 'main' into T-62

* chore: change name

* feat: basic feature

* feat: support filter & sync

* feat: support auto get texts afterSave

* Merge branch 'main' into T-62

* chore: upgrade

* fix: dependency

* fix: field type

* fix: type error

* chore: remove some translations

* feat: support extract text from menu

* chore: cache text keys

* chore: remove test key

* fix: issue of extracting menu titles

* feat: translate collections & fields name

* fix: remove unique of text

* refactor: improve cache

* chore: remove listeners after disable

* chore: translation

* fix: lang switch bug

* refactor: actions & filter

* fix: translation

* refactor: merge lang bundles at backend

* fix: style & field name

* fix: translate issues

* fix: cache bug

* fix: translation merge bug

* fix: translate issues

* fix: map translation

* fix: translation issues

* fix: card title bug

* feat: cover mobile client tabbar

* fix: menu title

* refactor: add locale plugin

* chore: merge locale plugin

* fix: map translation

* chore: remove no data

* style: change button style

* fix: sync bug

* docs: add README

* chore: change name

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-07-17 23:23:44 +08:00

79 lines
2.2 KiB
TypeScript

import { Cache, createCache } from '@nocobase/cache';
import { Database } from '@nocobase/database';
export default class Resources {
cache: Cache;
db: Database;
CACHE_KEY_PREFIX = 'localization:';
constructor(db: Database) {
this.cache = createCache();
this.db = db;
}
async getTexts() {
return await this.cache.wrap(`${this.CACHE_KEY_PREFIX}texts`, async () => {
return await this.db.getRepository('localizationTexts').find({
fields: ['id', 'module', 'text'],
raw: true,
});
});
}
async getTranslations(locale: string) {
return await this.cache.wrap(`${this.CACHE_KEY_PREFIX}translations:${locale}`, async () => {
return await this.db.getRepository('localizationTranslations').find({
fields: ['textId', 'translation'],
filter: { locale },
raw: true,
});
});
}
async getResources(locale: string) {
const [texts, translations] = await Promise.all([this.getTexts(), this.getTranslations(locale)]);
const resources = {};
const textsMap = texts.reduce((map, item) => {
map[item.id] = item;
return map;
}, {});
translations.forEach((item) => {
const text = textsMap[item.textId];
if (!text) {
return;
}
const module = text.module;
if (!resources[module]) {
resources[module] = {};
}
resources[module][text.text] = item.translation;
});
return resources;
}
async filterExists(texts: (string | { text: string })[]) {
let existTexts = await this.getTexts();
existTexts = existTexts.map((item) => item.text);
return texts.filter((text) => {
if (typeof text === 'string') {
return !existTexts.includes(text);
}
return !existTexts.includes(text.text);
});
}
async updateCacheTexts(texts: any[]) {
const newTexts = texts.map((text) => ({
id: text.id,
module: text.module,
text: text.text,
}));
const existTexts = await this.getTexts();
await this.cache.set(`${this.CACHE_KEY_PREFIX}texts`, [...existTexts, ...newTexts]);
}
async resetCache(locale: string) {
await this.cache.del(`${this.CACHE_KEY_PREFIX}translations:${locale}`);
}
}