diff --git a/README.md b/README.md
index 96eb92206..2ea11e9d8 100644
--- a/README.md
+++ b/README.md
@@ -131,6 +131,7 @@ Hydro 用户群:1085853538
- core: Settings: 支持使用 Schemastery
- ui: 更新系统设置页面样式
- import-qduoj: 修复 spj=null
+- core: 修复文件复制
### Breaking API Changes
@@ -141,6 +142,7 @@ Hydro 用户群:1085853538
- core: 移除 global.Hydro.service
- core: 移除 global.Hydro.ui.template
- core: 移除 global.Hydro.lib
+- core: 移除 String.prototype.translate (使用 app.i18n.translate)
## Hydro 4.19.0 / UI 4.57.0
diff --git a/packages/geoip/index.ts b/packages/geoip/index.ts
index 2fe923bb9..363183de7 100644
--- a/packages/geoip/index.ts
+++ b/packages/geoip/index.ts
@@ -22,7 +22,7 @@ export default class GeoIPService extends Service {
provider = 'MaxMind';
lookup(ip: string, locale: string): Result {
const res: any = reader.get(ip);
- if (!res) return { display: 'Unknown address'.translate(locale) };
+ if (!res) return { display: this.ctx.i18n.translate('Unknown address', [locale]) };
const ret: Result = { display: '' };
if (res.location) ret.location = res.location;
if (res.continent) ret.continent = res.continent.names[locale] || res.continent.names.en;
diff --git a/packages/hydrooj/src/lib/i18n.ts b/packages/hydrooj/src/lib/i18n.ts
index 71f0f42af..2652f1559 100644
--- a/packages/hydrooj/src/lib/i18n.ts
+++ b/packages/hydrooj/src/lib/i18n.ts
@@ -12,11 +12,6 @@ declare module '../service/bus' {
'app/i18n/update': (lang: string) => void;
}
}
-declare global {
- interface String {
- translate: (...languages: string[]) => string;
- }
-}
class I18nService extends Service {
constructor(ctx: Context) {
@@ -47,14 +42,14 @@ class I18nService extends Service {
if (languages[0]?.startsWith('en')) {
// For most use cases, source text equals to translated text in English.
// So if it doesn't exist, we should use the original text instead of fallback.
- return app.i18n.get(str, languages[0]) || app.i18n.get(str, 'en') || this.toString();
+ return this.get(str, languages[0]) || this.get(str, 'en') || this.toString();
}
for (const language of languages.filter(Boolean)) {
- const curr = app.i18n.get(str, language) || app.i18n.get(str, language.split('_')[0])
- || app.i18n.get(str, language.split('-')[0]);
+ const curr = this.get(str, language) || this.get(str, language.split('_')[0])
+ || this.get(str, language.split('-')[0]);
if (curr) return curr;
}
- return this.toString();
+ return str.toString();
}
}
@@ -64,20 +59,6 @@ export function apply(ctx: Context) {
ctx.i18n = new I18nService(ctx);
}
-String.prototype.translate = function translate(...languages: string[]) {
- if (languages[0]?.startsWith('en')) {
- // For most use cases, source text equals to translated text in English.
- // So if it doesn't exist, we should use the original text instead of fallback.
- return app.i18n.get(this, languages[0]) || app.i18n.get(this, 'en') || this.toString();
- }
- for (const language of languages.filter(Boolean)) {
- const curr = app.i18n.get(this, language) || app.i18n.get(this, language.split('_')[0])
- || app.i18n.get(this, language.split('-')[0]);
- if (curr) return curr;
- }
- return this.toString();
-};
-
function collect(lang: string) {
const s = translations[lang];
if (!(s instanceof Array)) return {};
diff --git a/packages/hydrooj/src/model/message.ts b/packages/hydrooj/src/model/message.ts
index 83e638316..e93f6d4fa 100644
--- a/packages/hydrooj/src/model/message.ts
+++ b/packages/hydrooj/src/model/message.ts
@@ -80,7 +80,7 @@ class MessageModel {
const targets = await user.getMulti({ priv: { $bitsAllSet: PRIV.PRIV_VIEW_SYSTEM_NOTIFICATION } })
.project({ _id: 1, viewLang: 1 }).toArray();
return Promise.all(targets.map(({ _id, viewLang }) => {
- const msg = message.translate(viewLang || system.get('server.language')).format(...args);
+ const msg = app.i18n.translate(message, [viewLang || system.get('server.language')]).format(...args);
return MessageModel.send(1, _id, msg, MessageModel.FLAG_RICHTEXT);
}));
}
diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts
index 416fdabd1..2853c3226 100644
--- a/packages/hydrooj/src/service/server.ts
+++ b/packages/hydrooj/src/service/server.ts
@@ -160,8 +160,8 @@ export async function apply(ctx: Context) {
if (!str) return '';
const lang = this.user?.viewLang || this.session?.viewLang;
const res = lang
- ? str.toString().translate(lang, ...this.context.acceptsLanguages())
- : str.toString().translate(...this.context.acceptsLanguages(), system.get('server.language'));
+ ? ctx.i18n.translate(str.toString(), [lang, ...this.context.acceptsLanguages()])
+ : ctx.i18n.translate(str.toString(), [...this.context.acceptsLanguages(), system.get('server.language')]);
return res;
},
paginate(cursor: FindCursor, page: number, key: string | number) {