@zhin.js/plugin-short-url 1.1.9 → 1.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,3 +22,9 @@ short-url: {}
22
22
  ## Configuration
23
23
 
24
24
  This plugin currently has no configuration fields. Its `plugin.ts` declares `config: Schema.object({})`, shared by Runtime validation and Console forms, and accepts an empty object; do not place package names in a `plugins` array.
25
+
26
+ ## Language / 语言
27
+
28
+ 命令说明和执行反馈跟随当前操作语言(简体中文或英文);用户输入与第三方内容保持原样,不进行自动翻译。语言与时区、权限和实际执行行为独立。参见[官方插件语言说明](../../README.md#语言与内容)。
29
+
30
+ Command feedback follows the operation language. User input and third-party content remain unchanged. See the [localization guide](../../../docs/en/configuration/localization.md).
@@ -1,19 +1,20 @@
1
1
  // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
2
  import { defineCommand } from 'zhin.js/command';
3
+ import { messages as t } from "../../../lib/i18n.js";
3
4
  import { expandUrl, isValidUrl } from "../../../lib/short-url-lib.js";
4
5
  export default defineCommand({
5
- description: '展开一个短链接,显示原始地址',
6
+ description: '展开一个短链接,显示原始地址', descriptionI18n: { en: "Expand a short link to its original URL" },
6
7
  params: { url: { type: 'string' } },
7
- async execute({ params }) {
8
+ async execute({ params, locale }) {
8
9
  const url = String(params.url ?? '');
9
10
  if (!isValidUrl(url))
10
- return '请提供有效的 HTTP/HTTPS 链接';
11
+ return t(locale, 'invalid');
11
12
  try {
12
- const original = await expandUrl(url);
13
- return `原始链接: ${original}`;
13
+ const original = await expandUrl(url, locale);
14
+ return t(locale, 'expanded', { url: original });
14
15
  }
15
16
  catch (e) {
16
- return `展开失败: ${e instanceof Error ? e.message : String(e)}`;
17
+ return t(locale, 'expandFailed', { detail: e instanceof Error ? e.message : String(e) });
17
18
  }
18
19
  },
19
20
  });
@@ -1,17 +1,18 @@
1
1
  import { defineCommand } from 'zhin.js/command';
2
+ import { messages as t } from '../../../src/i18n.js';
2
3
  import { expandUrl, isValidUrl } from '../../../src/short-url-lib.js';
3
4
 
4
5
  export default defineCommand({
5
- description: '展开一个短链接,显示原始地址',
6
+ description: '展开一个短链接,显示原始地址', descriptionI18n: { en: "Expand a short link to its original URL" },
6
7
  params: { url: { type: 'string' } },
7
- async execute({ params }) {
8
+ async execute({ params, locale }) {
8
9
  const url = String(params.url ?? '');
9
- if (!isValidUrl(url)) return '请提供有效的 HTTP/HTTPS 链接';
10
+ if (!isValidUrl(url)) return t(locale, 'invalid');
10
11
  try {
11
- const original = await expandUrl(url);
12
- return `原始链接: ${original}`;
12
+ const original = await expandUrl(url, locale);
13
+ return t(locale, 'expanded', { url: original });
13
14
  } catch (e: unknown) {
14
- return `展开失败: ${e instanceof Error ? e.message : String(e)}`;
15
+ return t(locale, 'expandFailed', { detail: e instanceof Error ? e.message : String(e) });
15
16
  }
16
17
  },
17
18
  });
@@ -1,19 +1,20 @@
1
1
  // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
2
  import { defineCommand } from 'zhin.js/command';
3
+ import { messages as t } from "../../../lib/i18n.js";
3
4
  import { isValidUrl, shortenUrl } from "../../../lib/short-url-lib.js";
4
5
  export default defineCommand({
5
- description: '缩短一个 URL',
6
+ description: '缩短一个 URL', descriptionI18n: { en: "Shorten a URL" },
6
7
  params: { url: { type: 'string' } },
7
- async execute({ params }) {
8
+ async execute({ params, locale }) {
8
9
  const url = String(params.url ?? '');
9
10
  if (!isValidUrl(url))
10
- return '请提供有效的 HTTP/HTTPS 链接';
11
+ return t(locale, 'invalid');
11
12
  try {
12
- const short = await shortenUrl(url);
13
- return `短链接: ${short}`;
13
+ const short = await shortenUrl(url, locale);
14
+ return t(locale, 'shortened', { url: short });
14
15
  }
15
16
  catch (e) {
16
- return `缩短失败: ${e instanceof Error ? e.message : String(e)}`;
17
+ return t(locale, 'shortFailed', { detail: e instanceof Error ? e.message : String(e) });
17
18
  }
18
19
  },
19
20
  });
@@ -1,17 +1,18 @@
1
1
  import { defineCommand } from 'zhin.js/command';
2
+ import { messages as t } from '../../../src/i18n.js';
2
3
  import { isValidUrl, shortenUrl } from '../../../src/short-url-lib.js';
3
4
 
4
5
  export default defineCommand({
5
- description: '缩短一个 URL',
6
+ description: '缩短一个 URL', descriptionI18n: { en: "Shorten a URL" },
6
7
  params: { url: { type: 'string' } },
7
- async execute({ params }) {
8
+ async execute({ params, locale }) {
8
9
  const url = String(params.url ?? '');
9
- if (!isValidUrl(url)) return '请提供有效的 HTTP/HTTPS 链接';
10
+ if (!isValidUrl(url)) return t(locale, 'invalid');
10
11
  try {
11
- const short = await shortenUrl(url);
12
- return `短链接: ${short}`;
12
+ const short = await shortenUrl(url, locale);
13
+ return t(locale, 'shortened', { url: short });
13
14
  } catch (e: unknown) {
14
- return `缩短失败: ${e instanceof Error ? e.message : String(e)}`;
15
+ return t(locale, 'shortFailed', { detail: e instanceof Error ? e.message : String(e) });
15
16
  }
16
17
  },
17
18
  });
package/lib/i18n.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const messages: (locale: import("@zhin.js/plugin-runtime").Locale | undefined, key: "toolInvalid" | "invalid" | "shortened" | "expanded" | "shortFailed" | "expandFailed" | "serviceError" | "noResult" | "expandError", values?: import("@zhin.js/plugin-runtime").MessageValues) => string;
2
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,8QAkCnB,CAAC"}
package/lib/i18n.js ADDED
@@ -0,0 +1,37 @@
1
+ import { createMessages } from 'zhin.js/i18n';
2
+ export const messages = createMessages({
3
+ toolInvalid: { 'zh-CN': '无效的 URL,需要 http:// 或 https:// 开头', en: 'Invalid URL; use http:// or https://' },
4
+ "invalid": {
5
+ "zh-CN": "请提供有效的 HTTP/HTTPS 链接",
6
+ "en": "Provide a valid HTTP or HTTPS URL."
7
+ },
8
+ "shortened": {
9
+ "zh-CN": "短链接: {url}",
10
+ "en": "Short URL: {url}"
11
+ },
12
+ "expanded": {
13
+ "zh-CN": "原始链接: {url}",
14
+ "en": "Original URL: {url}"
15
+ },
16
+ "shortFailed": {
17
+ "zh-CN": "缩短失败: {detail}",
18
+ "en": "Could not shorten the URL: {detail}"
19
+ },
20
+ "expandFailed": {
21
+ "zh-CN": "展开失败: {detail}",
22
+ "en": "Could not expand the URL: {detail}"
23
+ },
24
+ "serviceError": {
25
+ "zh-CN": "is.gd 返回 {status}",
26
+ "en": "is.gd returned HTTP {status}"
27
+ },
28
+ "noResult": {
29
+ "zh-CN": "缩短服务未返回链接",
30
+ "en": "The shortening service did not return a URL."
31
+ },
32
+ "expandError": {
33
+ "zh-CN": "无法展开链接 ({status})",
34
+ "en": "Could not expand the URL (HTTP {status})"
35
+ }
36
+ });
37
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC;IACrC,WAAW,EAAE,EAAE,OAAO,EAAE,kCAAkC,EAAE,EAAE,EAAE,sCAAsC,EAAE;IACxG,SAAS,EAAE;QACT,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,oCAAoC;KAC3C;IACD,WAAW,EAAE;QACX,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,kBAAkB;KACzB;IACD,UAAU,EAAE;QACV,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,qBAAqB;KAC5B;IACD,aAAa,EAAE;QACb,OAAO,EAAE,gBAAgB;QACzB,IAAI,EAAE,qCAAqC;KAC5C;IACD,cAAc,EAAE;QACd,OAAO,EAAE,gBAAgB;QACzB,IAAI,EAAE,oCAAoC;KAC3C;IACD,cAAc,EAAE;QACd,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,8BAA8B;KACrC;IACD,UAAU,EAAE;QACV,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,8CAA8C;KACrD;IACD,aAAa,EAAE;QACb,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,0CAA0C;KACjD;CACF,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
+ import type { Locale } from 'zhin.js/i18n';
1
2
  export declare function isValidUrl(input: string): boolean;
2
- export declare function shortenUrl(url: string): Promise<string>;
3
- export declare function expandUrl(url: string): Promise<string>;
3
+ export declare function shortenUrl(url: string, locale?: Locale): Promise<string>;
4
+ export declare function expandUrl(url: string, locale?: Locale): Promise<string>;
4
5
  //# sourceMappingURL=short-url-lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"short-url-lib.d.ts","sourceRoot":"","sources":["../src/short-url-lib.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO7D;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5D"}
1
+ {"version":3,"file":"short-url-lib.d.ts","sourceRoot":"","sources":["../src/short-url-lib.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO7E"}
@@ -1,3 +1,4 @@
1
+ import { messages as t } from './i18n.js';
1
2
  export function isValidUrl(input) {
2
3
  try {
3
4
  const u = new URL(input);
@@ -7,17 +8,17 @@ export function isValidUrl(input) {
7
8
  return false;
8
9
  }
9
10
  }
10
- export async function shortenUrl(url) {
11
+ export async function shortenUrl(url, locale) {
11
12
  const api = `https://is.gd/create.php?format=json&url=${encodeURIComponent(url)}`;
12
13
  const res = await fetch(api);
13
14
  if (!res.ok)
14
- throw new Error(`is.gd 返回 ${res.status}`);
15
+ throw new Error(t(locale, 'serviceError', { status: res.status }));
15
16
  const data = (await res.json());
16
17
  if (!data.shorturl)
17
- throw new Error(data.errormessage ?? '缩短失败');
18
+ throw new Error(data.errormessage ?? t(locale, 'noResult'));
18
19
  return data.shorturl;
19
20
  }
20
- export async function expandUrl(url) {
21
+ export async function expandUrl(url, locale) {
21
22
  // 不能用 redirect:'manual':undici 下返回 opaqueredirect(status 0、headers 空),
22
23
  // 拿不到 location。改为跟随重定向后比较最终 URL。
23
24
  const res = await fetch(url, { redirect: 'follow' });
@@ -25,6 +26,6 @@ export async function expandUrl(url) {
25
26
  return res.url;
26
27
  if (res.ok)
27
28
  return url;
28
- throw new Error(`无法展开链接 (${res.status})`);
29
+ throw new Error(t(locale, 'expandError', { status: res.status }));
29
30
  }
30
31
  //# sourceMappingURL=short-url-lib.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"short-url-lib.js","sourceRoot":"","sources":["../src/short-url-lib.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAG,4CAA4C,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqE,CAAC;IACpG,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,uEAAuE;IACvE,iCAAiC;IACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC/C,IAAI,GAAG,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;IACvB,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"short-url-lib.js","sourceRoot":"","sources":["../src/short-url-lib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,CAAC,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,MAAe;IAC3D,MAAM,GAAG,GAAG,4CAA4C,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqE,CAAC;IACpG,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,MAAe;IAC1D,uEAAuE;IACvE,iCAAiC;IACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC/C,IAAI,GAAG,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;IACvB,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/plugin-short-url",
3
- "version": "1.1.9",
3
+ "version": "1.1.10",
4
4
  "description": "URL shortener plugin for Zhin.js — shorten & expand URLs (Plugin Runtime)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -40,12 +40,12 @@
40
40
  "typescript": "^6.0.3",
41
41
  "vitest": "^4.1.10",
42
42
  "zod": "^4.4.3",
43
- "zhin.js": "1.1.15"
43
+ "zhin.js": "1.1.16"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "zod": "^4.0.0",
47
- "@zhin.js/command": "^1.1.10",
48
- "zhin.js": "^1.1.15"
47
+ "@zhin.js/command": "^1.1.11",
48
+ "zhin.js": "^1.1.16"
49
49
  },
50
50
  "peerDependenciesMeta": {
51
51
  "@zhin.js/command": {
@@ -90,8 +90,8 @@
90
90
  "plugins": []
91
91
  },
92
92
  "dependencies": {
93
- "@zhin.js/tool": "1.1.9",
94
- "@zhin.js/skill": "1.1.9"
93
+ "@zhin.js/tool": "1.1.10",
94
+ "@zhin.js/skill": "1.1.10"
95
95
  },
96
96
  "scripts": {
97
97
  "build": "tsc",
@@ -2,18 +2,19 @@
2
2
  import { defineAgentTool } from '@zhin.js/tool';
3
3
  import { z } from 'zod';
4
4
  import { isValidUrl, shortenUrl } from "../../../../lib/short-url-lib.js";
5
+ import { messages as t } from "../../../../lib/i18n.js";
5
6
  export default defineAgentTool({
6
7
  description: '缩短一个 URL,返回短链接',
7
8
  inputSchema: z.object({ url: z.string().min(1) }),
8
9
  keywords: ['短链', '缩短', 'shorten', 'short url'],
9
- async execute({ url }) {
10
+ async execute({ url }, context) {
10
11
  if (!isValidUrl(url))
11
- return '无效的 URL,需要 http:// 或 https:// 开头';
12
+ return t(context.locale, 'toolInvalid');
12
13
  try {
13
- return await shortenUrl(url);
14
+ return await shortenUrl(url, context.locale);
14
15
  }
15
16
  catch (e) {
16
- return `缩短失败: ${e instanceof Error ? e.message : String(e)}`;
17
+ return t(context.locale, 'shortFailed', { detail: e instanceof Error ? e.message : String(e) });
17
18
  }
18
19
  },
19
20
  });
@@ -1,17 +1,18 @@
1
1
  import { defineAgentTool } from '@zhin.js/tool';
2
2
  import { z } from 'zod';
3
3
  import { isValidUrl, shortenUrl } from '../../../../src/short-url-lib.js';
4
+ import { messages as t } from '../../../../src/i18n.js';
4
5
 
5
6
  export default defineAgentTool<{ url: string }>({
6
7
  description: '缩短一个 URL,返回短链接',
7
8
  inputSchema: z.object({ url: z.string().min(1) }),
8
9
  keywords: ['短链', '缩短', 'shorten', 'short url'],
9
- async execute({ url }) {
10
- if (!isValidUrl(url)) return '无效的 URL,需要 http:// 或 https:// 开头';
10
+ async execute({ url }, context) {
11
+ if (!isValidUrl(url)) return t(context.locale, 'toolInvalid');
11
12
  try {
12
- return await shortenUrl(url);
13
+ return await shortenUrl(url, context.locale);
13
14
  } catch (e: unknown) {
14
- return `缩短失败: ${e instanceof Error ? e.message : String(e)}`;
15
+ return t(context.locale, 'shortFailed', { detail: e instanceof Error ? e.message : String(e) });
15
16
  }
16
17
  },
17
18
  });
package/src/i18n.ts ADDED
@@ -0,0 +1,37 @@
1
+ import { createMessages } from 'zhin.js/i18n';
2
+
3
+ export const messages = createMessages({
4
+ toolInvalid: { 'zh-CN': '无效的 URL,需要 http:// 或 https:// 开头', en: 'Invalid URL; use http:// or https://' },
5
+ "invalid": {
6
+ "zh-CN": "请提供有效的 HTTP/HTTPS 链接",
7
+ "en": "Provide a valid HTTP or HTTPS URL."
8
+ },
9
+ "shortened": {
10
+ "zh-CN": "短链接: {url}",
11
+ "en": "Short URL: {url}"
12
+ },
13
+ "expanded": {
14
+ "zh-CN": "原始链接: {url}",
15
+ "en": "Original URL: {url}"
16
+ },
17
+ "shortFailed": {
18
+ "zh-CN": "缩短失败: {detail}",
19
+ "en": "Could not shorten the URL: {detail}"
20
+ },
21
+ "expandFailed": {
22
+ "zh-CN": "展开失败: {detail}",
23
+ "en": "Could not expand the URL: {detail}"
24
+ },
25
+ "serviceError": {
26
+ "zh-CN": "is.gd 返回 {status}",
27
+ "en": "is.gd returned HTTP {status}"
28
+ },
29
+ "noResult": {
30
+ "zh-CN": "缩短服务未返回链接",
31
+ "en": "The shortening service did not return a URL."
32
+ },
33
+ "expandError": {
34
+ "zh-CN": "无法展开链接 ({status})",
35
+ "en": "Could not expand the URL (HTTP {status})"
36
+ }
37
+ });
@@ -1,3 +1,6 @@
1
+ import type { Locale } from 'zhin.js/i18n';
2
+ import { messages as t } from './i18n.js';
3
+
1
4
  export function isValidUrl(input: string): boolean {
2
5
  try {
3
6
  const u = new URL(input);
@@ -7,20 +10,20 @@ export function isValidUrl(input: string): boolean {
7
10
  }
8
11
  }
9
12
 
10
- export async function shortenUrl(url: string): Promise<string> {
13
+ export async function shortenUrl(url: string, locale?: Locale): Promise<string> {
11
14
  const api = `https://is.gd/create.php?format=json&url=${encodeURIComponent(url)}`;
12
15
  const res = await fetch(api);
13
- if (!res.ok) throw new Error(`is.gd 返回 ${res.status}`);
16
+ if (!res.ok) throw new Error(t(locale, 'serviceError', { status: res.status }));
14
17
  const data = (await res.json()) as { shorturl?: string; errorcode?: number; errormessage?: string };
15
- if (!data.shorturl) throw new Error(data.errormessage ?? '缩短失败');
18
+ if (!data.shorturl) throw new Error(data.errormessage ?? t(locale, 'noResult'));
16
19
  return data.shorturl;
17
20
  }
18
21
 
19
- export async function expandUrl(url: string): Promise<string> {
22
+ export async function expandUrl(url: string, locale?: Locale): Promise<string> {
20
23
  // 不能用 redirect:'manual':undici 下返回 opaqueredirect(status 0、headers 空),
21
24
  // 拿不到 location。改为跟随重定向后比较最终 URL。
22
25
  const res = await fetch(url, { redirect: 'follow' });
23
26
  if (res.url && res.url !== url) return res.url;
24
27
  if (res.ok) return url;
25
- throw new Error(`无法展开链接 (${res.status})`);
28
+ throw new Error(t(locale, 'expandError', { status: res.status }));
26
29
  }