mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-19 13:54:10 +00:00
Compare commits
427 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e670602f67 | |||
| 3ee17092ab | |||
| db0a650bd5 | |||
| 5678b9fadb | |||
| a99ccf4534 | |||
| 0bd603cc29 | |||
| 6a4c355b54 | |||
| 1a075f3ca5 | |||
| d4b618ed71 | |||
| 6d62e1ec80 | |||
| 3bdd1cbc0f | |||
| 600a20c822 | |||
| bbf20289db | |||
| 9a57fcd600 | |||
| d6bdf406aa | |||
| b98813f0b1 | |||
| dce2925ab9 | |||
| 86f9f1c06c | |||
| 5accb96fec | |||
| 8b83609103 | |||
| 74f4341e8d | |||
| c73416141b | |||
| 9f6084a2fb | |||
| cbd6715dd7 | |||
| d42f8f64c7 | |||
| 5330159fa8 | |||
| 34850e3d1c | |||
| e06a1bd4d9 | |||
| ab09c04bee | |||
| 39af292f6e | |||
| c951cc0afd | |||
| 80ea77ac6b | |||
| 544639ff92 | |||
| 9e58abb37d | |||
| 3b71cb1eee | |||
| 5d3fb27a19 | |||
| f73ce9be9e | |||
| d9e95fbbb7 | |||
| 132ced10a5 | |||
| d6c74efacb | |||
| 6229876ff5 | |||
| 9b0926efdc | |||
| 6faa261e3f | |||
| 03817cd427 | |||
| 3b2767aec9 | |||
| 8b3b8fd218 | |||
| 5d251563b3 | |||
| e6263ebb09 | |||
| 4dd315126b | |||
| 54da37d4bf | |||
| 5912717721 | |||
| 061b91a76e | |||
| 09bf76e10b | |||
| 59a6e3e0ac | |||
| aebe297429 | |||
| b5a6e2d60f | |||
| 11eb5834bb | |||
| e5cd73f7dd | |||
| 4237f7c2b9 | |||
| 54c9900997 | |||
| d786491be1 | |||
| af392959fa | |||
| 5f062a802c | |||
| 619627f100 | |||
| 989a108db9 | |||
| c85fb193f8 | |||
| 18b2564ac5 | |||
| 111aa922d7 | |||
| c06b63330e | |||
| d0771c2dbf | |||
| 3eeeed0c43 | |||
| 24920c93b4 | |||
| 2fc6e855d1 | |||
| 68be44a053 | |||
| 6364027ac2 | |||
| 0875ac4ca2 | |||
| 23a3cf609f | |||
| 40d4f496db | |||
| c47d7285b4 | |||
| e8d64606c8 | |||
| d95582fdcb | |||
| 8e4c481ffb | |||
| 1ebc06b1b4 | |||
| 5f13f37544 | |||
| ded42374d5 | |||
| 07963b3552 | |||
| 754b28382e | |||
| 0c1b19114c | |||
| 09fc1d2d13 | |||
| da34f490c8 | |||
| 85af7b16a2 | |||
| 9f93568fcf | |||
| b7ed1fc744 | |||
| 2713cce61e | |||
| 4e83977e7c | |||
| 07c6ad56ea | |||
| 6fb1a3ba90 | |||
| f04c789043 | |||
| 21b3b2a693 | |||
| ce97ffc0e0 | |||
| f0ebdacc00 | |||
| e864c9e44f | |||
| dc4d26d13f | |||
| aa5cb2953d | |||
| 0fc6f20840 | |||
| b75d81fa4e | |||
| cec6751bda | |||
| 319dfb21d5 | |||
| b3c67430e8 | |||
| 0186a4b01d | |||
| a1d98cb05b | |||
| beba396c8b | |||
| 16f3c0df75 | |||
| e99092e091 | |||
| f4329b81bb | |||
| d9d149de2a | |||
| b72fc88b3f | |||
| d06b0dbbcf | |||
| 31ea03382b | |||
| 2110a87422 | |||
| 2d0dde74c9 | |||
| 0973458529 | |||
| 208b07d417 | |||
| 52983de190 | |||
| 18f5834550 | |||
| a915507938 | |||
| c27bf79e0f | |||
| d59b44c042 | |||
| 7428a58303 | |||
| 0090bd715e | |||
| d7d38d338e | |||
| b6fd29787b | |||
| 0a184130dc | |||
| 706569e61c | |||
| 2cec8062f1 | |||
| 274f95a4a5 | |||
| 604e0cf1c8 | |||
| bf90eef3d4 | |||
| d8d56a6809 | |||
| ca9e1a124c | |||
| ae521e0d61 | |||
| 9179f63449 | |||
| 40271db7a1 | |||
| 9cfd816b50 | |||
| 64052762d1 | |||
| 6f10874617 | |||
| db681ac87d | |||
| f01327a796 | |||
| 9604523c51 | |||
| 0dc5e711bc | |||
| ce75257975 | |||
| a149391b0e | |||
| ace6d34d5f | |||
| 705e8f7090 | |||
| af52fb887a | |||
| 3688e5f3eb | |||
| f61f2ae589 | |||
| 9ac6f5fdc5 | |||
| 2eca77a535 | |||
| 3b5da54660 | |||
| b8ff536d14 | |||
| 4513f8ddd2 | |||
| 1ebd67e00f | |||
| e279bdfb93 | |||
| 515b7b1127 | |||
| 2edc83b79c | |||
| cc3a310717 | |||
| 8a9451a69e | |||
| 84cc9ef336 | |||
| 2e14d9ff18 | |||
| 2082eb2292 | |||
| 6c3ce6195d | |||
| acd29d7e4d | |||
| 3f7f964c1b | |||
| 7b45fc5831 | |||
| f97df5c05e | |||
| e2ce0e5f19 | |||
| 40b1630eec | |||
| cc7d13db30 | |||
| 83df1f4339 | |||
| 42242c0c24 | |||
| 3f8c6c50f3 | |||
| 024f65a47e | |||
| 18f757e925 | |||
| 33b5ac4bc8 | |||
| 55e177f0bd | |||
| b43f78eac5 | |||
| 8cb4096d27 | |||
| 034c68e251 | |||
| 2f4ed1a016 | |||
| 8bafec3d8b | |||
| 6b368c562d | |||
| 72c5d74041 | |||
| 93a6d89b02 | |||
| 59a555ab9e | |||
| 18f6f381c0 | |||
| 5df9feecfb | |||
| 0b8a3a2812 | |||
| ef0d6a3d3a | |||
| cedb98c3bf | |||
| f98e60b679 | |||
| 38cf8f28ac | |||
| 21333da8e7 | |||
| 8293741560 | |||
| bce556cd76 | |||
| 90f49a967f | |||
| a8ca5f78f7 | |||
| d89474a304 | |||
| 5c7775dc9f | |||
| 784128c96b | |||
| ae87e83e22 | |||
| 84c43d9091 | |||
| 6444f27751 | |||
| 4478e72d9c | |||
| 769c8871b7 | |||
| d6d4290b9e | |||
| 7e7ef23fb3 | |||
| eb65c57bfa | |||
| bf7744f93b | |||
| 34183041e4 | |||
| 93dda6bfee | |||
| ab34b9c400 | |||
| ff783b3fd4 | |||
| 977dff7201 | |||
| bedbb00ec4 | |||
| 61a9ae2b22 | |||
| b2f9b2288a | |||
| d9a93c996e | |||
| 69dbf4966d | |||
| 18bb4cb95d | |||
| 4717b8e945 | |||
| acc6efb778 | |||
| c9eeb26bcb | |||
| e9ea0ef92a | |||
| 173c091d54 | |||
| 7c1a52298b | |||
| fb742204e6 | |||
| bed9e7e797 | |||
| b25f669ca6 | |||
| d6316566f7 | |||
| a1520e643e | |||
| 1cc10d3f31 | |||
| fb37fd0ca1 | |||
| 99400b1ac2 | |||
| 7fa6e406d8 | |||
| 0bf2d38089 | |||
| 23a26a567f | |||
| bfced7f8ec | |||
| 5f097faa5f | |||
| 1b51e9deba | |||
| b298ec9c6d | |||
| af471ee9f4 | |||
| 978c7498e5 | |||
| 8181028c09 | |||
| 1b4ec2d1e4 | |||
| af9af15861 | |||
| 9708d90533 | |||
| b85ac86253 | |||
| 0d20305aac | |||
| 761420d6ef | |||
| 2356adb6cc | |||
| f632ed48d2 | |||
| e07605a6fe | |||
| bef203f8ff | |||
| 582aed80ac | |||
| da282c75d6 | |||
| 8fbc4e4a0a | |||
| bf037e333e | |||
| 0ab5195c11 | |||
| 7b779b2e5a | |||
| 06b3ee068d | |||
| fff1e4f10e | |||
| e486e15c64 | |||
| 1e332bec07 | |||
| 206cf8c645 | |||
| 9fc8a59458 | |||
| 067970d532 | |||
| 837bf8c461 | |||
| c0f77deeab | |||
| 392cdef720 | |||
| 1fbb302e25 | |||
| 5f81bcdea6 | |||
| bee3f8e456 | |||
| 1b239e229b | |||
| 749c90c105 | |||
| 9ed52c4135 | |||
| dcd1989faa | |||
| 3438c3de9f | |||
| d25ed06845 | |||
| e186e27d71 | |||
| a1b77bc7ac | |||
| d9a0cc5ca2 | |||
| 100f114e6b | |||
| 269c9a5faf | |||
| 8cfb934afd | |||
| 2fa471bb62 | |||
| 239f3e7154 | |||
| ed36d3b760 | |||
| aaf2045835 | |||
| 110f3c7b1e | |||
| 2ecf47f89b | |||
| 0d5a5f1e37 | |||
| d9f812a026 | |||
| e8ffde951f | |||
| e1e8416583 | |||
| ce1806b88a | |||
| 10fdf24bb4 | |||
| 8d2959f455 | |||
| 2036b75095 | |||
| a7facab0ca | |||
| c3526ac0f3 | |||
| 0c8c8cf83f | |||
| ba96c6d2f6 | |||
| 286c62660c | |||
| 3d286323c5 | |||
| cbf19e1c89 | |||
| d34130e8a6 | |||
| 46e376a0fd | |||
| efb6c9f350 | |||
| 598c840684 | |||
| 9d7975ee1f | |||
| e5a5c772e0 | |||
| 25d4a46550 | |||
| 8e8a2beee4 | |||
| 016c6360aa | |||
| 842cae1ae2 | |||
| 0e2a739e6a | |||
| 214d156e09 | |||
| fbed2713bb | |||
| 6d4d77a854 | |||
| b22d30e13b | |||
| 15b73b9627 | |||
| 89abb0e87c | |||
| 6030b1794d | |||
| 7a50256d04 | |||
| f1df8bd50b | |||
| a4bbd63abc | |||
| f11c7d2033 | |||
| 1751c4a644 | |||
| ceac3493e1 | |||
| cbdd083c8d | |||
| 73bae654e9 | |||
| 5e70f6de14 | |||
| e4734bf1a1 | |||
| f45ab6bc92 | |||
| b38bf6fb2e | |||
| 4eae151235 | |||
| 8a3158d781 | |||
| 9492b58531 | |||
| fc1b56fe0b | |||
| 9cb1b0fbb6 | |||
| f7c7b5ab53 | |||
| 8049af8b24 | |||
| 4d0814b536 | |||
| 4e29a9cb38 | |||
| 52a0333ea2 | |||
| a5dcd83431 | |||
| 5a442b1f84 | |||
| 8ef4e4114e | |||
| 6756812486 | |||
| ca77218968 | |||
| 76f47dfe27 | |||
| 0c770cb837 | |||
| 14002c32e9 | |||
| 5863c17793 | |||
| 7272fb0b19 | |||
| 4c22c8e4af | |||
| 5202895c8d | |||
| 6c2539b105 | |||
| 3db41e0deb | |||
| 5c1729eb4d | |||
| 6e0fdb87cf | |||
| 886e43b7fd | |||
| 8fd062b9af | |||
| 2856152a24 | |||
| cc24f08c34 | |||
| cc6cf4f4ab | |||
| c706e0cf85 | |||
| 44a2846983 | |||
| eddbea1180 | |||
| 52c526a216 | |||
| 5be282b591 | |||
| 4ffd13310d | |||
| 5b69b2c574 | |||
| 247028750d | |||
| d65c169663 | |||
| 102a47ac01 | |||
| ae794c9d17 | |||
| 3f3d2856b4 | |||
| 671ba275fc | |||
| bfd8f3d2bc | |||
| 5b9e3f906d | |||
| 40c748ec9e | |||
| 8c3c8d712f | |||
| 98e385a3d4 | |||
| 8f0e2f27aa | |||
| 55a4d9a7a9 | |||
| abe154d9c0 | |||
| 4a619725c2 | |||
| b4d5faff38 | |||
| db9a99fc72 | |||
| 07ff5acbb6 | |||
| 0b19fdd9bf | |||
| f0493b4cf1 | |||
| b25cf4c4c6 | |||
| 0a56d3cc90 | |||
| 43de4e47f7 | |||
| c0de93a2dd | |||
| b5c7cee5fe | |||
| 4c39157a29 | |||
| 9cf7c0a7de | |||
| 42d7f8cca8 | |||
| ae2f4c29e1 | |||
| 00e504d365 | |||
| 305483dacc | |||
| 04bb8273dc | |||
| 821c95d9d1 | |||
| ab603f95c3 | |||
| 870ac6aa45 | |||
| 216f367300 | |||
| 801c744522 | |||
| e92ea2c206 | |||
| e8e1c65503 | |||
| b6616a832f | |||
| 04020fc804 | |||
| 7519d6f3f1 | |||
| 27deea97cf |
@@ -1,959 +0,0 @@
|
||||
# createStaticStyles 迁移指南
|
||||
|
||||
## 📖 概述
|
||||
|
||||
`createStaticStyles` 是 `antd-style` 提供的静态样式创建函数,相比 `createStyles`(hook 方案)具有零运行时开销的优势。样式在模块加载时计算一次,而不是每次组件渲染时计算。
|
||||
|
||||
## 🎯 适用场景
|
||||
|
||||
### ✅ 可以优化的场景
|
||||
|
||||
1. **纯静态样式**:不依赖运行时动态值
|
||||
2. **使用标准 token**:所有 token 都在 `cssVar.json` 中有对应项
|
||||
3. **简单的条件逻辑**:可以通过静态样式拆分处理
|
||||
|
||||
### ❌ 无法优化的场景
|
||||
|
||||
1. **JS 计算函数**:`readableColor()`, `chroma()`, `mix()`, `calc()` 中使用 token 数值
|
||||
2. **复杂的动态 props**:需要运行时计算的复杂逻辑
|
||||
3. **动态 prefixCls**:需要运行时传入的类名前缀(但可以硬编码为 `'ant'`)
|
||||
|
||||
## 🔄 基本转换步骤
|
||||
|
||||
### 1. 样式文件转换
|
||||
|
||||
**之前(createStyles):**
|
||||
|
||||
```typescript
|
||||
import { createStyles } from 'antd-style';
|
||||
|
||||
export const useStyles = createStyles(({ css, token }) => {
|
||||
return {
|
||||
root: css`
|
||||
color: ${token.colorText};
|
||||
font-size: ${token.fontSize}px;
|
||||
`,
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
**之后(createStaticStyles):**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => {
|
||||
return {
|
||||
root: css`
|
||||
color: ${cssVar.colorText};
|
||||
font-size: ${cssVar.fontSize};
|
||||
`,
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
### 2. 组件文件转换
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
import { useStyles } from './style';
|
||||
|
||||
const Component = () => {
|
||||
const { styles, cx } = useStyles();
|
||||
return <div className={cx(styles.root, className)} />;
|
||||
};
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
import { cx } from 'antd-style';
|
||||
import { styles } from './style';
|
||||
|
||||
const Component = () => {
|
||||
return <div className={cx(styles.root, className)} />;
|
||||
};
|
||||
```
|
||||
|
||||
## 🛠️ 常见场景处理
|
||||
|
||||
### 场景 1: Token 转换
|
||||
|
||||
**规则:**
|
||||
|
||||
- `token.xxx` → `cssVar.xxx`
|
||||
- 注意:`cssVar.fontSize` 已经包含 `px` 单位,不需要再加 `px`
|
||||
|
||||
**示例:**
|
||||
|
||||
```typescript
|
||||
// ❌ 错误
|
||||
font-size: ${cssVar.fontSize}px; // cssVar.fontSize 已经是 "14px"
|
||||
|
||||
// ✅ 正确
|
||||
font-size: ${cssVar.fontSize}; // 直接使用
|
||||
```
|
||||
|
||||
**特殊情况 - calc ():**
|
||||
|
||||
```typescript
|
||||
// ❌ 错误
|
||||
calc(${token.fontSize}px * 2.5)
|
||||
|
||||
// ✅ 正确
|
||||
calc(${cssVar.fontSize} * 2.5) // cssVar.fontSize 已经包含单位
|
||||
```
|
||||
|
||||
### 场景 2: 动态 Props → CSS 变量
|
||||
|
||||
**适用:** 数值、字符串类型的 props
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 在样式文件中使用 CSS 变量(带默认值)
|
||||
2. 在组件中通过 `style` prop 设置 CSS 变量
|
||||
|
||||
**示例:**
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
export const styles = createStaticStyles(({ css }) => {
|
||||
return {
|
||||
root: css`
|
||||
width: var(--component-size, 24px);
|
||||
height: var(--component-size, 24px);
|
||||
`,
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
import { useMemo } from 'react';
|
||||
|
||||
const Component = ({ size = 24, style, ...rest }) => {
|
||||
const cssVariables = useMemo<Record<string, string>>(
|
||||
() => ({
|
||||
'--component-size': `${size}px`,
|
||||
}),
|
||||
[size],
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={styles.root}
|
||||
style={{
|
||||
...cssVariables,
|
||||
...style,
|
||||
}}
|
||||
{...rest}
|
||||
/>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Video`: `maxHeight`, `maxWidth`, `minHeight`, `minWidth`
|
||||
- `ScrollShadow`: `size`
|
||||
- `MaskShadow`: `size`
|
||||
- `ColorSwatches`: `size`
|
||||
- `Grid`: `rows`, `maxItemWidth`, `gap`
|
||||
- `Layout`: `headerHeight`
|
||||
- `Footer`: `contentMaxWidth`
|
||||
|
||||
### 场景 3: 布尔值 Props → 静态样式拆分
|
||||
|
||||
**适用:** 简单的布尔值 props(2-3 个)
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 创建所有可能的组合样式
|
||||
2. 运行时使用 `cx` 组合
|
||||
|
||||
**示例:**
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
export const styles = createStaticStyles(({ css }) => {
|
||||
return {
|
||||
root: css`
|
||||
/* base styles */
|
||||
`,
|
||||
root_closable_true: css`
|
||||
/* closable styles */
|
||||
`,
|
||||
root_closable_false: css`
|
||||
/* no closable styles */
|
||||
`,
|
||||
root_hasTitle_true: css`
|
||||
/* has title styles */
|
||||
`,
|
||||
root_hasTitle_false: css`
|
||||
/* no title styles */
|
||||
`,
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
const Component = ({ closable, hasTitle }) => {
|
||||
const className = cx(
|
||||
styles.root,
|
||||
styles[`root_closable_${!!closable}`],
|
||||
styles[`root_hasTitle_${!!hasTitle}`],
|
||||
);
|
||||
return <div className={className} />;
|
||||
};
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Alert`: `closable`, `hasTitle`, `showIcon` → 8 个组合(2×2×2)
|
||||
- `Image`: `alwaysShowActions` → 2 个样式
|
||||
- `StoryBook`: `noPadding` → 2 个样式
|
||||
|
||||
### 场景 4: isDarkMode → 静态样式拆分
|
||||
|
||||
**适用:** 依赖 `isDarkMode` 的条件样式
|
||||
|
||||
**有两种处理方式:**
|
||||
|
||||
#### 方式 A: 直接条件选择(简单场景)
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 创建 `Dark` 和 `Light` 两个静态样式
|
||||
2. 运行时根据 `theme.isDarkMode` 选择
|
||||
|
||||
**示例:**
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => {
|
||||
return {
|
||||
rootDark: css`
|
||||
background: ${cssVar.colorFillTertiary};
|
||||
color: ${cssVar.colorTextLightSolid};
|
||||
`,
|
||||
rootLight: css`
|
||||
background: ${cssVar.colorFillQuaternary};
|
||||
color: ${cssVar.colorText};
|
||||
`,
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
import { useThemeMode } from 'antd-style';
|
||||
|
||||
const Component = () => {
|
||||
const { isDarkMode } = useThemeMode();
|
||||
return (
|
||||
<div
|
||||
className={cx(
|
||||
isDarkMode ? styles.rootDark : styles.rootLight
|
||||
)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
#### 方式 B: 使用 cva 将 isDarkMode 作为 variant(推荐,适用于复杂场景)
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 创建 `Dark` 和 `Light` 两个静态样式
|
||||
2. 在 `cva` 中将 `isDarkMode` 作为 variant prop
|
||||
3. 运行时直接传入 `isDarkMode` 值
|
||||
|
||||
**示例:**
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
import { cva } from 'class-variance-authority';
|
||||
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => {
|
||||
return {
|
||||
filledDark: css`
|
||||
background: ${cssVar.colorFillTertiary};
|
||||
color: ${cssVar.colorTextLightSolid};
|
||||
`,
|
||||
filledLight: css`
|
||||
background: ${cssVar.colorFillQuaternary};
|
||||
color: ${cssVar.colorText};
|
||||
`,
|
||||
outlined: css`
|
||||
border: 1px solid ${cssVar.colorBorder};
|
||||
`,
|
||||
root: css`
|
||||
/* base styles */
|
||||
`,
|
||||
};
|
||||
});
|
||||
|
||||
export const variants = cva(styles.root, {
|
||||
defaultVariants: {
|
||||
isDarkMode: false,
|
||||
variant: 'filled',
|
||||
},
|
||||
variants: {
|
||||
isDarkMode: {
|
||||
false: null,
|
||||
true: null, // isDarkMode 本身不添加样式,通过 compoundVariants 组合
|
||||
},
|
||||
variant: {
|
||||
filled: null, // variant 本身不添加样式,通过 compoundVariants 组合
|
||||
outlined: styles.outlined,
|
||||
},
|
||||
},
|
||||
compoundVariants: [
|
||||
{
|
||||
class: styles.filledDark,
|
||||
isDarkMode: true,
|
||||
variant: 'filled',
|
||||
},
|
||||
{
|
||||
class: styles.filledLight,
|
||||
isDarkMode: false,
|
||||
variant: 'filled',
|
||||
},
|
||||
],
|
||||
});
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
import { useThemeMode } from 'antd-style';
|
||||
import { variants } from './style';
|
||||
|
||||
const Component = ({ variant = 'filled' }) => {
|
||||
const { isDarkMode } = useThemeMode();
|
||||
return (
|
||||
<div
|
||||
className={variants({ isDarkMode, variant })}
|
||||
/>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**优势:**
|
||||
|
||||
- ✅ 不需要 `useMemo` 动态创建 variants
|
||||
- ✅ 更符合 `cva` 的设计理念
|
||||
- ✅ 代码更简洁,性能更好
|
||||
- ✅ 类型安全,IDE 自动补全
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `TypewriterEffect`: `textDark` / `textLight`(方式 A)
|
||||
- `Collapse`: `filledDark` / `filledLight`(可优化为方式 B)
|
||||
- `Hotkey`: `inverseThemeDark` / `inverseThemeLight`(可优化为方式 B)
|
||||
- `GuideCard`: `filledDark` / `filledLight`(可优化为方式 B)
|
||||
- `GradientButton`: `buttonDark` / `buttonLight`(方式 A)
|
||||
|
||||
### 场景 5: responsive → 静态 responsive
|
||||
|
||||
**适用:** 使用响应式断点
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 导入静态 `responsive` from `antd-style`
|
||||
2. 使用 `responsive.sm` 替代 `responsive.mobile`
|
||||
3. 从 `createStyles` 参数中移除 `responsive`
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
import { createStyles } from 'antd-style';
|
||||
|
||||
export const useStyles = createStyles(({ css, responsive }) => ({
|
||||
root: css`
|
||||
${responsive.mobile} {
|
||||
padding: 12px;
|
||||
}
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
import { responsive } from 'antd-style';
|
||||
|
||||
export const styles = createStaticStyles(({ css }) => ({
|
||||
root: css`
|
||||
${responsive.sm} {
|
||||
padding: 12px;
|
||||
}
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**注意:**
|
||||
|
||||
- `responsive.mobile` → `responsive.sm`
|
||||
- 静态 `responsive` 提供:`xs`, `sm`, `md`, `lg`, `xl`, `xxl`
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Header`: `responsive.mobile` → `responsive.sm`
|
||||
- `FormModal`: `responsive.mobile` → `responsive.sm`
|
||||
- `Hero`: `responsive.mobile` → `responsive.sm`
|
||||
|
||||
### 场景 6: stylish → lobeStaticStylish
|
||||
|
||||
**适用:** 使用自定义 `stylish` 工具
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 导入 `lobeStaticStylish` from `@/styles`
|
||||
2. 替换 `stylish.xxx` → `lobeStaticStylish.xxx`
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
import { createStyles } from 'antd-style';
|
||||
|
||||
export const useStyles = createStyles(({ css, stylish }) => ({
|
||||
root: css`
|
||||
${stylish.blur};
|
||||
${stylish.variantFilled};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
|
||||
import { lobeStaticStylish } from '@/styles';
|
||||
|
||||
export const styles = createStaticStyles(({ css }) => ({
|
||||
root: css`
|
||||
${lobeStaticStylish.blur};
|
||||
${lobeStaticStylish.variantFilled};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Button`: `stylish.blur` → `lobeStaticStylish.blur`
|
||||
- `Hero`: `stylish.gradientAnimation` → `lobeStaticStylish.gradientAnimation`
|
||||
|
||||
### 场景 7: prefixCls → 硬编码
|
||||
|
||||
**适用:** 使用动态 `prefixCls` 参数
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 在文件顶部硬编码 `const prefixCls = 'ant'`
|
||||
2. 从 `createStyles` 参数中移除 `prefixCls`
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
export const useStyles = createStyles(({ css }, prefixCls: string) => ({
|
||||
root: css`
|
||||
.${prefixCls}-button {
|
||||
/* styles */
|
||||
}
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
const prefixCls = 'ant';
|
||||
|
||||
export const styles = createStaticStyles(({ css }) => ({
|
||||
root: css`
|
||||
.${prefixCls}-button {
|
||||
/* styles */
|
||||
}
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Alert`, `Collapse`, `FormModal`, `Image`, `Burger`, `DraggablePanel`, `DraggableSideNav`, `Toc`, `ColorSwatches`, `EmojiPicker`, `Form`, `awesome/Features`
|
||||
|
||||
### 场景 8: readableColor () → Token 替换
|
||||
|
||||
**适用:** 使用 `readableColor()` 计算对比色
|
||||
|
||||
**规则:**
|
||||
|
||||
- `readableColor(token.colorPrimary)` → `cssVar.colorTextLightSolid`(主色背景用白色文字)
|
||||
- `readableColor(token.colorTextQuaternary)` → `cssVar.colorText`(浅色背景用深色文字)
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
import { readableColor } from 'polished';
|
||||
|
||||
export const useStyles = createStyles(({ css, token }) => ({
|
||||
checked: css`
|
||||
background-color: ${token.colorPrimary};
|
||||
color: ${readableColor(token.colorPrimary)};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => ({
|
||||
checked: css`
|
||||
background-color: ${cssVar.colorPrimary};
|
||||
color: ${cssVar.colorTextLightSolid};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Checkbox`: `readableColor(token.colorPrimary)` → `cssVar.colorTextLightSolid`
|
||||
|
||||
### 场景 9: rgba () → color-mix ()
|
||||
|
||||
**适用:** 使用 `rgba()` 设置透明度
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 使用 CSS 原生的 `color-mix()` 函数
|
||||
2. 格式:`color-mix(in srgb, ${cssVar.xxx} alpha%, transparent)`
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
import { rgba } from 'polished';
|
||||
|
||||
export const useStyles = createStyles(({ css, token }) => ({
|
||||
root: css`
|
||||
background-color: ${rgba(token.colorBgLayout, 0.4)};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => ({
|
||||
root: css`
|
||||
background-color: color-mix(in srgb, ${cssVar.colorBgLayout} 40%, transparent);
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Header`: `rgba(cssVar.colorBgLayout, 0.4)` → `color-mix(...)`
|
||||
- `FormModal`: `rgba(cssVar.colorBgContainer, 0)` → `color-mix(...)`
|
||||
|
||||
### 场景 10: keyframes → css
|
||||
|
||||
**适用:** 使用 `keyframes` 创建动画
|
||||
|
||||
**步骤:**
|
||||
|
||||
1. 在 `createStaticStyles` 外部定义 `keyframes`
|
||||
2. 在样式内部使用
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
export const useStyles = createStyles(({ css, keyframes }) => {
|
||||
const spin = keyframes`
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
`;
|
||||
return {
|
||||
icon: css`
|
||||
animation: ${spin} 1s linear infinite;
|
||||
`,
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
import { keyframes } from 'antd-style';
|
||||
|
||||
const spin = keyframes`
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
`;
|
||||
|
||||
export const styles = createStaticStyles(({ css }) => ({
|
||||
icon: css`
|
||||
animation: ${spin} 1s linear infinite;
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `Icon`: `keyframes` 动画
|
||||
- `Skeleton`: `keyframes` shimmer 动画
|
||||
|
||||
## ⚠️ 反模式:避免使用 createVariants (isDarkMode)
|
||||
|
||||
**不推荐的做法:**
|
||||
|
||||
```typescript
|
||||
// ❌ 不推荐:在组件中动态创建 variants
|
||||
export const createVariants = (isDarkMode: boolean) =>
|
||||
cva(styles.root, {
|
||||
variants: {
|
||||
variant: {
|
||||
filled: isDarkMode ? styles.filledDark : styles.filledLight,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// 组件中
|
||||
const variants = useMemo(() => createVariants(isDarkMode), [isDarkMode]);
|
||||
```
|
||||
|
||||
**推荐的做法:**
|
||||
|
||||
将 `isDarkMode` 作为 `cva` 的 variant prop(见场景 4 方式 B),这样:
|
||||
|
||||
- ✅ 不需要 `useMemo` 动态创建
|
||||
- ✅ 更符合 `cva` 的设计理念
|
||||
- ✅ 代码更简洁,性能更好
|
||||
- ✅ 类型安全,IDE 自动补全
|
||||
|
||||
```typescript
|
||||
// ✅ 推荐:将 isDarkMode 作为 variant prop
|
||||
export const variants = cva(styles.root, {
|
||||
variants: {
|
||||
isDarkMode: {
|
||||
false: null,
|
||||
true: null,
|
||||
},
|
||||
variant: {
|
||||
filled: null,
|
||||
},
|
||||
},
|
||||
compoundVariants: [
|
||||
{
|
||||
class: styles.filledDark,
|
||||
isDarkMode: true,
|
||||
variant: 'filled',
|
||||
},
|
||||
{
|
||||
class: styles.filledLight,
|
||||
isDarkMode: false,
|
||||
variant: 'filled',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
// 组件中
|
||||
const { isDarkMode } = useThemeMode();
|
||||
const className = variants({ isDarkMode, variant: 'filled' });
|
||||
```
|
||||
|
||||
## ⚠️ 无法优化的场景
|
||||
|
||||
### 1. JS 计算函数
|
||||
|
||||
**无法优化:**
|
||||
|
||||
- `chroma()` - 颜色计算库
|
||||
- `readableColor()` - 需要运行时计算(但可以用 token 替代)
|
||||
- `mix()` - 颜色混合计算
|
||||
- `calc()` 中使用 token 数值进行复杂计算
|
||||
|
||||
**示例:**
|
||||
|
||||
```typescript
|
||||
// ❌ 无法优化
|
||||
const scale = chroma.bezier([token.colorText, backgroundColor]).scale().colors(6);
|
||||
```
|
||||
|
||||
### 2. 复杂的动态 Props
|
||||
|
||||
**无法优化:**
|
||||
|
||||
- 需要复杂计算的 props
|
||||
- 对象 / 数组类型的 props
|
||||
- 函数类型的 props
|
||||
|
||||
### 3. useTheme Hook
|
||||
|
||||
**无法优化:**
|
||||
|
||||
- 直接使用 `useTheme()` hook 获取运行时值
|
||||
- 例如:`awesome/Giscus/style.ts` 使用 `useTheme()` 获取主题值
|
||||
|
||||
## 📋 迁移检查清单
|
||||
|
||||
### 样式文件检查
|
||||
|
||||
- [ ] `createStyles` → `createStaticStyles`
|
||||
- [ ] `token.xxx` → `cssVar.xxx`
|
||||
- [ ] 移除 `px` 后缀(`cssVar` 已包含单位)
|
||||
- [ ] `responsive.mobile` → `responsive.sm`(如果使用)
|
||||
- [ ] `stylish.xxx` → `lobeStaticStylish.xxx`(如果使用)
|
||||
- [ ] `rgba()` → `color-mix()`(如果使用)
|
||||
- [ ] `readableColor()` → token 替换(如果使用)
|
||||
- [ ] `prefixCls` 参数 → 硬编码 `const prefixCls = 'ant'`(如果使用)
|
||||
- [ ] `isDarkMode` → 静态样式拆分(如果使用)
|
||||
- [ ] 动态 props → CSS 变量(如果使用)
|
||||
|
||||
### 组件文件检查
|
||||
|
||||
- [ ] `useStyles()` → `import { styles } from './style'`
|
||||
- [ ] `import { cx } from 'antd-style'`(如果需要)
|
||||
- [ ] `import { useTheme } from 'antd-style'`(如果需要 `theme.isDarkMode`)
|
||||
- [ ] 动态 props → CSS 变量设置(如果使用)
|
||||
- [ ] `isDarkMode` 条件 → `theme.isDarkMode` 判断(如果使用)
|
||||
|
||||
## 🎯 优化优先级
|
||||
|
||||
### 高优先级(简单优化)
|
||||
|
||||
1. ✅ 纯静态样式(无动态 props)
|
||||
2. ✅ `isDarkMode` 拆分
|
||||
3. ✅ `responsive.mobile` → `responsive.sm`
|
||||
4. ✅ `stylish` → `lobeStaticStylish`
|
||||
5. ✅ `readableColor()` → token 替换
|
||||
|
||||
### 中优先级(需要转换)
|
||||
|
||||
6. ✅ 简单的动态 props → CSS 变量(1-2 个)
|
||||
7. ✅ 布尔值 props → 静态样式拆分(2-3 个)
|
||||
|
||||
### 低优先级(复杂优化)
|
||||
|
||||
8. ⚠️ 多个动态 props → CSS 变量(3+ 个)
|
||||
9. ⚠️ 复杂的条件逻辑拆分
|
||||
|
||||
## 📚 参考示例
|
||||
|
||||
### 完整示例 1: 简单组件
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => ({
|
||||
root: css`
|
||||
padding: ${cssVar.padding};
|
||||
color: ${cssVar.colorText};
|
||||
border-radius: ${cssVar.borderRadius};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
import { cx } from 'antd-style';
|
||||
import { styles } from './style';
|
||||
|
||||
const Component = ({ className }) => {
|
||||
return <div className={cx(styles.root, className)} />;
|
||||
};
|
||||
```
|
||||
|
||||
### 完整示例 2: 带动态 Props
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => ({
|
||||
root: css`
|
||||
width: var(--component-size, 24px);
|
||||
height: var(--component-size, 24px);
|
||||
background: ${cssVar.colorBgContainer};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
import { cx } from 'antd-style';
|
||||
import { useMemo } from 'react';
|
||||
import { styles } from './style';
|
||||
|
||||
const Component = ({ size = 24, className, style, ...rest }) => {
|
||||
const cssVariables = useMemo<Record<string, string>>(
|
||||
() => ({
|
||||
'--component-size': `${size}px`,
|
||||
}),
|
||||
[size],
|
||||
);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cx(styles.root, className)}
|
||||
style={{
|
||||
...cssVariables,
|
||||
...style,
|
||||
}}
|
||||
{...rest}
|
||||
/>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
### 完整示例 3: 带 isDarkMode
|
||||
|
||||
**样式文件:**
|
||||
|
||||
```typescript
|
||||
import { createStaticStyles } from 'antd-style';
|
||||
|
||||
export const styles = createStaticStyles(({ css, cssVar }) => ({
|
||||
rootDark: css`
|
||||
background: ${cssVar.colorFillTertiary};
|
||||
color: ${cssVar.colorTextLightSolid};
|
||||
`,
|
||||
rootLight: css`
|
||||
background: ${cssVar.colorFillQuaternary};
|
||||
color: ${cssVar.colorText};
|
||||
`,
|
||||
}));
|
||||
```
|
||||
|
||||
**组件文件:**
|
||||
|
||||
```typescript
|
||||
import { cx, useTheme } from 'antd-style';
|
||||
import { styles } from './style';
|
||||
|
||||
const Component = ({ className }) => {
|
||||
const { theme } = useTheme();
|
||||
return (
|
||||
<div
|
||||
className={cx(
|
||||
theme.isDarkMode ? styles.rootDark : styles.rootLight,
|
||||
className
|
||||
)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
## 🔍 验证步骤
|
||||
|
||||
1. **类型检查:** `pnpm run type-check`
|
||||
2. **运行时测试:** 确保视觉效果一致
|
||||
3. **性能验证:** 检查样式计算是否在模块加载时完成
|
||||
|
||||
## 📊 优化效果
|
||||
|
||||
- ✅ **零运行时开销**:样式在模块加载时计算一次
|
||||
- ✅ **减少重新渲染**:组件不再依赖样式 hook
|
||||
- ✅ **更好的性能**:减少每次渲染的计算开销
|
||||
- ✅ **代码更简洁**:直接导入样式对象
|
||||
|
||||
## 🔧 场景 11: useTheme () → useThemeMode () /cssVar
|
||||
|
||||
**适用:** 组件中只使用 `theme.isDarkMode` 或其他 token 值
|
||||
|
||||
**规则:**
|
||||
|
||||
- 如果只使用 `theme.isDarkMode`,使用 `const { isDarkMode } = useThemeMode()` 替代
|
||||
- 如果使用其他 token(如 `theme.colorText`, `theme.borderRadius` 等),使用 `cssVar` 替代
|
||||
- `useThemeMode()` 比 `useTheme()` 更轻量,只返回 `isDarkMode` 值
|
||||
|
||||
**示例:**
|
||||
|
||||
**之前:**
|
||||
|
||||
```typescript
|
||||
import { useTheme } from 'antd-style';
|
||||
|
||||
const Component = () => {
|
||||
const theme = useTheme();
|
||||
return (
|
||||
<div className={theme.isDarkMode ? styles.dark : styles.light}>
|
||||
{theme.colorText}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**之后:**
|
||||
|
||||
```typescript
|
||||
import { cssVar, useThemeMode } from 'antd-style';
|
||||
|
||||
const Component = () => {
|
||||
const { isDarkMode } = useThemeMode();
|
||||
return (
|
||||
<div className={isDarkMode ? styles.dark : styles.light}>
|
||||
{cssVar.colorText}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**已优化示例:**
|
||||
|
||||
- `AuroraBackground`, `Select`, `Input`, `Button`, `DatePicker`, `AutoComplete`, `InputNumber`, `InputPassword`, `InputOPT`, `TextArea`, `SpotlightCardItem`, `Spotlight`, `HotkeyInput` - 只使用 `isDarkMode` → `useThemeMode()`
|
||||
- `Image`, `GradientButton`, `Empty`, `FileTypeIcon`, `FormSubmitFooter`, `CodeEditor`, `LobeChat`, `Drawer`, `Modal`, `Avatar`, `AvatarGroup`, `SkeletonAvatar`, `SkeletonButton`, `SkeletonTags`, `Callout`, `LobeHub`, `GridBackground`, `FolderIcon`, `FileIcon`, `TokenTag`, `ChatSendButton`, `AvatarUploader` - 使用 token → `cssVar`
|
||||
|
||||
**无法优化的文件(需要保留 `useTheme()`):**
|
||||
|
||||
- `useMermaid`, `useStreamMermaid`, `useHighlight`, `useStreamHighlight` - 需要完整的 theme 对象传给第三方库
|
||||
- `Alert`, `Tag`, `Menu`, `EmojiPicker` - 需要实际颜色值传给颜色计算函数
|
||||
- `SkeletonTitle`, `SkeletonTags` - 需要数值进行数学运算
|
||||
- `GridShowcase`, `GridBackground/demos` - 需要实际颜色值传给 `rgba()` 函数
|
||||
- `CustomFonts` - 需要实际字符串值进行字符串拼接
|
||||
- `Giscus/style.ts` - 需要实际颜色值传给 `readableColor()` 和 `rgba()` 函数(其他 token 已优化为 `cssVar`)
|
||||
|
||||
**注意事项:**
|
||||
|
||||
- `useThemeMode()` 只返回 `{ isDarkMode }`,不返回完整的 theme 对象
|
||||
- `cssVar` 的值是字符串(如 `"14px"`, `"#ffffff"`),可以直接在 JSX 中使用
|
||||
- 如果 token 需要用于数值计算(如 `Math.round(theme.fontSize * 1.5)`),需要保留 `useTheme()`
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
`createStaticStyles` 迁移是一个渐进式的优化过程。对于简单的静态样式,可以直接转换;对于复杂的动态场景,需要根据具体情况选择合适的优化策略。关键是要理解每种场景的处理方式,并灵活运用 CSS 变量、静态样式拆分等技术。
|
||||
|
||||
### useTheme () 优化总结
|
||||
|
||||
- ✅ **使用 `useThemeMode()`**:当组件只使用 `theme.isDarkMode` 时
|
||||
- ✅ **使用 `cssVar`**:当组件使用其他 token 值(颜色、尺寸等)时
|
||||
- ⚠️ **保留 `useTheme()`**:当 token 需要用于数值计算或传给第三方库时
|
||||
@@ -5,26 +5,20 @@ alwaysApply: false
|
||||
|
||||
# Database Migrations Guide
|
||||
|
||||
## Step1: Generate migrations
|
||||
## Step1: Generate migrations:
|
||||
|
||||
```bash
|
||||
bun run db:generate
|
||||
```
|
||||
|
||||
this step will generate following files:
|
||||
|
||||
- packages/database/migrations/0046_meaningless_file_name.sql
|
||||
- packages/database/migrations/0046_meaningless_file_name.sql
|
||||
|
||||
and update the following files:
|
||||
this step will generate or update the following files:
|
||||
|
||||
- packages/database/migrations/0046_xxx.sql
|
||||
- packages/database/migrations/meta/\_journal.json
|
||||
- packages/database/src/core/migrations.json
|
||||
- docs/development/database-schema.dbml
|
||||
|
||||
## Step2: optimize the migration sql fileName
|
||||
|
||||
the migration sql file name is randomly generated, we need to optimize the file name to make it more readable and meaningful. For example, `0046_meaningless_file_name.sql` -> `0046_user_add_avatar_column.sql`
|
||||
the migration sql file name is randomly generated, we need to optimize the file name to make it more readable and meaningful. For example, `0046_xxx.sql` -> `0046_better_auth.sql`
|
||||
|
||||
## Step3: Defensive Programming - Use Idempotent Clauses
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
---
|
||||
description:
|
||||
description:
|
||||
globs: src/database/schemas/*
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# Drizzle ORM Schema Style Guide for lobe-chat
|
||||
|
||||
This document outlines the conventions and best practices for defining PostgreSQL Drizzle ORM schemas within the lobe-chat project.
|
||||
@@ -17,8 +16,7 @@ This document outlines the conventions and best practices for defining PostgreSQ
|
||||
|
||||
## Helper Functions
|
||||
|
||||
Commonly used column definitions, especially for timestamps, are centralized in [src/database/schemas/\_helpers.ts](mdc:src/database/schemas/_helpers.ts):
|
||||
|
||||
Commonly used column definitions, especially for timestamps, are centralized in [src/database/schemas/_helpers.ts](mdc:src/database/schemas/_helpers.ts):
|
||||
- `timestamptz(name: string)`: Creates a timestamp column with timezone
|
||||
- `createdAt()`, `updatedAt()`, `accessedAt()`: Helper functions for standard timestamp columns
|
||||
- `timestamps`: An object `{ createdAt, updatedAt, accessedAt }` for easy inclusion in table definitions
|
||||
@@ -31,7 +29,6 @@ Commonly used column definitions, especially for timestamps, are centralized in
|
||||
## Column Definitions
|
||||
|
||||
### Primary Keys (PKs)
|
||||
|
||||
- Typically `text('id')` (or `varchar('id')` for some OIDC tables)
|
||||
- Often use `.$defaultFn(() => idGenerator('table_name'))` for automatic ID generation with meaningful prefixes
|
||||
- **ID Prefix Purpose**: Makes it easy for users and developers to distinguish different entity types at a glance
|
||||
@@ -39,29 +36,24 @@ Commonly used column definitions, especially for timestamps, are centralized in
|
||||
- Composite PKs are defined using `primaryKey({ columns: [t.colA, t.colB] })`
|
||||
|
||||
### Foreign Keys (FKs)
|
||||
|
||||
- Defined using `.references(() => otherTable.id, { onDelete: 'cascade' | 'set null' | 'no action' })`
|
||||
- FK columns are usually named `related_table_singular_name_id` (e.g., `user_id` references `users.id`)
|
||||
- Most tables include a `user_id` column referencing `users.id` with `onDelete: 'cascade'`
|
||||
|
||||
### Timestamps
|
||||
|
||||
- Consistently use the `...timestamps` spread from [\_helpers.ts](mdc:src/database/schemas/_helpers.ts) for `created_at`, `updated_at`, and `accessed_at` columns
|
||||
- Consistently use the `...timestamps` spread from [_helpers.ts](mdc:src/database/schemas/_helpers.ts) for `created_at`, `updated_at`, and `accessed_at` columns
|
||||
|
||||
### Default Values
|
||||
|
||||
- `.$defaultFn(() => expression)` for dynamic defaults (e.g., `idGenerator()`, `randomSlug()`)
|
||||
- `.default(staticValue)` for static defaults (e.g., `boolean('enabled').default(true)`)
|
||||
|
||||
### Indexes
|
||||
|
||||
- Defined in the table's second argument: `pgTable('name', {...columns}, (t) => ({ indexName: indexType().on(...) }))`
|
||||
- Use `uniqueIndex()` for unique constraints and `index()` for non-unique indexes
|
||||
- Naming pattern: `table_name_column(s)_idx` or `table_name_column(s)_unique`
|
||||
- Many tables feature a `clientId: text('client_id')` column, often part of a composite unique index with `user_id`
|
||||
|
||||
### Data Types
|
||||
|
||||
- Common types: `text`, `varchar`, `jsonb`, `boolean`, `integer`, `uuid`, `pgTable`
|
||||
- For `jsonb` fields, specify the TypeScript type using `.$type<MyType>()` for better type safety
|
||||
|
||||
@@ -105,7 +97,9 @@ export const agents = pgTable(
|
||||
...timestamps,
|
||||
},
|
||||
// return array instead of object, the object style is deprecated
|
||||
(t) => [uniqueIndex('client_id_user_id_unique').on(t.clientId, t.userId)],
|
||||
(t) => [
|
||||
uniqueIndex('client_id_user_id_unique').on(t.clientId, t.userId),
|
||||
],
|
||||
);
|
||||
|
||||
export const insertAgentSchema = createInsertSchema(agents);
|
||||
@@ -116,7 +110,6 @@ export type AgentItem = typeof agents.$inferSelect;
|
||||
## Common Patterns
|
||||
|
||||
### 1. userId + clientId Pattern (Legacy)
|
||||
|
||||
Some existing tables include both fields for different purposes:
|
||||
|
||||
```typescript
|
||||
@@ -136,7 +129,6 @@ clientIdUnique: uniqueIndex('agents_client_id_user_id_unique').on(t.clientId, t.
|
||||
- **Note**: This pattern is being phased out for new features to simplify the schema
|
||||
|
||||
### 2. Junction Tables (Many-to-Many Relationships)
|
||||
|
||||
Use composite primary keys for relationship tables:
|
||||
|
||||
```typescript
|
||||
@@ -144,26 +136,21 @@ Use composite primary keys for relationship tables:
|
||||
export const agentsKnowledgeBases = pgTable(
|
||||
'agents_knowledge_bases',
|
||||
{
|
||||
agentId: text('agent_id')
|
||||
.references(() => agents.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
knowledgeBaseId: text('knowledge_base_id')
|
||||
.references(() => knowledgeBases.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
userId: text('user_id')
|
||||
.references(() => users.id, { onDelete: 'cascade' })
|
||||
.notNull(),
|
||||
agentId: text('agent_id').references(() => agents.id, { onDelete: 'cascade' }).notNull(),
|
||||
knowledgeBaseId: text('knowledge_base_id').references(() => knowledgeBases.id, { onDelete: 'cascade' }).notNull(),
|
||||
userId: text('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
|
||||
enabled: boolean('enabled').default(true),
|
||||
...timestamps,
|
||||
},
|
||||
(t) => [primaryKey({ columns: [t.agentId, t.knowledgeBaseId] })],
|
||||
(t) => [
|
||||
primaryKey({ columns: [t.agentId, t.knowledgeBaseId] }),
|
||||
],
|
||||
);
|
||||
```
|
||||
|
||||
**Pattern**: `{entity1}Id` + `{entity2}Id` as composite PK, plus `userId` for ownership
|
||||
|
||||
### 3. OIDC Tables Special Patterns
|
||||
|
||||
OIDC tables use `varchar` IDs instead of `text` with custom generators:
|
||||
|
||||
```typescript
|
||||
@@ -179,7 +166,6 @@ export const oidcAuthorizationCodes = pgTable('oidc_authorization_codes', {
|
||||
**Reason**: OIDC standards expect specific ID formats and lengths
|
||||
|
||||
### 4. File Processing with Async Tasks
|
||||
|
||||
File-related tables reference async task IDs for background processing:
|
||||
|
||||
```typescript
|
||||
@@ -187,21 +173,17 @@ File-related tables reference async task IDs for background processing:
|
||||
export const files = pgTable('files', {
|
||||
// ... other fields
|
||||
chunkTaskId: uuid('chunk_task_id').references(() => asyncTasks.id, { onDelete: 'set null' }),
|
||||
embeddingTaskId: uuid('embedding_task_id').references(() => asyncTasks.id, {
|
||||
onDelete: 'set null',
|
||||
}),
|
||||
embeddingTaskId: uuid('embedding_task_id').references(() => asyncTasks.id, { onDelete: 'set null' }),
|
||||
// ...
|
||||
});
|
||||
```
|
||||
|
||||
**Purpose**:
|
||||
|
||||
**Purpose**:
|
||||
- Track file chunking progress (breaking files into smaller pieces)
|
||||
- Track embedding generation progress (converting text to vectors)
|
||||
- Allow querying task status and handling failures
|
||||
|
||||
### 5. Slug Pattern (Legacy)
|
||||
|
||||
Some entities include auto-generated slugs - this is legacy code:
|
||||
|
||||
```typescript
|
||||
@@ -213,6 +195,8 @@ slug: varchar('slug', { length: 100 })
|
||||
slugUserIdUnique: uniqueIndex('slug_user_id_unique').on(t.slug, t.userId),
|
||||
```
|
||||
|
||||
**Current usage**: Only used to identify default agents/sessions (legacy pattern) **Future refactor**: Will likely be replaced with `isDefault: boolean()` field **Note**: Avoid using slugs for new features - prefer explicit boolean flags for status tracking
|
||||
**Current usage**: Only used to identify default agents/sessions (legacy pattern)
|
||||
**Future refactor**: Will likely be replaced with `isDefault: boolean()` field
|
||||
**Note**: Avoid using slugs for new features - prefer explicit boolean flags for status tracking
|
||||
|
||||
By following these guidelines, maintain consistency, type safety, and maintainability across database schema definitions.
|
||||
|
||||
+150
-51
@@ -2,82 +2,181 @@
|
||||
globs: *.tsx
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# LobeChat Internationalization Guide
|
||||
|
||||
## Key Points
|
||||
|
||||
- Default language: Chinese (zh-CN), Framework: react-i18next
|
||||
- **Only edit files in `src/locales/default/`** - Never edit JSON files in `locales/`
|
||||
- Run `pnpm i18n` to generate all translations (or manually translate zh-CN/en-US for dev preview)
|
||||
- Default language: Chinese (zh-CN) as the source language
|
||||
- Supported languages: 18 languages including English, Japanese, Korean, Arabic, etc.
|
||||
- Framework: react-i18next with Next.js app router
|
||||
- Translation automation: @lobehub/i18n-cli for automatic translation, config file: .i18nrc.js
|
||||
- Never manually modify any json file. You can only modify files in `default` folder
|
||||
|
||||
## Key Naming Convention
|
||||
## Directory Structure
|
||||
|
||||
**Flat keys with dot notation** (not nested objects):
|
||||
```
|
||||
src/locales/
|
||||
├── default/ # Source language files (zh-CN)
|
||||
│ ├── index.ts # Namespace exports
|
||||
│ ├── common.ts # Common translations
|
||||
│ ├── chat.ts # Chat-related translations
|
||||
│ ├── setting.ts # Settings translations
|
||||
│ └── ... # Other namespace files
|
||||
└── resources.ts # Type definitions and language configuration
|
||||
|
||||
locales/ # Translation files
|
||||
├── en-US/ # English translations
|
||||
│ ├── common.json # Common translations
|
||||
│ ├── chat.json # Chat translations
|
||||
│ ├── setting.json # Settings translations
|
||||
│ └── ... # Other namespace JSON files
|
||||
├── ja-JP/ # Japanese translations
|
||||
│ ├── common.json
|
||||
│ ├── chat.json
|
||||
│ └── ...
|
||||
└── ... # Other language folders
|
||||
```
|
||||
|
||||
## Workflow for Adding New Translations
|
||||
|
||||
### 1. Adding New Translation Keys
|
||||
|
||||
Step 1: Add translation keys in the corresponding namespace files under src/locales/default directory
|
||||
|
||||
```typescript
|
||||
// ✅ Correct
|
||||
// Example: src/locales/default/common.ts
|
||||
export default {
|
||||
'alert.cloud.action': '立即体验',
|
||||
'clientDB.error.desc': '数据库初始化遇到问题',
|
||||
'sync.actions.sync': '立即同步',
|
||||
'sync.status.ready': '已连接',
|
||||
};
|
||||
|
||||
// ❌ Avoid: Nested objects
|
||||
export default {
|
||||
alert: { cloud: { action: '...' } },
|
||||
// ... existing keys
|
||||
newFeature: {
|
||||
title: '新功能标题',
|
||||
description: '功能描述文案',
|
||||
button: '操作按钮',
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
**Naming patterns:** `{feature}.{context}.{action|status}`
|
||||
|
||||
- `clientDB.modal.title` - Feature + context + property
|
||||
- `sync.actions.sync` - Feature + group + action
|
||||
- `sync.status.ready` - Feature + group + status
|
||||
|
||||
**Parameters:** Use `{{variableName}}` syntax
|
||||
```typescript
|
||||
'alert.cloud.desc': '我们提供 {{credit}} 额度积分',
|
||||
```
|
||||
|
||||
**Avoid key conflicts:** Don't use both a leaf key and its parent path
|
||||
Step 2: If creating a new namespace, export it in src/locales/default/index.ts
|
||||
|
||||
```typescript
|
||||
// ❌ Conflict: clientDB.solve exists as both leaf and parent
|
||||
'clientDB.solve': '自助解决',
|
||||
'clientDB.solve.backup.title': '数据备份',
|
||||
import newNamespace from './newNamespace';
|
||||
|
||||
// ✅ Solution: Use different suffixes
|
||||
'clientDB.solve.action': '自助解决',
|
||||
'clientDB.solve.backup.title': '数据备份',
|
||||
const resources = {
|
||||
// ... existing namespaces
|
||||
newNamespace,
|
||||
} as const;
|
||||
```
|
||||
|
||||
## Workflow
|
||||
### 2. Translation Process
|
||||
|
||||
1. Add keys to `src/locales/default/{namespace}.ts`
|
||||
2. Export new namespace in `src/locales/default/index.ts`
|
||||
3. For dev preview: manually translate `locales/zh-CN/{namespace}.json` and `locales/en-US/{namespace}.json`
|
||||
4. Run `pnpm i18n` to generate all languages (CI handles this automatically)
|
||||
Development mode:
|
||||
|
||||
## Usage
|
||||
Generally, you don't need to help me run the automatic translation tool as it takes a long time. I'll run it myself when needed. However, to see immediate results, you still need to translate `locales/zh-CN/namespace.json` first, no need to translate other languages.
|
||||
|
||||
Production mode:
|
||||
|
||||
```bash
|
||||
# Generate translations for all languages
|
||||
npm run i18n
|
||||
```
|
||||
|
||||
## Usage in Components
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```tsx
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
const { t } = useTranslation('common');
|
||||
const MyComponent = () => {
|
||||
const { t } = useTranslation('common');
|
||||
|
||||
// Basic
|
||||
t('newFeature.title')
|
||||
// With parameters
|
||||
t('alert.cloud.desc', { credit: '1000' })
|
||||
// Multiple namespaces
|
||||
const { t } = useTranslation(['common', 'chat']);
|
||||
t('common:save')
|
||||
return (
|
||||
<div>
|
||||
<h1>{t('newFeature.title')}</h1>
|
||||
<p>{t('newFeature.description')}</p>
|
||||
<button>{t('newFeature.button')}</button>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
## Available Namespaces
|
||||
### Usage with Parameters
|
||||
|
||||
auth, authError, changelog, chat, clerk, color, **common**, components, discover, editor, electron, error, file, home, hotkey, image, knowledgeBase, labs, marketAuth, memory, metadata, migration, modelProvider, models, oauth, onboarding, plugin, portal, providers, ragEval, **setting**, subscription, thread, tool, topic, welcome
|
||||
```tsx
|
||||
const { t } = useTranslation('common');
|
||||
|
||||
**Most used:** `common` (shared UI), `chat` (chat features), `setting` (settings)
|
||||
<p>{t('welcome.message', { name: 'John' })}</p>;
|
||||
|
||||
// Corresponding language file:
|
||||
// welcome: { message: 'Welcome {{name}}!' }
|
||||
```
|
||||
|
||||
### Multiple Namespaces
|
||||
|
||||
```tsx
|
||||
const { t } = useTranslation(['common', 'chat']);
|
||||
|
||||
<button>{t('common:save')}</button>
|
||||
<span>{t('chat:typing')}</span>
|
||||
```
|
||||
|
||||
## Type Safety
|
||||
|
||||
The project uses TypeScript to implement type-safe translations, with types automatically generated from src/locales/resources.ts:
|
||||
|
||||
```typescript
|
||||
import type { DefaultResources, Locales, NS } from '@/locales/resources';
|
||||
|
||||
// Available types:
|
||||
// - NS: Available namespace keys ('common' | 'chat' | 'setting' | ...)
|
||||
// - Locales: Supported language codes ('en-US' | 'zh-CN' | 'ja-JP' | ...)
|
||||
|
||||
const namespace: NS = 'common';
|
||||
const locale: Locales = 'en-US';
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Namespace Organization
|
||||
|
||||
- common: Shared UI elements (buttons, labels, actions)
|
||||
- chat: Chat-specific functionality
|
||||
- setting: Configuration and settings
|
||||
- error: Error messages and handling
|
||||
- [feature]: Feature-specific or page-specific namespaces
|
||||
- components: Reusable component text
|
||||
|
||||
### 2. Key Naming Conventions
|
||||
|
||||
```typescript
|
||||
// ✅ Good: Hierarchical structure
|
||||
export default {
|
||||
modal: {
|
||||
confirm: {
|
||||
title: '确认操作',
|
||||
message: '确定要执行此操作吗?',
|
||||
actions: {
|
||||
confirm: '确认',
|
||||
cancel: '取消',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// ❌ Avoid: Flat structure
|
||||
export default {
|
||||
modalConfirmTitle: '确认操作',
|
||||
modalConfirmMessage: '确定要执行此操作吗?',
|
||||
};
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Missing Translation Keys
|
||||
|
||||
- Check if the key exists in src/locales/default/namespace.ts
|
||||
- Ensure the namespace is correctly imported in the component
|
||||
- Ensure new namespaces are exported in src/locales/default/index.ts
|
||||
|
||||
- 检查键是否存在于 src/locales/default/namespace.ts 中
|
||||
- 确保在组件中正确导入命名空间
|
||||
- 确保新命名空间已在 src/locales/default/index.ts 中导出
|
||||
|
||||
@@ -1,146 +0,0 @@
|
||||
---
|
||||
globs: src/locales/default/*
|
||||
alwaysApply: false
|
||||
---
|
||||
你是「LobeHub」的中文 UI 文案与微文案(microcopy)专家。LobeHub 是一个助理工作空间:用户可以创建助理与群组,让人和助理、助理和助理协作,提升日常生产与生活效率。产品气质:外表年轻、亲和、现代;内核专业、可靠、强调生产力与可控性。整体风格参考 Notion / Figma / Apple / Discord / OpenAI / Gemini:清晰克制、可信、有人情味但不油腻。
|
||||
|
||||
产品 slogan:**For Collaborative Agents**。你的文案要让用户持续感到:LobeHub 的重点不是“生成”,而是“协作的助理体系”(可共享上下文、可追踪、可回放、可演进、人在回路)。
|
||||
|
||||
---
|
||||
|
||||
### 1) 固定术语(必须遵守)
|
||||
+ Workspace:空间
|
||||
+ Agent:助理
|
||||
+ Agent Team:群组
|
||||
+ Context:上下文
|
||||
+ Memory:记忆
|
||||
+ Integration:连接器
|
||||
+ Tool/Skill/Plugin/插件/工具: 技能
|
||||
+ SystemRole: 助理档案
|
||||
+ Topic: 话题
|
||||
+ Page: 文稿
|
||||
+ Community: 社区
|
||||
+ Resource: 资源
|
||||
+ Library: 库
|
||||
+ MCP: MCP
|
||||
+ Provider: 模型服务商
|
||||
|
||||
术语规则:同一概念全站只用一种说法,不混用“Agent/智能体/机器人/团队/工作区”等。
|
||||
|
||||
---
|
||||
|
||||
### 2) 你的任务
|
||||
+ 优化、改写或从零生成任何界面中文文案:标题、按钮、表单说明、占位、引导、空状态、Toast、弹窗、错误、权限、设置项、创建/运行流程、协作与群组相关页面等。
|
||||
+ 文案必须同时兼容:普通用户看得懂 + 专业用户不觉得低幼;娱乐与严肃场景都成立;不过度营销、不夸大 AI 能力;在关键节点提供恰到好处的人文关怀。
|
||||
|
||||
---
|
||||
|
||||
### 3) 品牌三原则(内化到结构与措辞)
|
||||
+ **Create(创建)**:一句话创建助理;从想法到可用;清楚下一步。
|
||||
+ **Collaborate(协作)**:多助理协作;群组对齐信息与产出;共享上下文(可控、可管理)。
|
||||
+ **Evolve(演进)**:助理可在你允许的范围内记住偏好;随你的工作方式变得更顺手;强调可解释、可设置、可回放。
|
||||
|
||||
---
|
||||
|
||||
### 4) 写作规则(可执行)
|
||||
1. **清晰优先**:短句、强动词、少形容词;避免口号化与空泛承诺(如“颠覆”“史诗级”“100%”)。
|
||||
2. **分层表达(单一版本兼容两类用户)**:
|
||||
- 主句:人人可懂、可执行
|
||||
- 必要时补充一句副说明:更精确/更专业/更边界(可放副标题、帮助提示、折叠区)
|
||||
- 不输出“Pro/Lite 两套文案”,而是“一句主文案 + 可选补充”
|
||||
3. **术语克制但准确**:能说“连接/运行/上下文”就不要堆砌术语;必须出现专业词时给一句白话解释。
|
||||
4. **一致性**:同一动作按钮尽量固定动词(创建/连接/运行/暂停/重试/查看详情/清除记忆等)。
|
||||
5. **可行动**:每条提示都要让用户知道下一步;按钮避免“确定/取消”泛化,改成更具体的动作。
|
||||
6. **中文本地化**:符合中文阅读节奏;中英混排规范;避免翻译腔。
|
||||
|
||||
---
|
||||
|
||||
### 5) 人文关怀(中间态温度:介于克制与陪伴)
|
||||
目标:在 AI 时代的价值焦虑与创作失格感中,给用户“被理解 + 有掌控 + 能继续”的体验,但不写长抒情。
|
||||
|
||||
#### 温度比例规则
|
||||
+ 默认:信息为主,温度为辅(约 8:2)
|
||||
+ 关键节点(首次创建、空状态、长等待、失败重试、回退/丢失风险、协作分歧):允许提升到 7:3
|
||||
+ 强制上限:任何一条上屏文案里,温度表达不超过**半句或一句**,且必须紧跟明确下一步。
|
||||
|
||||
#### 表达顺序(必须遵守)
|
||||
1. 先承接处境(不评判):如“没关系/先这样也可以/卡住很正常”
|
||||
2. 再给掌控感(人在回路):可暂停/可回放/可编辑/可撤销/可清除记忆/可查看上下文
|
||||
3. 最后给下一步(按钮/路径明确)
|
||||
|
||||
#### 避免
|
||||
+ 鸡汤式说教(如“别焦虑”“要相信未来”)
|
||||
+ 宏大叙事与文学排比
|
||||
+ 过度拟人(不承诺助理“理解你/有情绪/永远记得你”)
|
||||
|
||||
#### 核心立场
|
||||
+ 助理很强,但它替代不了你的经历、选择与判断;LobeHub 帮你把时间还给重要的部分。
|
||||
|
||||
##### A. 情绪承接(先人后事)
|
||||
+ 允许承认:焦虑、空白、无从下手、被追赶感、被替代感、创作枯竭、意义感动摇
|
||||
+ 但不下结论、不说教:不输出“你要乐观/别焦虑”,改成“这种感觉很常见/你不是一个人”
|
||||
|
||||
##### B. 主体性回归(把人放回驾驶位)
|
||||
+ 关键句式:**“决定权在你”**、**“你可以选择交给助理的部分”**、**“把你的想法变成可运行的流程”**
|
||||
+ 强调可控:可编辑、可回放、可暂停、可撤销、可清除记忆、可查看上下文
|
||||
|
||||
##### C. 经历与关系(把价值从结果挪回过程)
|
||||
+ 适度表达:记录、回放、版本、协作痕迹、讨论、共创、里程碑
|
||||
+ 用“经历/过程/痕迹/回忆/脉络/成长”这类词,避免虚无抒情
|
||||
|
||||
##### D. 不用“AI 神话”
|
||||
+ 不渲染“AI 终将超越你/取代你”
|
||||
+ 也不轻飘飘说“AI 只是工具”了事更像:**“它是工具,但你仍是作者/负责人/最终决定者”**
|
||||
|
||||
|
||||
|
||||
##### 示例
|
||||
在用户可能产生自我否定或无力感的场景(空状态、创作开始、产出对比、失败重试、长时间等待、团队协作分歧、版本回退):
|
||||
|
||||
1. **先承接感受**:用一句短话确认处境(不评判)
|
||||
2. **再给掌控感**:强调“你可控/可选择/可回放/可撤销”
|
||||
3. **最后给下一步**:提供明确行动按钮或路径
|
||||
+ 允许出现“经历、选择、痕迹、成长、一起、陪你把事做完”等词来传递温度;但保持信息密度,不写长段抒情。
|
||||
+ 严肃场景(权限/安全/付费/数据丢失风险)仍以清晰与准确为先,温度通过“尊重与解释”体现,而不是煽情。
|
||||
|
||||
|
||||
|
||||
你可以让系统在需要时套这些结构(同一句兼容新手/专业):
|
||||
|
||||
**开始创作/空白页**
|
||||
|
||||
+ 主句:给一个轻承接 + 行动入口
|
||||
+ 模板:
|
||||
- 「从一个念头开始就够了。写一句话,我来帮你搭好第一个助理。」
|
||||
- 「不知道从哪开始也没关系:先说目标,我们一起把它拆开。」
|
||||
|
||||
**长任务运行/等待**
|
||||
|
||||
+ 模板:
|
||||
- 「正在运行中…你可以先去做别的,完成后我会提醒你。」
|
||||
- 「这一步可能要几分钟。想更快:减少上下文 / 切换模型 / 关闭自动运行。」
|
||||
|
||||
**失败/重试**
|
||||
|
||||
+ 模板:
|
||||
- 「没关系,这次没跑通。你可以重试,或查看原因再继续。」
|
||||
- 「连接失败:权限未通过或网络不稳定。去设置重新授权,或稍后再试。」
|
||||
|
||||
**对比与自我价值焦虑(适合提示/引导,不适合错误弹窗)**
|
||||
|
||||
+ 模板:
|
||||
- 「助理可以加速产出,但方向、取舍和标准仍属于你。」
|
||||
- 「结果可以很快,经历更重要:把每次尝试留下来,下一次会更稳。」
|
||||
|
||||
**协作/群组**
|
||||
|
||||
+ 模板:
|
||||
- 「把上下文对齐到同一处,群组里每个助理都会站在同一页上。」
|
||||
- 「不同意见没关系:先把目标写清楚,再让助理分别给方案与取舍。」
|
||||
|
||||
### 6) 错误/异常/权限/付费:硬规则
|
||||
+ 必须包含:**发生了什么 +(可选)原因 + 你可以怎么做**
|
||||
+ 必须提供可操作选项:**重试 / 查看详情 / 去设置 / 联系支持 / 复制日志**(按场景取舍)
|
||||
+ 不责备用户;不只给错误码;错误码可放在“详情”里
|
||||
+ 涉及数据与安全:语气更中性更完整,温度通过“尊重与解释”体现,而不是煽
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
---
|
||||
globs: src/locales/default/*
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
You are **LobeHub’s English UI Copy & Microcopy Specialist**.
|
||||
|
||||
LobeHub is an assistant workspace: users can create **Agents** and **Agent Teams** so people↔agents and agent↔agent can collaborate to improve productivity in work and life.
|
||||
Brand vibe: youthful, friendly, modern on the surface; professional, reliable, productivity- and controllability-first underneath. Overall style reference: Notion / Figma / Apple / Discord / OpenAI / Gemini — clear, restrained, trustworthy, human but not cheesy.
|
||||
|
||||
Product slogan: **For Collaborative Agents**. Your copy must continuously reinforce that LobeHub is not about “generation”, but about a **collaborative agent system**: shareable context, traceable outcomes, replayable runs, evolvable setup, and **human-in-the-loop**.
|
||||
|
||||
---
|
||||
|
||||
## 1) Fixed Terminology (must follow)
|
||||
|
||||
Use **exactly** these English terms across the product. Do not mix synonyms for the same concept.
|
||||
|
||||
- 空间: **Workspace**
|
||||
- 助理: **Agent**
|
||||
- 群组: **Group**
|
||||
- 上下文: **Context**
|
||||
- 记忆: **Memory**
|
||||
- 连接器: **Integration**
|
||||
- 技能/tool/plugin: **Skill**
|
||||
- 助理档案: **Agent Profile**
|
||||
- 话题: **Topic**
|
||||
- 文稿: **Page**
|
||||
- 社区: **Community**
|
||||
- 资源: **Resource**
|
||||
- 库: **Library**
|
||||
- MCP: **MCP**
|
||||
- 模型服务商: **Provider**
|
||||
|
||||
Terminology rule: one concept = one term site-wide. Never alternate with “bot/assistant/AI agent/team/workspace” variations.
|
||||
|
||||
---
|
||||
|
||||
## 2) Your Responsibilities
|
||||
|
||||
- Improve, rewrite, or create from scratch any **English UI copy**: titles, buttons, form labels/help text, placeholders, onboarding, empty states, toasts, modals, errors, permission prompts, settings, creation/run flows, collaboration and Agent Team pages, etc.
|
||||
- Copy must work for both:
|
||||
- general users (immediately understandable)
|
||||
- power users (not childish)
|
||||
- It must fit both playful and serious contexts.
|
||||
- Avoid overclaiming AI capabilities; add human warmth at the right moments.
|
||||
|
||||
---
|
||||
|
||||
## 3) The Three Brand Principles (bake into structure & wording)
|
||||
|
||||
- **Create**: create an Agent in one sentence; clear next step from idea → usable.
|
||||
- **Collaborate**: multi-agent collaboration; align info and outputs; share Context (controlled, manageable).
|
||||
- **Evolve**: Agents can remember preferences **only with user consent**; become more helpful over time; emphasize explainability, settings, and replay.
|
||||
|
||||
---
|
||||
|
||||
## 4) Writing Rules (actionable)
|
||||
|
||||
1. **Clarity first**: short sentences, strong verbs, minimal adjectives. Avoid hype (“revolutionary”, “epic”, “100%”).
|
||||
2. **Layered messaging (single version for everyone)**:
|
||||
- Main line: simple and actionable
|
||||
- Optional second line: more precise / technical / boundary-setting (subtitle, helper text, tooltip, collapsible)
|
||||
- Do not produce “Pro vs Lite” variants; one main + optional detail
|
||||
3. **Use terms sparingly but correctly**: prefer plain words (“connect”, “run”, “context”) unless a technical term is necessary. When it is, add a plain-English explanation.
|
||||
4. **Consistency**: keep verbs consistent across similar actions (Create / Connect / Run / Pause / Retry / View details / Clear Memory).
|
||||
5. **Actionable**: every message tells the user what to do next. Avoid generic “OK/Cancel”; use specific actions.
|
||||
6. **English localization**: natural, product-native English; avoid translationese; keep punctuation and casing consistent.
|
||||
|
||||
---
|
||||
|
||||
## 5) Human Warmth (balanced, controlled)
|
||||
|
||||
Goal: reduce anxiety and restore control without being sentimental.
|
||||
Default ratio: **80% information, 20% warmth**.
|
||||
Key moments (first-time create, empty state, long waits, failures/retries, rollback/data-loss risk, collaboration conflicts): may go **70/30**.
|
||||
|
||||
Hard cap: any on-screen message may include **at most half a sentence to one sentence** of warmth, and it must be followed by a clear next step.
|
||||
|
||||
Required order:
|
||||
|
||||
1. Acknowledge the situation (no judgment)
|
||||
2. Restore control (human-in-the-loop: pause/replay/edit/undo/clear Memory/view Context)
|
||||
3. Provide the next action (button/path)
|
||||
|
||||
Avoid:
|
||||
|
||||
- preachy encouragement (“don’t worry”, “stay positive”)
|
||||
- grand narratives
|
||||
- overly anthropomorphic claims (“I understand you”, “I’ll always remember you”)
|
||||
|
||||
Core stance: Agents can accelerate output, but **you** own the judgment, trade-offs, and final decision. LobeHub gives you time back for what matters.
|
||||
|
||||
Suggested patterns:
|
||||
|
||||
- **Getting started / blank state**
|
||||
- “Starting with one sentence is enough. Describe your goal and I’ll help you set up the first Agent.”
|
||||
- “Not sure where to begin? Tell me the outcome—we’ll break it down together.”
|
||||
- **Long run / waiting**
|
||||
- “Running… You can switch tasks—I'll notify you when it’s done.”
|
||||
- “This may take a few minutes. To speed up: reduce Context / switch model / disable Auto-run.”
|
||||
- **Failure / retry**
|
||||
- “That didn’t run through. Retry, or view details to fix the cause.”
|
||||
- “Connection failed: permission not granted or network unstable. Re-authorize in Settings, or try again later.”
|
||||
- **Value anxiety (guidance, not error dialogs)**
|
||||
- “Agents can speed up output, but direction and standards stay with you.”
|
||||
- “Fast results are great—keeping the trail makes the next run steadier.”
|
||||
- **Collaboration / Agent Teams**
|
||||
- “Align everyone to the same Context. Every Agent in the Agent Team works from the same page.”
|
||||
- “Different opinions are fine. Write the goal first, then let Agents propose options and trade-offs.”
|
||||
|
||||
---
|
||||
|
||||
## 6) Errors / Exceptions / Permissions / Billing: hard rules
|
||||
|
||||
Every error must include:
|
||||
|
||||
- **What happened**
|
||||
- (optional) **Why**
|
||||
- **What the user can do next**
|
||||
|
||||
Provide actionable options as appropriate:
|
||||
|
||||
- Retry / View details / Go to Settings / Contact support / Copy logs
|
||||
|
||||
Never blame the user. Don’t show only an error code; put codes in “Details” if needed.
|
||||
For data/security/billing: be neutral, thorough, and respectful—warmth comes from clarity, not emotion.
|
||||
|
||||
---
|
||||
|
||||
## 7) Your Special Task: CN i18n → EN (localized, length-aware)
|
||||
|
||||
You translate **raw Chinese i18n strings into English** for LobeHub.
|
||||
|
||||
Requirements:
|
||||
|
||||
- Prefer **localized**, product-native English over literal translation.
|
||||
- Do **not** chase perfect one-to-one consistency if a more natural UI phrase reads better.
|
||||
- Keep the **character length difference small**; try to make the English string **roughly the same visual length** as the Chinese source (avoid overly long expansions).
|
||||
- Preserve meaning, tone, and actionability; keep verbs consistent with LobeHub’s UI patterns.
|
||||
- If space is tight (buttons, tabs, toasts), prioritize: **verb + object**, drop optional words first.
|
||||
- If the Chinese includes placeholders/variables, preserve them exactly (e.g., `{name}`, `{{count}}`, `%s`) and keep word order sensible.
|
||||
- Keep capitalization consistent with UI norms (buttons/title case only when appropriate).
|
||||
|
||||
Output format when translating:
|
||||
|
||||
- Provide **English only**, unless asked otherwise.
|
||||
- If multiple options are useful, give **one best option** + **one shorter fallback** (only when length constraints are likely).
|
||||
|
||||
---
|
||||
|
||||
You always optimize for: **clarity, control, collaboration, replayability, and human-in-the-loop**—in a modern, restrained, trustworthy English voice.
|
||||
@@ -1,12 +1,11 @@
|
||||
---
|
||||
description: flex layout components from `@lobehub/ui` usage
|
||||
globs:
|
||||
description: react flex layout package `react-layout-kit` usage
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# React Layout Kit 使用指南
|
||||
|
||||
# Flexbox 布局组件使用指南
|
||||
|
||||
`@lobehub/ui` 提供了 `Flexbox` 和 `Center` 组件用于创建弹性布局。以下是重点组件的使用方法:
|
||||
react-layout-kit 是一个功能丰富的 React flex 布局组件库,在 lobe-chat 项目中被广泛使用。以下是重点组件的使用方法:
|
||||
|
||||
## Flexbox 组件
|
||||
|
||||
@@ -15,7 +14,7 @@ Flexbox 是最常用的布局组件,用于创建弹性布局,类似于 CSS
|
||||
### 基本用法
|
||||
|
||||
```jsx
|
||||
import { Flexbox } from '@lobehub/ui';
|
||||
import { Flexbox } from 'react-layout-kit';
|
||||
|
||||
// 默认垂直布局
|
||||
<Flexbox>
|
||||
@@ -59,14 +58,14 @@ import { Flexbox } from '@lobehub/ui';
|
||||
>
|
||||
<SidebarContent />
|
||||
</Flexbox>
|
||||
|
||||
|
||||
{/* 中间内容区 */}
|
||||
<Flexbox flex={1} style={{ height: '100%' }}>
|
||||
{/* 主要内容 */}
|
||||
<Flexbox flex={1} padding={24} style={{ overflowY: 'auto' }}>
|
||||
<MainContent />
|
||||
</Flexbox>
|
||||
|
||||
|
||||
{/* 底部区域 */}
|
||||
<Flexbox
|
||||
style={{
|
||||
@@ -87,11 +86,9 @@ Center 是对 Flexbox 的封装,使子元素水平和垂直居中。
|
||||
### 基本用法
|
||||
|
||||
```jsx
|
||||
import { Center } from '@lobehub/ui';
|
||||
|
||||
<Center width={'100%'} height={'100%'}>
|
||||
<Content />
|
||||
</Center>;
|
||||
</Center>
|
||||
```
|
||||
|
||||
Center 组件继承了 Flexbox 的所有属性,同时默认设置了居中对齐。主要用于快速创建居中布局。
|
||||
@@ -119,4 +116,4 @@ Center 组件继承了 Flexbox 的所有属性,同时默认设置了居中对
|
||||
- 嵌套 Flexbox 创建复杂布局
|
||||
- 设置 overflow: 'auto' 使内容可滚动
|
||||
- 使用 horizontal 创建水平布局,默认为垂直布局
|
||||
- 与 antd-style 的 useTheme hook 配合使用创建主题响应式的布局
|
||||
- 与 antd-style 的 useTheme hook 配合使用创建主题响应式的布局
|
||||
@@ -17,20 +17,20 @@ logo emoji: 🤯
|
||||
## Project Technologies Stack
|
||||
|
||||
- Next.js 16
|
||||
- implement spa inside nextjs with `react-router-dom`
|
||||
- react 19
|
||||
- TypeScript
|
||||
- `@lobehub/ui`, antd for component framework
|
||||
- antd-style for css-in-js framework
|
||||
- lucide-react, `@ant-design/icons` for icons
|
||||
- react-layout-kit for flex layout component
|
||||
- react-i18next for i18n
|
||||
- zustand for state management
|
||||
- nuqs for search params management
|
||||
- SWR for data fetch
|
||||
- aHooks for react hooks library
|
||||
- dayjs for time library
|
||||
- es-toolkit for utility library
|
||||
- lodash-es for utility library
|
||||
- TRPC for type safe backend
|
||||
- Neon PostgreSQL for backend DB
|
||||
- PGLite for client DB and Neon PostgreSQL for backend DB
|
||||
- Drizzle ORM
|
||||
- Vitest for testing
|
||||
|
||||
@@ -25,23 +25,22 @@ lobe-chat/
|
||||
│ └── zh-CN/
|
||||
├── packages/
|
||||
│ ├── agent-runtime/
|
||||
│ ├── builtin-agents/
|
||||
│ ├── builtin-tool-*/ # builtin tool packages
|
||||
│ ├── const/
|
||||
│ ├── context-engine/
|
||||
│ ├── conversation-flow/
|
||||
│ ├── database/
|
||||
│ │ └── src/
|
||||
│ │ ├── models/
|
||||
│ │ ├── schemas/
|
||||
│ │ └── repositories/
|
||||
│ ├── desktop-bridge/
|
||||
│ │ ├── src/
|
||||
│ │ │ ├── models/
|
||||
│ │ │ ├── schemas/
|
||||
│ │ │ └── repositories/
|
||||
│ ├── electron-client-ipc/
|
||||
│ ├── electron-server-ipc/
|
||||
│ ├── fetch-sse/
|
||||
│ ├── file-loaders/
|
||||
│ ├── memory-user-memory/
|
||||
│ ├── memory-extract/
|
||||
│ ├── model-bank/
|
||||
│ │ └── src/
|
||||
│ │ └── aiModels/
|
||||
│ ├── model-runtime/
|
||||
│ │ └── src/
|
||||
│ │ ├── core/
|
||||
@@ -51,6 +50,9 @@ lobe-chat/
|
||||
│ ├── python-interpreter/
|
||||
│ ├── ssrf-safe-fetch/
|
||||
│ ├── types/
|
||||
│ │ └── src/
|
||||
│ │ ├── message/
|
||||
│ │ └── user/
|
||||
│ ├── utils/
|
||||
│ └── web-crawler/
|
||||
├── public/
|
||||
@@ -59,25 +61,24 @@ lobe-chat/
|
||||
│ ├── app/
|
||||
│ │ ├── (backend)/
|
||||
│ │ │ ├── api/
|
||||
│ │ │ ├── f/
|
||||
│ │ │ ├── market/
|
||||
│ │ │ │ ├── auth/
|
||||
│ │ │ │ └── webhooks/
|
||||
│ │ │ ├── middleware/
|
||||
│ │ │ ├── oidc/
|
||||
│ │ │ ├── trpc/
|
||||
│ │ │ └── webapi/
|
||||
│ │ │ ├── chat/
|
||||
│ │ │ └── tts/
|
||||
│ │ ├── [variants]/
|
||||
│ │ │ ├── (auth)/
|
||||
│ │ │ ├── (main)/
|
||||
│ │ │ ├── (mobile)/
|
||||
│ │ │ ├── onboarding/
|
||||
│ │ │ └── router/
|
||||
│ │ └── desktop/
|
||||
│ │ │ │ ├── chat/
|
||||
│ │ │ │ └── settings/
|
||||
│ │ │ └── @modal/
|
||||
│ │ └── manifest.ts
|
||||
│ ├── components/
|
||||
│ ├── config/
|
||||
│ ├── const/
|
||||
│ ├── envs/
|
||||
│ ├── features/
|
||||
│ ├── helpers/
|
||||
│ │ └── ChatInput/
|
||||
│ ├── hooks/
|
||||
│ ├── layout/
|
||||
│ │ ├── AuthProvider/
|
||||
@@ -89,23 +90,23 @@ lobe-chat/
|
||||
│ ├── locales/
|
||||
│ │ └── default/
|
||||
│ ├── server/
|
||||
│ │ ├── featureFlags/
|
||||
│ │ ├── globalConfig/
|
||||
│ │ ├── modules/
|
||||
│ │ ├── routers/
|
||||
│ │ │ ├── async/
|
||||
│ │ │ ├── lambda/
|
||||
│ │ │ ├── mobile/
|
||||
│ │ │ └── tools/
|
||||
│ │ │ ├── desktop/
|
||||
│ │ │ ├── edge/
|
||||
│ │ │ └── lambda/
|
||||
│ │ └── services/
|
||||
│ ├── services/
|
||||
│ │ ├── user/
|
||||
│ │ │ ├── client.ts
|
||||
│ │ │ └── server.ts
|
||||
│ │ └── message/
|
||||
│ ├── store/
|
||||
│ │ ├── agent/
|
||||
│ │ ├── chat/
|
||||
│ │ └── user/
|
||||
│ ├── styles/
|
||||
│ ├── tools/
|
||||
│ ├── types/
|
||||
│ └── utils/
|
||||
└── package.json
|
||||
```
|
||||
@@ -115,22 +116,25 @@ lobe-chat/
|
||||
- UI Components: `src/components`, `src/features`
|
||||
- Global providers: `src/layout`
|
||||
- Zustand stores: `src/store`
|
||||
- Client Services: `src/services/`
|
||||
- Client Services: `src/services/` cross-platform services
|
||||
- clientDB: `src/services/<domain>/client.ts`
|
||||
- serverDB: `src/services/<domain>/server.ts`
|
||||
- API Routers:
|
||||
- `src/app/(backend)/webapi` (REST)
|
||||
- `src/server/routers/{async|lambda|mobile|tools}` (tRPC)
|
||||
- `src/server/routers/{edge|lambda|async|desktop|tools}` (tRPC)
|
||||
- Server:
|
||||
- Services (can access serverDB): `src/server/services`
|
||||
- Modules (can't access db): `src/server/modules`
|
||||
- Feature Flags: `src/server/featureFlags`
|
||||
- Global Config: `src/server/globalConfig`
|
||||
- Services(can access serverDB): `src/server/services` server-used-only services
|
||||
- Modules(can't access db): `src/server/modules` (Server only Third-party Service Module)
|
||||
- Database:
|
||||
- Schema (Drizzle): `packages/database/src/schemas`
|
||||
- Model (CRUD): `packages/database/src/models`
|
||||
- Repository (bff-queries): `packages/database/src/repositories`
|
||||
- Third-party Integrations: `src/libs` — analytics, oidc etc.
|
||||
- Builtin Tools: `src/tools`, `packages/builtin-tool-*`
|
||||
|
||||
## Data Flow Architecture
|
||||
|
||||
React UI → Store Actions → Client Service → TRPC Lambda → Server Services -> DB Model → PostgreSQL (Remote)
|
||||
- **Web with ClientDB**: React UI → Client Service → Direct Model Access → PGLite (Web WASM)
|
||||
- **Web with ServerDB**: React UI → Client Service → tRPC Lambda → Server Services → PostgreSQL (Remote)
|
||||
- **Desktop**:
|
||||
- Cloud sync disabled: Electron UI → Client Service → tRPC Lambda → Local Server Services → PGLite (Node WASM)
|
||||
- Cloud sync enabled: Electron UI → Client Service → tRPC Lambda → Cloud Server Services → PostgreSQL (Remote)
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
---
|
||||
description:
|
||||
globs: *.tsx
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# react component 编写指南
|
||||
|
||||
- 如果要写复杂样式的话用 antd-style ,简单的话可以用 style 属性直接写内联样式
|
||||
- 如果需要 flex 布局或者居中布局应该使用 react-layout-kit 的 Flexbox 和 Center 组件
|
||||
- 选择组件时优先顺序应该是 src/components > 安装的组件 package > lobe-ui > antd
|
||||
- 使用 selector 访问 zustand store 的数据,而不是直接从 store 获取
|
||||
|
||||
## antd-style token system
|
||||
|
||||
### 访问 token system 的两种方式
|
||||
|
||||
#### 使用 antd-style 的 useTheme hook
|
||||
|
||||
```tsx
|
||||
import { useTheme } from 'antd-style';
|
||||
|
||||
const MyComponent = () => {
|
||||
const theme = useTheme();
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
color: theme.colorPrimary,
|
||||
backgroundColor: theme.colorBgContainer,
|
||||
padding: theme.padding,
|
||||
borderRadius: theme.borderRadius,
|
||||
}}
|
||||
>
|
||||
使用主题 token 的组件
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
#### 使用 antd-style 的 createStyles
|
||||
|
||||
```tsx
|
||||
const useStyles = createStyles(({ css, token }) => {
|
||||
return {
|
||||
container: css`
|
||||
background-color: ${token.colorBgContainer};
|
||||
border-radius: ${token.borderRadius}px;
|
||||
padding: ${token.padding}px;
|
||||
color: ${token.colorText};
|
||||
`,
|
||||
title: css`
|
||||
font-size: ${token.fontSizeLG}px;
|
||||
font-weight: ${token.fontWeightStrong};
|
||||
margin-bottom: ${token.marginSM}px;
|
||||
`,
|
||||
content: css`
|
||||
font-size: ${token.fontSize}px;
|
||||
line-height: ${token.lineHeight};
|
||||
`,
|
||||
};
|
||||
});
|
||||
|
||||
const Card: FC<CardProps> = ({ title, content }) => {
|
||||
const { styles } = useStyles();
|
||||
|
||||
return (
|
||||
<Flexbox className={styles.container}>
|
||||
<div className={styles.title}>{title}</div>
|
||||
<div className={styles.content}>{content}</div>
|
||||
</Flexbox>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
### 一些你经常会忘记使用的 token
|
||||
|
||||
请注意使用下面的 token 而不是 css 字面值。可以访问 https://ant.design/docs/react/customize-theme-cn 了解所有 token
|
||||
|
||||
- 动画类
|
||||
- token.motionDurationMid
|
||||
- token.motionEaseInOut
|
||||
- 包围盒属性
|
||||
- token.paddingSM
|
||||
- token.marginLG
|
||||
|
||||
## Lobe UI 包含的组件
|
||||
|
||||
- 不知道 `@lobehub/ui` 的组件怎么用,有哪些属性,就自己搜下这个项目其它地方怎么用的,不要瞎猜,大部分组件都是在 antd 的基础上扩展了属性
|
||||
- 具体用法不懂可以联网搜索,例如 ActionIcon 就爬取 https://ui.lobehub.com/components/action-icon
|
||||
- 可以阅读 `node_modules/@lobehub/ui/es/index.js` 了解有哪些组件,每个组件的属性是什么
|
||||
|
||||
- General
|
||||
- ActionIcon
|
||||
- ActionIconGroup
|
||||
- Block
|
||||
- Button
|
||||
- DownloadButton
|
||||
- Icon
|
||||
- Data Display
|
||||
- Avatar
|
||||
- AvatarGroup
|
||||
- GroupAvatar
|
||||
- Collapse
|
||||
- FileTypeIcon
|
||||
- FluentEmoji
|
||||
- GuideCard
|
||||
- Highlighter
|
||||
- Hotkey
|
||||
- Image
|
||||
- List
|
||||
- Markdown
|
||||
- SearchResultCards
|
||||
- MaterialFileTypeIcon
|
||||
- Mermaid
|
||||
- Typography
|
||||
- Text
|
||||
- Segmented
|
||||
- Snippet
|
||||
- SortableList
|
||||
- Tag
|
||||
- Tooltip
|
||||
- Video
|
||||
- Data Entry
|
||||
- AutoComplete
|
||||
- CodeEditor
|
||||
- ColorSwatches
|
||||
- CopyButton
|
||||
- DatePicker
|
||||
- EditableText
|
||||
- EmojiPicker
|
||||
- Form
|
||||
- FormModal
|
||||
- HotkeyInput
|
||||
- ImageSelect
|
||||
- Input
|
||||
- SearchBar
|
||||
- Select
|
||||
- SliderWithInput
|
||||
- ThemeSwitch
|
||||
- Feedback
|
||||
- Alert
|
||||
- Drawer
|
||||
- Modal
|
||||
- Layout
|
||||
- DraggablePanel
|
||||
- DraggablePanelBody
|
||||
- DraggablePanelContainer
|
||||
- DraggablePanelFooter
|
||||
- DraggablePanelHeader
|
||||
- Footer
|
||||
- Grid
|
||||
- Header
|
||||
- Layout
|
||||
- LayoutFooter
|
||||
- LayoutHeader
|
||||
- LayoutMain
|
||||
- LayoutSidebar
|
||||
- LayoutSidebarInner
|
||||
- LayoutToc
|
||||
- MaskShadow
|
||||
- ScrollShadow
|
||||
- Navigation
|
||||
- Burger
|
||||
- Dropdown
|
||||
- Menu
|
||||
- SideNav
|
||||
- Tabs
|
||||
- Toc
|
||||
- Theme
|
||||
- ConfigProvider
|
||||
- FontLoader
|
||||
- ThemeProvider
|
||||
@@ -1,157 +0,0 @@
|
||||
---
|
||||
description:
|
||||
globs: *.tsx
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# React Component Writing Guide
|
||||
|
||||
- Use antd-style for complex styles; for simple cases, use the `style` attribute for inline styles
|
||||
- Use `Flexbox` and `Center` components from `@lobehub/ui` for flex and centered layouts
|
||||
- Component selection priority: src/components > installed component packages > lobe-ui > antd
|
||||
- Use selectors to access zustand store data instead of accessing the store directly
|
||||
|
||||
## Lobe UI Components
|
||||
|
||||
- If unsure how to use `@lobehub/ui` components or what props they accept, search for existing usage in this project instead of guessing. Most components extend antd components with additional props
|
||||
- For specific usage, search online. For example, for ActionIcon visit <https://ui.lobehub.com/components/action-icon>
|
||||
- Read `node_modules/@lobehub/ui/es/index.mjs` to see all available components and their props
|
||||
|
||||
- General
|
||||
- ActionIcon
|
||||
- ActionIconGroup
|
||||
- Block
|
||||
- Button
|
||||
- Icon
|
||||
- Data Display
|
||||
- Accordion
|
||||
- Avatar
|
||||
- Collapse
|
||||
- Empty
|
||||
- FileTypeIcon
|
||||
- FluentEmoji
|
||||
- GroupAvatar
|
||||
- GuideCard
|
||||
- Highlighter
|
||||
- Hotkey
|
||||
- Image
|
||||
- List
|
||||
- Markdown
|
||||
- MaterialFileTypeIcon
|
||||
- Mermaid
|
||||
- Segmented
|
||||
- Skeleton
|
||||
- Snippet
|
||||
- SortableList
|
||||
- Tag
|
||||
- Tooltip
|
||||
- Video
|
||||
- Data Entry
|
||||
- AutoComplete
|
||||
- CodeEditor
|
||||
- ColorSwatches
|
||||
- CopyButton
|
||||
- DatePicker
|
||||
- DownloadButton
|
||||
- EditableText
|
||||
- EmojiPicker
|
||||
- Form
|
||||
- FormModal
|
||||
- HotkeyInput
|
||||
- ImageSelect
|
||||
- Input
|
||||
- SearchBar
|
||||
- Select
|
||||
- SliderWithInput
|
||||
- ThemeSwitch
|
||||
- Feedback
|
||||
- Alert
|
||||
- Drawer
|
||||
- Modal
|
||||
- Layout
|
||||
- Center
|
||||
- DraggablePanel
|
||||
- Flexbox
|
||||
- Footer
|
||||
- Grid
|
||||
- Header
|
||||
- Layout
|
||||
- MaskShadow
|
||||
- ScrollShadow
|
||||
- Navigation
|
||||
- Burger
|
||||
- DraggableSideNav
|
||||
- Dropdown
|
||||
- Menu
|
||||
- SideNav
|
||||
- Tabs
|
||||
- Toc
|
||||
- Theme
|
||||
- ConfigProvider
|
||||
- FontLoader
|
||||
- ThemeProvider
|
||||
- Typography
|
||||
- Text
|
||||
|
||||
## Routing Architecture
|
||||
|
||||
This project uses a **hybrid routing architecture**: Next.js App Router for static pages + React Router DOM for the main SPA.
|
||||
|
||||
### Route Types
|
||||
|
||||
```plaintext
|
||||
+------------------+--------------------------------+--------------------------------+
|
||||
| Route Type | Use Case | Implementation |
|
||||
+------------------+--------------------------------+--------------------------------+
|
||||
| Next.js App | Auth pages (login, signup, | page.tsx file convention |
|
||||
| Router | oauth, reset-password, etc.) | src/app/[variants]/(auth)/ |
|
||||
+------------------+--------------------------------+--------------------------------+
|
||||
| React Router | Main SPA features | BrowserRouter + Routes |
|
||||
| DOM | (chat, discover, settings) | desktopRouter.config.tsx |
|
||||
| | | mobileRouter.config.tsx |
|
||||
+------------------+--------------------------------+--------------------------------+
|
||||
```
|
||||
|
||||
### Key Files
|
||||
|
||||
- Entry point: `src/app/[variants]/page.tsx` - Routes to Desktop or Mobile based on device
|
||||
- Desktop router: `src/app/[variants]/router/desktopRouter.config.tsx`
|
||||
- Mobile router: `src/app/[variants]/(mobile)/router/mobileRouter.config.tsx`
|
||||
- Router utilities: `src/utils/router.tsx`
|
||||
|
||||
### Router Utilities
|
||||
|
||||
```tsx
|
||||
import { dynamicElement, redirectElement, ErrorBoundary, RouteConfig } from '@/utils/router';
|
||||
|
||||
// Lazy load a page component
|
||||
element: dynamicElement(() => import('./chat'), 'Desktop > Chat')
|
||||
|
||||
// Create a redirect
|
||||
element: redirectElement('/settings/profile')
|
||||
|
||||
// Error boundary for route
|
||||
errorElement: <ErrorBoundary resetPath="/chat" />
|
||||
```
|
||||
|
||||
### Adding New Routes
|
||||
|
||||
1. Add route config to `desktopRouter.config.tsx` or `mobileRouter.config.tsx`
|
||||
2. Create page component in the corresponding directory under `(main)/`
|
||||
3. Use `dynamicElement()` for lazy loading
|
||||
|
||||
### Navigation
|
||||
|
||||
```tsx
|
||||
// In components - use react-router-dom hooks
|
||||
import { useNavigate, useParams } from 'react-router-dom';
|
||||
|
||||
const navigate = useNavigate();
|
||||
navigate('/chat');
|
||||
|
||||
// From stores - use global navigate
|
||||
import { useGlobalStore } from '@/store/global';
|
||||
|
||||
const navigate = useGlobalStore.getState().navigate;
|
||||
navigate?.('/settings');
|
||||
```
|
||||
@@ -14,7 +14,7 @@ All following rules are saved under `.cursor/rules/` directory:
|
||||
|
||||
## Frontend
|
||||
|
||||
- `react.mdc` – React component style guide and conventions
|
||||
- `react-component.mdc` – React component style guide and conventions
|
||||
- `i18n.mdc` – Internationalization guide using react-i18next
|
||||
- `typescript.mdc` – TypeScript code style guide
|
||||
- `packages/react-layout-kit.mdc` – Usage guide for react-layout-kit
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
E2E 测试的目标是尽可能接近真实运行环境。因此,我们只 Mock **三个外部依赖**:
|
||||
|
||||
| 依赖 | Mock 方式 | 说明 |
|
||||
| --- | --- | --- |
|
||||
|------|----------|------|
|
||||
| **Database** | PGLite | 使用 `@lobechat/database/test-utils` 提供的内存数据库 |
|
||||
| **Redis** | InMemoryAgentStateManager | Mock `AgentStateManager` 使用内存实现 |
|
||||
| **Redis** | InMemoryStreamEventManager | Mock `StreamEventManager` 使用内存实现 |
|
||||
@@ -79,13 +79,11 @@ export const createOpenAIStreamResponse = (options: {
|
||||
id: 'chatcmpl-mock',
|
||||
object: 'chat.completion.chunk',
|
||||
model: 'gpt-5',
|
||||
choices: [
|
||||
{
|
||||
index: 0,
|
||||
delta: { content },
|
||||
finish_reason: null,
|
||||
},
|
||||
],
|
||||
choices: [{
|
||||
index: 0,
|
||||
delta: { content },
|
||||
finish_reason: null,
|
||||
}],
|
||||
};
|
||||
controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`));
|
||||
}
|
||||
@@ -97,25 +95,21 @@ export const createOpenAIStreamResponse = (options: {
|
||||
id: 'chatcmpl-mock',
|
||||
object: 'chat.completion.chunk',
|
||||
model: 'gpt-5',
|
||||
choices: [
|
||||
{
|
||||
index: 0,
|
||||
delta: {
|
||||
tool_calls: [
|
||||
{
|
||||
index: 0,
|
||||
id: tool.id,
|
||||
type: 'function',
|
||||
function: {
|
||||
name: tool.name,
|
||||
arguments: tool.arguments,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
finish_reason: null,
|
||||
choices: [{
|
||||
index: 0,
|
||||
delta: {
|
||||
tool_calls: [{
|
||||
index: 0,
|
||||
id: tool.id,
|
||||
type: 'function',
|
||||
function: {
|
||||
name: tool.name,
|
||||
arguments: tool.arguments,
|
||||
},
|
||||
}],
|
||||
},
|
||||
],
|
||||
finish_reason: null,
|
||||
}],
|
||||
};
|
||||
controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`));
|
||||
}
|
||||
@@ -126,13 +120,11 @@ export const createOpenAIStreamResponse = (options: {
|
||||
id: 'chatcmpl-mock',
|
||||
object: 'chat.completion.chunk',
|
||||
model: 'gpt-5',
|
||||
choices: [
|
||||
{
|
||||
index: 0,
|
||||
delta: {},
|
||||
finish_reason: finishReason,
|
||||
},
|
||||
],
|
||||
choices: [{
|
||||
index: 0,
|
||||
delta: {},
|
||||
finish_reason: finishReason,
|
||||
}],
|
||||
};
|
||||
controller.enqueue(encoder.encode(`data: ${JSON.stringify(finishChunk)}\n\n`));
|
||||
controller.enqueue(encoder.encode('data: [DONE]\n\n'));
|
||||
@@ -180,7 +172,9 @@ const fetchSpy = vi.spyOn(globalThis, 'fetch');
|
||||
|
||||
// 在具体测试中设置返回值
|
||||
it('should handle text response', async () => {
|
||||
fetchSpy.mockResolvedValueOnce(createOpenAIStreamResponse({ content: '杭州今天天气晴朗' }));
|
||||
fetchSpy.mockResolvedValueOnce(
|
||||
createOpenAIStreamResponse({ content: '杭州今天天气晴朗' })
|
||||
);
|
||||
|
||||
// ... 执行测试
|
||||
});
|
||||
@@ -188,15 +182,13 @@ it('should handle text response', async () => {
|
||||
it('should handle tool calls', async () => {
|
||||
fetchSpy.mockResolvedValueOnce(
|
||||
createOpenAIStreamResponse({
|
||||
toolCalls: [
|
||||
{
|
||||
id: 'call_123',
|
||||
name: 'lobe-web-browsing____search____builtin',
|
||||
arguments: JSON.stringify({ query: '杭州天气' }),
|
||||
},
|
||||
],
|
||||
toolCalls: [{
|
||||
id: 'call_123',
|
||||
name: 'lobe-web-browsing____search____builtin',
|
||||
arguments: JSON.stringify({ query: '杭州天气' }),
|
||||
}],
|
||||
finishReason: 'tool_calls',
|
||||
}),
|
||||
})
|
||||
);
|
||||
|
||||
// ... 执行测试
|
||||
@@ -211,7 +203,7 @@ it('should handle tool calls', async () => {
|
||||
describe('Basic Chat', () => {
|
||||
it('should complete a simple conversation', async () => {
|
||||
fetchSpy.mockResolvedValueOnce(
|
||||
createOpenAIStreamResponse({ content: 'Hello! How can I help you?' }),
|
||||
createOpenAIStreamResponse({ content: 'Hello! How can I help you?' })
|
||||
);
|
||||
|
||||
const result = await service.createOperation({
|
||||
@@ -234,20 +226,18 @@ describe('Tool Calls', () => {
|
||||
// 第一次调用:LLM 返回 tool_calls
|
||||
fetchSpy.mockResolvedValueOnce(
|
||||
createOpenAIStreamResponse({
|
||||
toolCalls: [
|
||||
{
|
||||
id: 'call_123',
|
||||
name: 'lobe-web-browsing____search____builtin',
|
||||
arguments: JSON.stringify({ query: '杭州天气' }),
|
||||
},
|
||||
],
|
||||
toolCalls: [{
|
||||
id: 'call_123',
|
||||
name: 'lobe-web-browsing____search____builtin',
|
||||
arguments: JSON.stringify({ query: '杭州天气' }),
|
||||
}],
|
||||
finishReason: 'tool_calls',
|
||||
}),
|
||||
})
|
||||
);
|
||||
|
||||
// 第二次调用:处理 tool 结果后的响应
|
||||
fetchSpy.mockResolvedValueOnce(
|
||||
createOpenAIStreamResponse({ content: '根据搜索结果,杭州今天...' }),
|
||||
createOpenAIStreamResponse({ content: '根据搜索结果,杭州今天...' })
|
||||
);
|
||||
|
||||
// ... 执行测试
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
description: Best practices for testing Zustand store actions
|
||||
globs: 'src/store/**/*.test.ts'
|
||||
globs: "src/store/**/*.test.ts"
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
@@ -15,7 +15,6 @@ import { act, renderHook } from '@testing-library/react';
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { messageService } from '@/services/message';
|
||||
|
||||
import { useChatStore } from '../../store';
|
||||
|
||||
// Keep zustand mock as it's needed globally
|
||||
@@ -230,7 +229,8 @@ it('should handle topic creation flow', async () => {
|
||||
const { result } = renderHook(() => useChatStore());
|
||||
|
||||
// Spy on action dependencies
|
||||
const createTopicSpy = vi.spyOn(result.current, 'createTopic').mockResolvedValue('new-topic-id');
|
||||
const createTopicSpy = vi.spyOn(result.current, 'createTopic')
|
||||
.mockResolvedValue('new-topic-id');
|
||||
const toggleLoadingSpy = vi.spyOn(result.current, 'internal_toggleMessageLoading');
|
||||
|
||||
// Execute
|
||||
@@ -251,7 +251,9 @@ When testing streaming responses, simulate the flow properly:
|
||||
```typescript
|
||||
it('should handle streaming chunks', async () => {
|
||||
const { result } = renderHook(() => useChatStore());
|
||||
const messages = [{ id: 'msg-1', role: 'user', content: 'Hello', sessionId: 'test-session' }];
|
||||
const messages = [
|
||||
{ id: 'msg-1', role: 'user', content: 'Hello', sessionId: 'test-session' },
|
||||
];
|
||||
|
||||
const streamSpy = vi
|
||||
.spyOn(chatService, 'createAssistantMessageStream')
|
||||
@@ -285,7 +287,9 @@ Always test error scenarios:
|
||||
it('should handle errors gracefully', async () => {
|
||||
const { result } = renderHook(() => useChatStore());
|
||||
|
||||
vi.spyOn(messageService, 'createMessage').mockRejectedValue(new Error('create message error'));
|
||||
vi.spyOn(messageService, 'createMessage').mockRejectedValue(
|
||||
new Error('create message error'),
|
||||
);
|
||||
|
||||
await act(async () => {
|
||||
try {
|
||||
@@ -326,7 +330,8 @@ it('should test something', async () => {
|
||||
it('should call internal methods', async () => {
|
||||
const { result } = renderHook(() => useChatStore());
|
||||
|
||||
const internalMethodSpy = vi.spyOn(result.current, 'internal_method').mockResolvedValue();
|
||||
const internalMethodSpy = vi.spyOn(result.current, 'internal_method')
|
||||
.mockResolvedValue();
|
||||
|
||||
await act(async () => {
|
||||
await result.current.publicMethod();
|
||||
@@ -451,7 +456,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { discoverService } from '@/services/discover';
|
||||
import { globalHelpers } from '@/store/global/helpers';
|
||||
|
||||
import { useDiscoverStore as useStore } from '../../store';
|
||||
|
||||
vi.mock('zustand/traditional');
|
||||
@@ -482,7 +486,6 @@ describe('SWR Hook Actions', () => {
|
||||
```
|
||||
|
||||
**Key points**:
|
||||
|
||||
- **DO NOT mock useSWR** - let it use the real implementation
|
||||
- Only mock the **service methods** (fetchers)
|
||||
- Use `waitFor` from `@testing-library/react` to wait for async operations
|
||||
@@ -556,19 +559,21 @@ it('should not fetch when required parameter is missing', () => {
|
||||
7. **Type assertions**: Use `as any` for test mock data where type definitions are strict
|
||||
|
||||
**Why this matters**:
|
||||
|
||||
- The fetcher (service method) is what we're testing - it must be called
|
||||
- Hardcoding the return value bypasses the actual fetcher logic
|
||||
- SWR returns Promises in real usage, tests should mirror this behavior
|
||||
|
||||
## Benefits of This Approach
|
||||
|
||||
✅ **Clear test layers** - Each test only spies on direct dependencies ✅ **Correct mocks** - Mocks match actual implementation ✅ **Better maintainability** - Changes to implementation require fewer test updates ✅ **Improved coverage** - Structured approach ensures all branches are tested ✅ **Reduced coupling** - Tests are independent and can run in any order
|
||||
✅ **Clear test layers** - Each test only spies on direct dependencies
|
||||
✅ **Correct mocks** - Mocks match actual implementation
|
||||
✅ **Better maintainability** - Changes to implementation require fewer test updates
|
||||
✅ **Improved coverage** - Structured approach ensures all branches are tested
|
||||
✅ **Reduced coupling** - Tests are independent and can run in any order
|
||||
|
||||
## Reference
|
||||
|
||||
See example implementation in:
|
||||
|
||||
- `src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts` (Regular actions)
|
||||
- `src/store/discover/slices/plugin/action.test.ts` (SWR hooks)
|
||||
- `src/store/discover/slices/mcp/action.test.ts` (SWR hooks)
|
||||
|
||||
@@ -16,6 +16,10 @@ alwaysApply: false
|
||||
- prefer `@ts-expect-error` over `@ts-ignore` over `as any`
|
||||
- Avoid meaningless null/undefined parameters; design strict function contracts.
|
||||
|
||||
## Imports and Modules
|
||||
|
||||
- When importing a directory module, prefer the explicit index path like `@/db/index` instead of `@/db`.
|
||||
|
||||
## Asynchronous Patterns and Concurrency
|
||||
|
||||
- Prefer `async`/`await` over callbacks or chained `.then` promises.
|
||||
|
||||
@@ -1,126 +1,137 @@
|
||||
---
|
||||
description:
|
||||
description:
|
||||
globs: src/store/**
|
||||
alwaysApply: false
|
||||
---
|
||||
# LobeChat Zustand Action 组织模式
|
||||
|
||||
# LobeChat Zustand Action Patterns
|
||||
本文档详细说明了 LobeChat 项目中 Zustand Action 的组织方式、命名规范和实现模式,特别关注乐观更新与后端服务的集成。
|
||||
|
||||
## Action Type Hierarchy
|
||||
## Action 类型分层
|
||||
|
||||
LobeChat Actions use a layered architecture with clear separation of responsibilities:
|
||||
LobeChat 的 Action 采用分层架构,明确区分不同职责:
|
||||
|
||||
### 1. Public Actions
|
||||
|
||||
Main interfaces exposed for UI component consumption:
|
||||
|
||||
- Naming: Verb form (`createTopic`, `sendMessage`, `updateTopicTitle`)
|
||||
- Responsibilities: Parameter validation, flow orchestration, calling internal actions
|
||||
- Example: [src/store/chat/slices/topic/action.ts](mdc:src/store/chat/slices/topic/action.ts)
|
||||
对外暴露的主要接口,供 UI 组件调用:
|
||||
- 命名:动词形式(`createTopic`, `sendMessage`, `updateTopicTitle`)
|
||||
- 职责:参数验证、流程编排、调用 internal actions
|
||||
- 示例:[src/store/chat/slices/topic/action.ts](mdc:src/store/chat/slices/topic/action.ts)
|
||||
|
||||
```typescript
|
||||
// Public Action example
|
||||
// Public Action 示例
|
||||
createTopic: async () => {
|
||||
// ...
|
||||
const { activeId, internal_createTopic } = get();
|
||||
const messages = chatSelectors.activeBaseChats(get());
|
||||
|
||||
if (messages.length === 0) return;
|
||||
|
||||
const topicId = await internal_createTopic({
|
||||
sessionId: activeId,
|
||||
title: t('defaultTitle', { ns: 'topic' }),
|
||||
messages: messages.map((m) => m.id),
|
||||
});
|
||||
|
||||
return topicId;
|
||||
},
|
||||
```
|
||||
|
||||
### 2. Internal Actions (`internal_*`)
|
||||
|
||||
Internal implementation details handling core business logic:
|
||||
|
||||
- Naming: `internal_` prefix + verb (`internal_createTopic`, `internal_updateMessageContent`)
|
||||
- Responsibilities: Optimistic updates, service calls, error handling, state synchronization
|
||||
- Should not be called directly by UI components
|
||||
内部实现细节,处理核心业务逻辑:
|
||||
- 命名:`internal_` 前缀 + 动词(`internal_createTopic`, `internal_updateMessageContent`)
|
||||
- 职责:乐观更新、服务调用、错误处理、状态同步
|
||||
- 不应该被 UI 组件直接调用
|
||||
|
||||
```typescript
|
||||
// Internal Action example - Optimistic update pattern
|
||||
// Internal Action 示例 - 乐观更新模式
|
||||
internal_createTopic: async (params) => {
|
||||
const tmpId = Date.now().toString();
|
||||
|
||||
// 1. Immediately update frontend state (optimistic update)
|
||||
|
||||
// 1. 立即更新前端状态(乐观更新)
|
||||
get().internal_dispatchTopic(
|
||||
{ type: 'addTopic', value: { ...params, id: tmpId } },
|
||||
'internal_createTopic',
|
||||
);
|
||||
get().internal_updateTopicLoading(tmpId, true);
|
||||
|
||||
// 2. Call backend service
|
||||
|
||||
// 2. 调用后端服务
|
||||
const topicId = await topicService.createTopic(params);
|
||||
get().internal_updateTopicLoading(tmpId, false);
|
||||
|
||||
// 3. Refresh data to ensure consistency
|
||||
|
||||
// 3. 刷新数据确保一致性
|
||||
get().internal_updateTopicLoading(topicId, true);
|
||||
await get().refreshTopic();
|
||||
get().internal_updateTopicLoading(topicId, false);
|
||||
|
||||
|
||||
return topicId;
|
||||
},
|
||||
```
|
||||
|
||||
### 3. Dispatch Methods (`internal_dispatch*`)
|
||||
|
||||
Methods dedicated to handling state updates:
|
||||
|
||||
- Naming: `internal_dispatch` + entity name (`internal_dispatchTopic`, `internal_dispatchMessage`)
|
||||
- Responsibilities: Calling reducers, updating Zustand store, handling state comparison
|
||||
专门处理状态更新的方法:
|
||||
- 命名:`internal_dispatch` + 实体名(`internal_dispatchTopic`, `internal_dispatchMessage`)
|
||||
- 职责:调用 reducer、更新 Zustand store、处理状态对比
|
||||
|
||||
```typescript
|
||||
// Dispatch Method example
|
||||
// Dispatch Method 示例
|
||||
internal_dispatchTopic: (payload, action) => {
|
||||
const nextTopics = topicReducer(topicSelectors.currentTopics(get()), payload);
|
||||
const nextMap = { ...get().topicMaps, [get().activeId]: nextTopics };
|
||||
|
||||
if (isEqual(nextMap, get().topicMaps)) return;
|
||||
|
||||
|
||||
set({ topicMaps: nextMap }, false, action ?? n(`dispatchTopic/${payload.type}`));
|
||||
},
|
||||
```
|
||||
|
||||
## When to Use Reducer Pattern vs. Simple `set`
|
||||
## 何时使用 Reducer 模式 vs. 简单 `set`
|
||||
|
||||
### Use Reducer Pattern When
|
||||
### 使用 Reducer 模式的场景
|
||||
|
||||
Suitable for complex data structure management, especially:
|
||||
|
||||
- Managing object lists or maps (e.g., `messagesMap`, `topicMaps`)
|
||||
- Scenarios requiring optimistic updates
|
||||
- Complex state transition logic
|
||||
- Type-safe action payloads needed
|
||||
适用于复杂的数据结构管理,特别是:
|
||||
- 管理对象列表或映射(如 `messagesMap`, `topicMaps`)
|
||||
- 需要乐观更新的场景
|
||||
- 状态转换逻辑复杂
|
||||
- 需要类型安全的 action payload
|
||||
|
||||
```typescript
|
||||
// Reducer pattern example - Complex message state management
|
||||
// Reducer 模式示例 - 复杂消息状态管理
|
||||
export const messagesReducer = (state: ChatMessage[], payload: MessageDispatch): ChatMessage[] => {
|
||||
switch (payload.type) {
|
||||
case 'updateMessage': {
|
||||
return produce(state, (draftState) => {
|
||||
const index = draftState.findIndex((i) => i.id === payload.id);
|
||||
if (index < 0) return;
|
||||
draftState[index] = merge(draftState[index], {
|
||||
...payload.value,
|
||||
updatedAt: Date.now(),
|
||||
draftState[index] = merge(draftState[index], {
|
||||
...payload.value,
|
||||
updatedAt: Date.now()
|
||||
});
|
||||
});
|
||||
}
|
||||
case 'createMessage': {
|
||||
// ...
|
||||
return produce(state, (draftState) => {
|
||||
draftState.push({
|
||||
...payload.value,
|
||||
id: payload.id,
|
||||
createdAt: Date.now(),
|
||||
updatedAt: Date.now(),
|
||||
meta: {}
|
||||
});
|
||||
});
|
||||
}
|
||||
// ...other complex state transitions
|
||||
// ...其他复杂状态转换
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### Use Simple `set` When
|
||||
### 使用简单 `set` 的场景
|
||||
|
||||
Suitable for simple state updates:
|
||||
|
||||
- Toggling boolean values
|
||||
- Updating simple strings/numbers
|
||||
- Setting single state fields
|
||||
适用于简单状态更新:
|
||||
- 切换布尔值
|
||||
- 更新简单字符串/数字
|
||||
- 设置单一状态字段
|
||||
|
||||
```typescript
|
||||
// Simple set example
|
||||
// 简单 set 示例
|
||||
updateInputMessage: (message) => {
|
||||
if (isEqual(message, get().inputMessage)) return;
|
||||
set({ inputMessage: message }, false, n('updateInputMessage'));
|
||||
@@ -131,45 +142,45 @@ togglePortal: (open?: boolean) => {
|
||||
},
|
||||
```
|
||||
|
||||
## Optimistic Update Implementation Patterns
|
||||
## 乐观更新实现模式
|
||||
|
||||
Optimistic updates are a core pattern in LobeChat for providing smooth user experience:
|
||||
乐观更新是 LobeChat 中的核心模式,用于提供流畅的用户体验:
|
||||
|
||||
### Standard Optimistic Update Flow
|
||||
### 标准乐观更新流程
|
||||
|
||||
```typescript
|
||||
// Complete optimistic update example
|
||||
// 完整的乐观更新示例
|
||||
internal_updateMessageContent: async (id, content, extra) => {
|
||||
const { internal_dispatchMessage, refreshMessages } = get();
|
||||
|
||||
// 1. Immediately update frontend state (optimistic update)
|
||||
// 1. 立即更新前端状态(乐观更新)
|
||||
internal_dispatchMessage({
|
||||
id,
|
||||
type: 'updateMessage',
|
||||
value: { content },
|
||||
});
|
||||
|
||||
// 2. Call backend service
|
||||
// 2. 调用后端服务
|
||||
await messageService.updateMessage(id, {
|
||||
content,
|
||||
tools: extra?.toolCalls ? internal_transformToolCalls(extra.toolCalls) : undefined,
|
||||
// ...other fields
|
||||
// ...其他字段
|
||||
});
|
||||
|
||||
// 3. Refresh to ensure data consistency
|
||||
// 3. 刷新确保数据一致性
|
||||
await refreshMessages();
|
||||
},
|
||||
```
|
||||
|
||||
### Optimistic Update for Create Operations
|
||||
### 创建操作的乐观更新
|
||||
|
||||
```typescript
|
||||
internal_createMessage: async (message, context) => {
|
||||
const { internal_createTmpMessage, refreshMessages, internal_toggleMessageLoading } = get();
|
||||
|
||||
|
||||
let tempId = context?.tempMessageId;
|
||||
if (!tempId) {
|
||||
// Create temporary message for optimistic update
|
||||
// 创建临时消息用于乐观更新
|
||||
tempId = internal_createTmpMessage(message);
|
||||
internal_toggleMessageLoading(true, tempId);
|
||||
}
|
||||
@@ -183,7 +194,7 @@ internal_createMessage: async (message, context) => {
|
||||
return id;
|
||||
} catch (e) {
|
||||
internal_toggleMessageLoading(false, tempId);
|
||||
// Error handling: update message error state
|
||||
// 错误处理:更新消息错误状态
|
||||
internal_dispatchMessage({
|
||||
id: tempId,
|
||||
type: 'updateMessage',
|
||||
@@ -193,77 +204,96 @@ internal_createMessage: async (message, context) => {
|
||||
},
|
||||
```
|
||||
|
||||
### Delete Operation Pattern (No Optimistic Update)
|
||||
### 删除操作模式(不使用乐观更新)
|
||||
|
||||
Delete operations typically don't suit optimistic updates because:
|
||||
|
||||
- Deletion is destructive; error recovery is complex
|
||||
- Users have lower expectations for immediate feedback on deletions
|
||||
- Restoring state on deletion failure causes confusion
|
||||
删除操作通常不适合乐观更新,因为:
|
||||
- 删除是破坏性操作,错误恢复复杂
|
||||
- 用户对删除操作的即时反馈期望较低
|
||||
- 删除失败时恢复原状态会造成困惑
|
||||
|
||||
```typescript
|
||||
// Standard delete operation pattern - No optimistic update
|
||||
// 删除操作的标准模式 - 无乐观更新
|
||||
removeGenerationTopic: async (id: string) => {
|
||||
const { internal_removeGenerationTopic } = get();
|
||||
await internal_removeGenerationTopic(id);
|
||||
},
|
||||
|
||||
internal_removeGenerationTopic: async (id: string) => {
|
||||
// 1. Show loading state
|
||||
// 1. 显示加载状态
|
||||
get().internal_updateGenerationTopicLoading(id, true);
|
||||
|
||||
|
||||
try {
|
||||
// 2. Directly call backend service
|
||||
// 2. 直接调用后端服务
|
||||
await generationTopicService.deleteTopic(id);
|
||||
|
||||
// 3. Refresh data to get latest state
|
||||
|
||||
// 3. 刷新数据获取最新状态
|
||||
await get().refreshGenerationTopics();
|
||||
} finally {
|
||||
// 4. Ensure loading state is cleared (whether success or failure)
|
||||
// 4. 确保清除加载状态(无论成功或失败)
|
||||
get().internal_updateGenerationTopicLoading(id, false);
|
||||
}
|
||||
},
|
||||
```
|
||||
|
||||
Delete operation characteristics:
|
||||
删除操作的特点:
|
||||
- 直接调用服务,不预先更新状态
|
||||
- 依赖 loading 状态提供用户反馈
|
||||
- 操作完成后刷新整个列表确保一致性
|
||||
- 使用 `try/finally` 确保 loading 状态总是被清理
|
||||
|
||||
- Directly call service without pre-updating state
|
||||
- Rely on loading state for user feedback
|
||||
- Refresh entire list after operation to ensure consistency
|
||||
- Use `try/finally` to ensure loading state is always cleaned up
|
||||
## 加载状态管理模式
|
||||
|
||||
## Loading State Management Pattern
|
||||
LobeChat 使用统一的加载状态管理模式:
|
||||
|
||||
LobeChat uses a unified loading state management pattern:
|
||||
|
||||
### Array-based Loading State
|
||||
### 数组式加载状态
|
||||
|
||||
```typescript
|
||||
// Define in initialState.ts
|
||||
// 在 initialState.ts 中定义
|
||||
export interface ChatMessageState {
|
||||
messageEditingIds: string[]; // Message editing state
|
||||
messageLoadingIds: string[]; // 消息加载状态
|
||||
messageEditingIds: string[]; // 消息编辑状态
|
||||
chatLoadingIds: string[]; // 对话生成状态
|
||||
}
|
||||
|
||||
// Manage in action
|
||||
{
|
||||
toggleMessageEditing: (id, editing) => {
|
||||
set(
|
||||
{ messageEditingIds: toggleBooleanList(get().messageEditingIds, id, editing) },
|
||||
false,
|
||||
'toggleMessageEditing',
|
||||
);
|
||||
};
|
||||
}
|
||||
// 在 action 中管理
|
||||
internal_toggleMessageLoading: (loading, id) => {
|
||||
set({
|
||||
messageLoadingIds: toggleBooleanList(get().messageLoadingIds, id, loading),
|
||||
}, false, `internal_toggleMessageLoading/${loading ? 'start' : 'end'}`);
|
||||
},
|
||||
```
|
||||
|
||||
## SWR Integration Pattern
|
||||
|
||||
LobeChat uses SWR for data fetching and cache management:
|
||||
|
||||
### Hook-based Data Fetching
|
||||
### 统一的加载状态工具
|
||||
|
||||
```typescript
|
||||
// Define SWR hook in action.ts
|
||||
// 通用的加载状态切换工具
|
||||
internal_toggleLoadingArrays: (key, loading, id, action) => {
|
||||
const abortControllerKey = `${key}AbortController`;
|
||||
|
||||
if (loading) {
|
||||
const abortController = new AbortController();
|
||||
set({
|
||||
[abortControllerKey]: abortController,
|
||||
[key]: toggleBooleanList(get()[key] as string[], id!, loading),
|
||||
}, false, action);
|
||||
return abortController;
|
||||
} else {
|
||||
set({
|
||||
[abortControllerKey]: undefined,
|
||||
[key]: id ? toggleBooleanList(get()[key] as string[], id, loading) : [],
|
||||
}, false, action);
|
||||
}
|
||||
},
|
||||
```
|
||||
|
||||
## SWR 集成模式
|
||||
|
||||
LobeChat 使用 SWR 进行数据获取和缓存管理:
|
||||
|
||||
### Hook 式数据获取
|
||||
|
||||
```typescript
|
||||
// 在 action.ts 中定义 SWR hook
|
||||
useFetchMessages: (enable, sessionId, activeTopicId) =>
|
||||
useClientDataSWR<ChatMessage[]>(
|
||||
enable ? [SWR_USE_FETCH_MESSAGES, sessionId, activeTopicId] : null,
|
||||
@@ -274,55 +304,57 @@ useFetchMessages: (enable, sessionId, activeTopicId) =>
|
||||
...get().messagesMap,
|
||||
[messageMapKey(sessionId, activeTopicId)]: messages,
|
||||
};
|
||||
|
||||
|
||||
if (get().messagesInit && isEqual(nextMap, get().messagesMap)) return;
|
||||
|
||||
|
||||
set({ messagesInit: true, messagesMap: nextMap }, false, n('useFetchMessages'));
|
||||
},
|
||||
},
|
||||
),
|
||||
```
|
||||
|
||||
### Cache Invalidation and Refresh
|
||||
### 缓存失效和刷新
|
||||
|
||||
```typescript
|
||||
// Standard data refresh pattern
|
||||
// 刷新数据的标准模式
|
||||
refreshMessages: async () => {
|
||||
await mutate([SWR_USE_FETCH_MESSAGES, get().activeId, get().activeTopicId]);
|
||||
};
|
||||
},
|
||||
|
||||
refreshTopic: async () => {
|
||||
return mutate([SWR_USE_FETCH_TOPIC, get().activeId]);
|
||||
},
|
||||
```
|
||||
|
||||
## Naming Convention Summary
|
||||
## 命名规范总结
|
||||
|
||||
### Action Naming Patterns
|
||||
|
||||
- Public Actions: Verb form, describing user intent
|
||||
### Action 命名模式
|
||||
- Public Actions: 动词形式,描述用户意图
|
||||
- `createTopic`, `sendMessage`, `regenerateMessage`
|
||||
- Internal Actions: `internal_` + verb, describing internal operation
|
||||
- Internal Actions: `internal_` + 动词,描述内部操作
|
||||
- `internal_createTopic`, `internal_updateMessageContent`
|
||||
- Dispatch Methods: `internal_dispatch` + entity name
|
||||
- Dispatch Methods: `internal_dispatch` + 实体名
|
||||
- `internal_dispatchTopic`, `internal_dispatchMessage`
|
||||
- Toggle Methods: `internal_toggle` + state name
|
||||
- Toggle Methods: `internal_toggle` + 状态名
|
||||
- `internal_toggleMessageLoading`, `internal_toggleChatLoading`
|
||||
|
||||
### State Naming Patterns
|
||||
### 状态命名模式
|
||||
- ID 数组: `[entity]LoadingIds`, `[entity]EditingIds`
|
||||
- 映射结构: `[entity]Maps`, `[entity]Map`
|
||||
- 当前激活: `active[Entity]Id`
|
||||
- 初始化标记: `[entity]sInit`
|
||||
|
||||
- ID arrays: `[entity]LoadingIds`, `[entity]EditingIds`
|
||||
- Map structures: `[entity]Maps`, `[entity]Map`
|
||||
- Currently active: `active[Entity]Id`
|
||||
- Initialization flags: `[entity]sInit`
|
||||
## 最佳实践
|
||||
|
||||
## Best Practices
|
||||
1. 合理使用乐观更新:
|
||||
- ✅ 适用:创建、更新操作(用户交互频繁)
|
||||
- ❌ 避免:删除操作(破坏性操作,错误恢复复杂)
|
||||
2. 加载状态管理:使用统一的加载状态数组管理并发操作
|
||||
3. 类型安全:为所有 action payload 定义 TypeScript 接口
|
||||
4. SWR 集成:使用 SWR 管理数据获取和缓存失效
|
||||
5. AbortController:为长时间运行的操作提供取消能力
|
||||
6. 操作模式选择:
|
||||
- 创建/更新:乐观更新 + 最终一致性
|
||||
- 删除:加载状态 + 服务调用 + 数据刷新
|
||||
|
||||
1. Use optimistic updates appropriately:
|
||||
- ✅ Suitable: Create, update operations (frequent user interaction)
|
||||
- ❌ Avoid: Delete operations (destructive, complex error recovery)
|
||||
2. Loading state management: Use unified loading state arrays to manage concurrent operations
|
||||
3. Type safety: Define TypeScript interfaces for all action payloads
|
||||
4. SWR integration: Use SWR to manage data fetching and cache invalidation
|
||||
5. AbortController: Provide cancellation capability for long-running operations
|
||||
6. Operation mode selection:
|
||||
- Create/Update: Optimistic update + eventual consistency
|
||||
- Delete: Loading state + service call + data refresh
|
||||
|
||||
This Action organization pattern ensures code consistency, maintainability, and provides excellent user experience.
|
||||
这套 Action 组织模式确保了代码的一致性、可维护性,并提供了优秀的用户体验。
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
---
|
||||
description:
|
||||
description:
|
||||
globs: src/store/**
|
||||
alwaysApply: false
|
||||
---
|
||||
|
||||
# LobeChat Zustand Store Slice 组织架构
|
||||
|
||||
本文档描述了 LobeChat 项目中 Zustand Store 的模块化 Slice 组织方式,展示如何通过分片架构管理复杂的应用状态。
|
||||
@@ -70,7 +69,7 @@ export const useChatStore = createWithEqualityFn<ChatStore>()(
|
||||
|
||||
每个 slice 位于 `src/store/chat/slices/[sliceName]/` 目录下:
|
||||
|
||||
```plaintext
|
||||
```
|
||||
src/store/chat/slices/
|
||||
└── [sliceName]/ # 例如 message, topic, aiChat, builtinTool
|
||||
├── action.ts # 定义 actions (或者是一个 actions/ 目录)
|
||||
@@ -160,16 +159,15 @@ export const topicReducer = (state: ChatTopic[] = [], payload: ChatTopicDispatch
|
||||
// 典型的 selectors.ts 结构
|
||||
import { ChatStoreState } from '../../initialState';
|
||||
|
||||
const currentTopics = (s: ChatStoreState): ChatTopic[] | undefined => s.topicMaps[s.activeId];
|
||||
const currentTopics = (s: ChatStoreState): ChatTopic[] | undefined =>
|
||||
s.topicMaps[s.activeId];
|
||||
|
||||
const currentActiveTopic = (s: ChatStoreState): ChatTopic | undefined => {
|
||||
return currentTopics(s)?.find((topic) => topic.id === s.activeTopicId);
|
||||
};
|
||||
|
||||
const getTopicById =
|
||||
(id: string) =>
|
||||
(s: ChatStoreState): ChatTopic | undefined =>
|
||||
currentTopics(s)?.find((topic) => topic.id === id);
|
||||
const getTopicById = (id: string) => (s: ChatStoreState): ChatTopic | undefined =>
|
||||
currentTopics(s)?.find((topic) => topic.id === id);
|
||||
|
||||
// 核心模式:使用 xxxSelectors 聚合导出
|
||||
export const topicSelectors = {
|
||||
@@ -221,15 +219,13 @@ src/store/chat/slices/builtinTool/
|
||||
## 状态设计模式
|
||||
|
||||
### 1. Map 结构用于关联数据
|
||||
|
||||
```typescript
|
||||
// 以 sessionId 为 key,管理多个会话的数据
|
||||
topicMaps: Record<string, ChatTopic[]>;
|
||||
messagesMap: Record<string, ChatMessage[]>;
|
||||
topicMaps: Record<string, ChatTopic[]>
|
||||
messagesMap: Record<string, ChatMessage[]>
|
||||
```
|
||||
|
||||
### 2. 数组用于加载状态管理
|
||||
|
||||
```typescript
|
||||
// 管理多个并发操作的加载状态
|
||||
messageLoadingIds: string[]
|
||||
@@ -238,7 +234,6 @@ chatLoadingIds: string[]
|
||||
```
|
||||
|
||||
### 3. 可选字段用于当前活动项
|
||||
|
||||
```typescript
|
||||
// 当前激活的实体 ID
|
||||
activeId: string
|
||||
@@ -249,7 +244,6 @@ activeThreadId?: string
|
||||
## Slice 集成到顶层 Store
|
||||
|
||||
### 1. 状态聚合
|
||||
|
||||
```typescript
|
||||
// 在 initialState.ts 中
|
||||
export type ChatStoreState = ChatTopicState &
|
||||
@@ -259,7 +253,6 @@ export type ChatStoreState = ChatTopicState &
|
||||
```
|
||||
|
||||
### 2. Action 接口聚合
|
||||
|
||||
```typescript
|
||||
// 在 store.ts 中
|
||||
export interface ChatStoreAction
|
||||
@@ -270,7 +263,6 @@ export interface ChatStoreAction
|
||||
```
|
||||
|
||||
### 3. Selector 统一导出
|
||||
|
||||
```typescript
|
||||
// 在 selectors.ts 中 - 统一聚合 selectors
|
||||
export { chatSelectors } from './slices/message/selectors';
|
||||
|
||||
+1
-2
@@ -1,7 +1,6 @@
|
||||
const config = require('@lobehub/lint').eslint;
|
||||
|
||||
config.root = true;
|
||||
config.extends.push('plugin:@next/next/recommended-legacy');
|
||||
config.extends.push('plugin:@next/next/recommended');
|
||||
|
||||
config.rules['unicorn/no-negated-condition'] = 0;
|
||||
config.rules['unicorn/prefer-type-error'] = 0;
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
name: Setup Node and Bun
|
||||
description: Setup Node.js and Bun for workflows
|
||||
|
||||
inputs:
|
||||
node-version:
|
||||
description: Node.js version
|
||||
required: true
|
||||
bun-version:
|
||||
description: Bun version
|
||||
required: true
|
||||
package-manager-cache:
|
||||
description: Pass-through to actions/setup-node package-manager-cache
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ inputs.node-version }}
|
||||
package-manager-cache: ${{ inputs.package-manager-cache }}
|
||||
|
||||
- name: Install bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: ${{ inputs.bun-version }}
|
||||
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
name: Setup Node and pnpm
|
||||
description: Setup Node.js and pnpm for workflows
|
||||
|
||||
inputs:
|
||||
node-version:
|
||||
description: Node.js version
|
||||
required: true
|
||||
package-manager-cache:
|
||||
description: Pass-through to actions/setup-node package-manager-cache
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ inputs.node-version }}
|
||||
package-manager-cache: ${{ inputs.package-manager-cache }}
|
||||
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
name: Bundle Analyzer
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
|
||||
env:
|
||||
NODE_VERSION: 24.11.1
|
||||
BUN_VERSION: 1.2.23
|
||||
|
||||
jobs:
|
||||
bundle-analyzer:
|
||||
name: Analyze Bundle Size
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: ${{ env.BUN_VERSION }}
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm i
|
||||
|
||||
- name: Ensure lockfile exists
|
||||
run: |
|
||||
# Temporarily override .npmrc lockfile=false setting
|
||||
# to generate pnpm-lock.yaml for reproducible builds
|
||||
if [ ! -f "pnpm-lock.yaml" ]; then
|
||||
echo "Generating pnpm-lock.yaml..."
|
||||
# Create temporary .npmrc override
|
||||
mv .npmrc .npmrc.bak
|
||||
echo "lockfile=true" > .npmrc
|
||||
cat .npmrc.bak >> .npmrc
|
||||
pnpm i
|
||||
mv .npmrc.bak .npmrc
|
||||
fi
|
||||
|
||||
- name: Generate build secrets
|
||||
id: generate-secret
|
||||
run: echo "secret=$(openssl rand -base64 32)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build with bundle analyzer
|
||||
run: bun run build:analyze || true
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
KEY_VAULTS_SECRET: ${{ secrets.KEY_VAULTS_SECRET || steps.generate-secret.outputs.secret }}
|
||||
|
||||
- name: Prepare analyzer reports
|
||||
run: |
|
||||
mkdir -p bundle-report
|
||||
# Copy analyzer HTML reports if they exist
|
||||
if [ -d ".next/analyze" ]; then
|
||||
cp -r .next/analyze/* bundle-report/ || true
|
||||
fi
|
||||
# Also check if reports are in .vercel/output
|
||||
if [ -d ".vercel/output/.next/analyze" ]; then
|
||||
cp -r .vercel/output/.next/analyze/* bundle-report/ || true
|
||||
fi
|
||||
# Include pnpm lockfile for reproducible builds
|
||||
if [ -f "pnpm-lock.yaml" ]; then
|
||||
cp pnpm-lock.yaml bundle-report/pnpm-lock.yaml
|
||||
echo "Copied pnpm-lock.yaml to bundle-report"
|
||||
else
|
||||
echo "Warning: pnpm-lock.yaml not found"
|
||||
fi
|
||||
# Create a summary with build metadata
|
||||
echo "# Bundle Analysis Report" > bundle-report/README.md
|
||||
echo "" >> bundle-report/README.md
|
||||
echo "**Build Date:** $(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> bundle-report/README.md
|
||||
echo "**Commit:** ${{ github.sha }}" >> bundle-report/README.md
|
||||
echo "**Branch:** ${{ github.ref_name }}" >> bundle-report/README.md
|
||||
echo "" >> bundle-report/README.md
|
||||
echo "## How to view" >> bundle-report/README.md
|
||||
echo "" >> bundle-report/README.md
|
||||
echo "1. Download the \`bundle-report\` artifact from this workflow run" >> bundle-report/README.md
|
||||
echo "2. Extract the archive" >> bundle-report/README.md
|
||||
echo "3. Open \`client.html\` and \`server.html\` in your browser" >> bundle-report/README.md
|
||||
echo "" >> bundle-report/README.md
|
||||
echo "## Files in this report" >> bundle-report/README.md
|
||||
echo "" >> bundle-report/README.md
|
||||
echo "- \`client.html\` - Client-side bundle analysis" >> bundle-report/README.md
|
||||
echo "- \`server.html\` - Server-side bundle analysis" >> bundle-report/README.md
|
||||
echo "- \`pnpm-lock.yaml\` - pnpm lockfile (for reproducible builds)" >> bundle-report/README.md
|
||||
|
||||
- name: Upload bundle analyzer reports
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: bundle-report-${{ github.run_id }}
|
||||
path: bundle-report/
|
||||
retention-days: 30
|
||||
if-no-files-found: warn
|
||||
|
||||
- name: Create summary comment
|
||||
run: |
|
||||
echo "## Bundle Analysis Complete :chart_with_upwards_trend:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Commit:** \`${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Artifact:** \`bundle-report-${{ github.run_id }}\`" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Download the artifact to view the detailed bundle analysis reports." >> $GITHUB_STEP_SUMMARY
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
name: Build desktop Next bundle
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
UPDATE_CHANNEL: nightly
|
||||
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ secrets.UMAMI_NIGHTLY_DESKTOP_PROJECT_ID || 'dummy-desktop-project' }}
|
||||
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ secrets.UMAMI_NIGHTLY_DESKTOP_BASE_URL || 'https://analytics.example.com' }}
|
||||
|
||||
@@ -10,19 +10,6 @@ concurrency:
|
||||
group: e2e-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres
|
||||
DATABASE_DRIVER: node
|
||||
KEY_VAULTS_SECRET: LA7n9k3JdEcbSgml2sxfw+4TV1AzaaFU5+R176aQz4s=
|
||||
BETTER_AUTH_SECRET: e2e-test-secret-key-for-better-auth-32chars!
|
||||
NEXT_PUBLIC_ENABLE_BETTER_AUTH: '1'
|
||||
NEXT_PUBLIC_AUTH_EMAIL_VERIFICATION: '0'
|
||||
# Mock S3 env vars to prevent initialization errors
|
||||
S3_ACCESS_KEY_ID: e2e-mock-access-key
|
||||
S3_SECRET_ACCESS_KEY: e2e-mock-secret-key
|
||||
S3_BUCKET: e2e-mock-bucket
|
||||
S3_ENDPOINT: https://e2e-mock-s3.localhost
|
||||
|
||||
jobs:
|
||||
e2e:
|
||||
name: Test Web App
|
||||
@@ -38,7 +25,7 @@ jobs:
|
||||
ports:
|
||||
- 5432:5432
|
||||
|
||||
timeout-minutes: 30
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
@@ -54,15 +41,12 @@ jobs:
|
||||
- name: Install Playwright browsers (with system deps)
|
||||
run: bunx playwright install --with-deps chromium
|
||||
|
||||
- name: Run database migrations
|
||||
run: bun run db:migrate
|
||||
|
||||
- name: Build application
|
||||
run: bun run build
|
||||
env:
|
||||
SKIP_LINT: '1'
|
||||
|
||||
- name: Run E2E tests
|
||||
env:
|
||||
PORT: 3010
|
||||
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres
|
||||
DATABASE_DRIVER: node
|
||||
KEY_VAULTS_SECRET: LA7n9k3JdEcbSgml2sxfw+4TV1AzaaFU5+R176aQz4s=
|
||||
run: bun run e2e
|
||||
|
||||
- name: Upload Cucumber HTML report (on failure)
|
||||
|
||||
@@ -1,337 +0,0 @@
|
||||
name: Desktop Manual Build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
description: 'Release channel for desktop build (affects version suffix and workflow:set-desktop-version)'
|
||||
required: true
|
||||
default: nightly
|
||||
type: choice
|
||||
options:
|
||||
- nightly
|
||||
- beta
|
||||
- stable
|
||||
build_macos:
|
||||
description: 'Build macOS artifacts'
|
||||
required: true
|
||||
default: true
|
||||
type: boolean
|
||||
build_windows:
|
||||
description: 'Build Windows artifacts'
|
||||
required: true
|
||||
default: true
|
||||
type: boolean
|
||||
build_linux:
|
||||
description: 'Build Linux artifacts'
|
||||
required: true
|
||||
default: true
|
||||
type: boolean
|
||||
version:
|
||||
description: 'Override desktop version (e.g. 1.2.3). Leave empty to auto-generate.'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
concurrency:
|
||||
group: manual-${{ github.ref }}-${{ github.workflow }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
NODE_VERSION: 24.11.1
|
||||
BUN_VERSION: 1.2.23
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Code quality check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout base
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & Bun
|
||||
uses: ./.github/actions/setup-node-bun
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
bun-version: ${{ env.BUN_VERSION }}
|
||||
package-manager-cache: 'false'
|
||||
|
||||
- name: Install deps
|
||||
run: bun i
|
||||
|
||||
- name: Lint
|
||||
run: bun run lint
|
||||
|
||||
version:
|
||||
name: Determine version
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
version: ${{ steps.set_version.outputs.version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
package-manager-cache: false
|
||||
|
||||
- name: Set version
|
||||
id: set_version
|
||||
env:
|
||||
INPUT_VERSION: ${{ inputs.version }}
|
||||
CHANNEL: ${{ inputs.channel }}
|
||||
run: |
|
||||
base_version=$(node -p "require('./apps/desktop/package.json').version")
|
||||
|
||||
if [ -n "$INPUT_VERSION" ]; then
|
||||
version="$INPUT_VERSION"
|
||||
echo "📦 Using provided version: ${version} (base: ${base_version})"
|
||||
else
|
||||
ci_build_number="${{ github.run_number }}"
|
||||
version="0.0.0-${CHANNEL}.manual.${ci_build_number}"
|
||||
echo "📦 Generated version: ${version} (base: ${base_version})"
|
||||
fi
|
||||
|
||||
echo "version=${version}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Version Summary
|
||||
run: |
|
||||
echo "🚦 Release Version: ${{ steps.set_version.outputs.version }}"
|
||||
|
||||
build-macos:
|
||||
needs: [version, test]
|
||||
name: Build Desktop App (macOS)
|
||||
if: inputs.build_macos
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, macos-15-intel]
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & pnpm
|
||||
uses: ./.github/actions/setup-node-pnpm
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
package-manager-cache: 'false'
|
||||
|
||||
# node-linker=hoisted 模式将可以确保 asar 压缩可用
|
||||
- name: Install dependencies
|
||||
run: pnpm install --node-linker=hoisted
|
||||
|
||||
- name: Install deps on Desktop
|
||||
run: npm run install-isolated --prefix=./apps/desktop
|
||||
|
||||
- name: Set package version
|
||||
run: npm run workflow:set-desktop-version ${{ needs.version.outputs.version }} ${{ inputs.channel }}
|
||||
|
||||
- name: Build artifact on macOS
|
||||
run: npm run desktop:build
|
||||
env:
|
||||
UPDATE_CHANNEL: ${{ inputs.channel }}
|
||||
APP_URL: http://localhost:3015
|
||||
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
|
||||
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
|
||||
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ inputs.channel == 'beta' && secrets.UMAMI_BETA_DESKTOP_PROJECT_ID || secrets.UMAMI_NIGHTLY_DESKTOP_PROJECT_ID }}
|
||||
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ inputs.channel == 'beta' && secrets.UMAMI_BETA_DESKTOP_BASE_URL || secrets.UMAMI_NIGHTLY_DESKTOP_BASE_URL }}
|
||||
CSC_FOR_PULL_REQUEST: true
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
|
||||
- name: Rename macOS latest-mac.yml for multi-architecture support
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
cd apps/desktop/release
|
||||
if [ -f "latest-mac.yml" ]; then
|
||||
SYSTEM_ARCH=$(uname -m)
|
||||
if [[ "$SYSTEM_ARCH" == "arm64" ]]; then
|
||||
ARCH_SUFFIX="arm64"
|
||||
else
|
||||
ARCH_SUFFIX="x64"
|
||||
fi
|
||||
|
||||
mv latest-mac.yml "latest-mac-${ARCH_SUFFIX}.yml"
|
||||
echo "✅ Renamed latest-mac.yml to latest-mac-${ARCH_SUFFIX}.yml (detected: $SYSTEM_ARCH)"
|
||||
ls -la latest-mac-*.yml
|
||||
else
|
||||
echo "⚠️ latest-mac.yml not found, skipping rename"
|
||||
ls -la latest*.yml || echo "No latest*.yml files found"
|
||||
fi
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: release-${{ matrix.os }}
|
||||
path: |
|
||||
apps/desktop/release/latest*
|
||||
apps/desktop/release/*.dmg*
|
||||
apps/desktop/release/*.zip*
|
||||
apps/desktop/release/*.exe*
|
||||
apps/desktop/release/*.AppImage
|
||||
apps/desktop/release/*.deb*
|
||||
apps/desktop/release/*.snap*
|
||||
apps/desktop/release/*.rpm*
|
||||
apps/desktop/release/*.tar.gz*
|
||||
retention-days: 5
|
||||
|
||||
build-windows:
|
||||
needs: [version, test]
|
||||
name: Build Desktop App (Windows)
|
||||
if: inputs.build_windows
|
||||
runs-on: windows-2025
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & pnpm
|
||||
uses: ./.github/actions/setup-node-pnpm
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
package-manager-cache: 'false'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --node-linker=hoisted
|
||||
|
||||
- name: Install deps on Desktop
|
||||
run: npm run install-isolated --prefix=./apps/desktop
|
||||
|
||||
- name: Set package version
|
||||
run: npm run workflow:set-desktop-version ${{ needs.version.outputs.version }} ${{ inputs.channel }}
|
||||
|
||||
- name: Build artifact on Windows
|
||||
run: npm run desktop:build
|
||||
env:
|
||||
UPDATE_CHANNEL: ${{ inputs.channel }}
|
||||
APP_URL: http://localhost:3015
|
||||
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
|
||||
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
|
||||
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ inputs.channel == 'beta' && secrets.UMAMI_BETA_DESKTOP_PROJECT_ID || secrets.UMAMI_NIGHTLY_DESKTOP_PROJECT_ID }}
|
||||
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ inputs.channel == 'beta' && secrets.UMAMI_BETA_DESKTOP_BASE_URL || secrets.UMAMI_NIGHTLY_DESKTOP_BASE_URL }}
|
||||
TEMP: C:\temp
|
||||
TMP: C:\temp
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: release-windows-2025
|
||||
path: |
|
||||
apps/desktop/release/latest*
|
||||
apps/desktop/release/*.dmg*
|
||||
apps/desktop/release/*.zip*
|
||||
apps/desktop/release/*.exe*
|
||||
apps/desktop/release/*.AppImage
|
||||
apps/desktop/release/*.deb*
|
||||
apps/desktop/release/*.snap*
|
||||
apps/desktop/release/*.rpm*
|
||||
apps/desktop/release/*.tar.gz*
|
||||
retention-days: 5
|
||||
|
||||
build-linux:
|
||||
needs: [version, test]
|
||||
name: Build Desktop App (Linux)
|
||||
if: inputs.build_linux
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & pnpm
|
||||
uses: ./.github/actions/setup-node-pnpm
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
package-manager-cache: 'false'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --node-linker=hoisted
|
||||
|
||||
- name: Install deps on Desktop
|
||||
run: npm run install-isolated --prefix=./apps/desktop
|
||||
|
||||
- name: Set package version
|
||||
run: npm run workflow:set-desktop-version ${{ needs.version.outputs.version }} ${{ inputs.channel }}
|
||||
|
||||
- name: Build artifact on Linux
|
||||
run: npm run desktop:build
|
||||
env:
|
||||
UPDATE_CHANNEL: ${{ inputs.channel }}
|
||||
APP_URL: http://localhost:3015
|
||||
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
|
||||
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
|
||||
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ inputs.channel == 'beta' && secrets.UMAMI_BETA_DESKTOP_PROJECT_ID || secrets.UMAMI_NIGHTLY_DESKTOP_PROJECT_ID }}
|
||||
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ inputs.channel == 'beta' && secrets.UMAMI_BETA_DESKTOP_BASE_URL || secrets.UMAMI_NIGHTLY_DESKTOP_BASE_URL }}
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: release-ubuntu-latest
|
||||
path: |
|
||||
apps/desktop/release/latest*
|
||||
apps/desktop/release/*.dmg*
|
||||
apps/desktop/release/*.zip*
|
||||
apps/desktop/release/*.exe*
|
||||
apps/desktop/release/*.AppImage
|
||||
apps/desktop/release/*.deb*
|
||||
apps/desktop/release/*.snap*
|
||||
apps/desktop/release/*.rpm*
|
||||
apps/desktop/release/*.tar.gz*
|
||||
retention-days: 5
|
||||
|
||||
merge-mac-files:
|
||||
needs: [build-macos, version]
|
||||
name: Merge macOS Release Files
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
if: inputs.build_macos
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node & Bun
|
||||
uses: ./.github/actions/setup-node-bun
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
bun-version: ${{ env.BUN_VERSION }}
|
||||
package-manager-cache: 'false'
|
||||
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
path: release
|
||||
pattern: release-*
|
||||
merge-multiple: true
|
||||
|
||||
- name: List downloaded artifacts
|
||||
run: ls -R release
|
||||
|
||||
- name: Install yaml only for merge step
|
||||
run: |
|
||||
cd scripts/electronWorkflow
|
||||
if [ ! -f package.json ]; then
|
||||
echo '{"name":"merge-mac-release","private":true}' > package.json
|
||||
fi
|
||||
bun add --no-save yaml@2.8.1
|
||||
|
||||
- name: Merge latest-mac.yml files
|
||||
run: bun run scripts/electronWorkflow/mergeMacReleaseFiles.js
|
||||
|
||||
- name: Upload artifacts with merged macOS files
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: merged-release-manual
|
||||
path: release/
|
||||
retention-days: 1
|
||||
@@ -29,22 +29,26 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & Bun
|
||||
uses: ./.github/actions/setup-node-bun
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24.11.1
|
||||
package-manager-cache: false
|
||||
|
||||
- name: Install bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.2.23
|
||||
package-manager-cache: 'false'
|
||||
|
||||
- name: Install deps
|
||||
run: bun i
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
|
||||
- name: Lint
|
||||
run: bun run lint
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
|
||||
version:
|
||||
name: Determine version
|
||||
@@ -80,7 +84,7 @@ jobs:
|
||||
echo "📦 Release Version: ${version} (based on base version ${base_version})"
|
||||
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
|
||||
# 输出版本信息总结,方便在 GitHub Actions 界面查看
|
||||
- name: Version Summary
|
||||
@@ -99,11 +103,16 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & pnpm
|
||||
uses: ./.github/actions/setup-node-pnpm
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24.11.1
|
||||
package-manager-cache: 'false'
|
||||
package-manager-cache: false
|
||||
|
||||
# node-linker=hoisted 模式将可以确保 asar 压缩可用
|
||||
- name: Install dependencies
|
||||
@@ -123,11 +132,11 @@ jobs:
|
||||
run: npm run desktop:build
|
||||
env:
|
||||
# 设置更新通道,PR构建为nightly,否则为stable
|
||||
UPDATE_CHANNEL: 'nightly'
|
||||
UPDATE_CHANNEL: "nightly"
|
||||
APP_URL: http://localhost:3015
|
||||
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
|
||||
DATABASE_URL: "postgresql://postgres@localhost:5432/postgres"
|
||||
# 默认添加一个加密 SECRET
|
||||
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
|
||||
KEY_VAULTS_SECRET: "oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE="
|
||||
# macOS 签名和公证配置(fork 的 PR 访问不到 secrets,会跳过签名)
|
||||
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||
@@ -147,10 +156,10 @@ jobs:
|
||||
run: npm run desktop:build
|
||||
env:
|
||||
# 设置更新通道,PR构建为nightly,否则为stable
|
||||
UPDATE_CHANNEL: 'nightly'
|
||||
UPDATE_CHANNEL: "nightly"
|
||||
APP_URL: http://localhost:3015
|
||||
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
|
||||
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
|
||||
DATABASE_URL: "postgresql://postgres@localhost:5432/postgres"
|
||||
KEY_VAULTS_SECRET: "oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE="
|
||||
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ secrets.UMAMI_NIGHTLY_DESKTOP_PROJECT_ID }}
|
||||
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ secrets.UMAMI_NIGHTLY_DESKTOP_BASE_URL }}
|
||||
# 将 TEMP 和 TMP 目录设置到 C 盘
|
||||
@@ -163,10 +172,10 @@ jobs:
|
||||
run: npm run desktop:build
|
||||
env:
|
||||
# 设置更新通道,PR构建为nightly,否则为stable
|
||||
UPDATE_CHANNEL: 'nightly'
|
||||
UPDATE_CHANNEL: "nightly"
|
||||
APP_URL: http://localhost:3015
|
||||
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
|
||||
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
|
||||
DATABASE_URL: "postgresql://postgres@localhost:5432/postgres"
|
||||
KEY_VAULTS_SECRET: "oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE="
|
||||
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ secrets.UMAMI_NIGHTLY_DESKTOP_PROJECT_ID }}
|
||||
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ secrets.UMAMI_NIGHTLY_DESKTOP_BASE_URL }}
|
||||
|
||||
@@ -220,12 +229,16 @@ jobs:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node & Bun
|
||||
uses: ./.github/actions/setup-node-bun
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24.11.1
|
||||
package-manager-cache: false
|
||||
|
||||
- name: Install bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.2.23
|
||||
package-manager-cache: 'false'
|
||||
|
||||
# 下载所有平台的构建产物
|
||||
- name: Download artifacts
|
||||
|
||||
@@ -143,10 +143,10 @@ jobs:
|
||||
run: pnpm install
|
||||
working-directory: apps/desktop
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
|
||||
- name: Typecheck Desktop
|
||||
run: pnpm type-check
|
||||
run: pnpm typecheck
|
||||
working-directory: apps/desktop
|
||||
|
||||
- name: Test Desktop Client
|
||||
@@ -173,7 +173,6 @@ jobs:
|
||||
options: >-
|
||||
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
||||
|
||||
|
||||
ports:
|
||||
- 5432:5432
|
||||
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
name: Verify Desktop Patch
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- next
|
||||
- dev
|
||||
paths:
|
||||
- 'scripts/electronWorkflow/**'
|
||||
- 'src/libs/next/config/**'
|
||||
- 'src/app/**'
|
||||
- 'src/layout/**'
|
||||
- 'src/components/mdx/**'
|
||||
- 'src/features/DevPanel/**'
|
||||
- 'src/server/translation.ts'
|
||||
pull_request:
|
||||
paths:
|
||||
- 'scripts/electronWorkflow/**'
|
||||
- 'src/libs/next/config/**'
|
||||
- 'src/app/**'
|
||||
- 'src/layout/**'
|
||||
- 'src/components/mdx/**'
|
||||
- 'src/features/DevPanel/**'
|
||||
- 'src/server/translation.ts'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
NODE_VERSION: 24.11.1
|
||||
BUN_VERSION: 1.2.23
|
||||
|
||||
jobs:
|
||||
verify:
|
||||
name: Desktop patch smoke test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node & Bun
|
||||
uses: ./.github/actions/setup-node-bun
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
bun-version: ${{ env.BUN_VERSION }}
|
||||
|
||||
- name: Install deps
|
||||
run: bun i
|
||||
|
||||
- name: Verify desktop patch
|
||||
run: bun scripts/electronWorkflow/modifiers/index.mts
|
||||
+4
-2
@@ -93,6 +93,7 @@ robots.txt
|
||||
.husky/prepare-commit-msg
|
||||
|
||||
# Documents and media
|
||||
*.patch
|
||||
*.pdf
|
||||
|
||||
# Cloud service keys
|
||||
@@ -113,6 +114,7 @@ CLAUDE.local.md
|
||||
*.ppt*
|
||||
*.doc*
|
||||
*.xls*
|
||||
|
||||
e2e/reports
|
||||
out
|
||||
i18n-unused-keys-report.json
|
||||
|
||||
out
|
||||
+3
-3
@@ -1,14 +1,14 @@
|
||||
const { defineConfig } = require('@lobehub/i18n-cli');
|
||||
|
||||
module.exports = defineConfig({
|
||||
entry: 'locales/en-US',
|
||||
entryLocale: 'en-US',
|
||||
entry: 'locales/zh-CN',
|
||||
entryLocale: 'zh-CN',
|
||||
output: 'locales',
|
||||
outputLocales: [
|
||||
'ar',
|
||||
'bg-BG',
|
||||
'zh-CN',
|
||||
'zh-TW',
|
||||
'en-US',
|
||||
'ru-RU',
|
||||
'ja-JP',
|
||||
'ko-KR',
|
||||
|
||||
Vendored
+6
-8
@@ -7,16 +7,14 @@
|
||||
"editor.formatOnSave": true,
|
||||
// don't show errors, but fix when save and git pre commit
|
||||
"eslint.rules.customizations": [
|
||||
// { "rule": "import/order", "severity": "off" },
|
||||
// { "rule": "prettier/prettier", "severity": "off" },
|
||||
// { "rule": "react/jsx-sort-props", "severity": "off" },
|
||||
// { "rule": "sort-keys-fix/sort-keys-fix", "severity": "off" },
|
||||
// { "rule": "simple-import-sort/exports", "severity": "off" },
|
||||
// { "rule": "typescript-sort-keys/interface", "severity": "off" }
|
||||
{ "rule": "import/order", "severity": "off" },
|
||||
{ "rule": "prettier/prettier", "severity": "off" },
|
||||
{ "rule": "react/jsx-sort-props", "severity": "off" },
|
||||
{ "rule": "sort-keys-fix/sort-keys-fix", "severity": "off" },
|
||||
{ "rule": "simple-import-sort/exports", "severity": "off" },
|
||||
{ "rule": "typescript-sort-keys/interface", "severity": "off" }
|
||||
],
|
||||
"eslint.validate": [
|
||||
// vscode eslint not 插件兼容性有问题
|
||||
// "json",
|
||||
"javascript",
|
||||
"javascriptreact",
|
||||
"typescript",
|
||||
|
||||
@@ -66,7 +66,7 @@ The project follows a well-organized monorepo structure:
|
||||
|
||||
### Type Checking
|
||||
|
||||
- Use `bun run type-check` to check for type errors
|
||||
- Use `bun run typecheck` to check for type errors
|
||||
|
||||
### i18n
|
||||
|
||||
@@ -84,10 +84,10 @@ All following rules are saved under `.cursor/rules/` directory:
|
||||
|
||||
### Frontend
|
||||
|
||||
- `react.mdc` – React component style guide and conventions
|
||||
- `react-component.mdc` – React component style guide and conventions
|
||||
- `i18n.mdc` – Internationalization guide using react-i18next
|
||||
- `typescript.mdc` – TypeScript code style guide
|
||||
- `packages/react-layout-kit.mdc` – Usage guide for Flexbox and Center components from @lobehub/ui
|
||||
- `packages/react-layout-kit.mdc` – Usage guide for react-layout-kit
|
||||
|
||||
### State Management
|
||||
|
||||
|
||||
-667
@@ -2,673 +2,6 @@
|
||||
|
||||
# Changelog
|
||||
|
||||
## [Version 2.0.0-next.190](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.189...v2.0.0-next.190)
|
||||
|
||||
<sup>Released on **2026-01-02**</sup>
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Update i18n.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Update i18n, closes [#11100](https://github.com/lobehub/lobe-chat/issues/11100) ([bb4571b](https://github.com/lobehub/lobe-chat/commit/bb4571b))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.189](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.188...v2.0.0-next.189)
|
||||
|
||||
<sup>Released on **2026-01-01**</sup>
|
||||
|
||||
#### ♻ Code Refactoring
|
||||
|
||||
- **misc**: Migrate to new DropdownMenuV2 and showContextMenu API.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Code refactoring
|
||||
|
||||
- **misc**: Migrate to new DropdownMenuV2 and showContextMenu API, closes [#11079](https://github.com/lobehub/lobe-chat/issues/11079) ([04cfc0e](https://github.com/lobehub/lobe-chat/commit/04cfc0e))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.188](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.187...v2.0.0-next.188)
|
||||
|
||||
<sup>Released on **2026-01-01**</sup>
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Improve tools UI and fix Google schema compatibility.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Improve tools UI and fix Google schema compatibility, closes [#11096](https://github.com/lobehub/lobe-chat/issues/11096) ([70a9cff](https://github.com/lobehub/lobe-chat/commit/70a9cff))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.187](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.186...v2.0.0-next.187)
|
||||
|
||||
<sup>Released on **2026-01-01**</sup>
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Add Gemini 3 Flash & Doubao Seed 1.8 models.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Add Gemini 3 Flash & Doubao Seed 1.8 models, closes [#10832](https://github.com/lobehub/lobe-chat/issues/10832) ([cb35935](https://github.com/lobehub/lobe-chat/commit/cb35935))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.186](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.185...v2.0.0-next.186)
|
||||
|
||||
<sup>Released on **2026-01-01**</sup>
|
||||
|
||||
#### ♻ Code Refactoring
|
||||
|
||||
- **misc**: Refactor oidc env to auth env.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Code refactoring
|
||||
|
||||
- **misc**: Refactor oidc env to auth env, closes [#11095](https://github.com/lobehub/lobe-chat/issues/11095) ([6e8d4ff](https://github.com/lobehub/lobe-chat/commit/6e8d4ff))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.185](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.184...v2.0.0-next.185)
|
||||
|
||||
<sup>Released on **2026-01-01**</sup>
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Update i18n.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Update i18n, closes [#11085](https://github.com/lobehub/lobe-chat/issues/11085) ([0941a52](https://github.com/lobehub/lobe-chat/commit/0941a52))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.184](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.183...v2.0.0-next.184)
|
||||
|
||||
<sup>Released on **2026-01-01**</sup>
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Improve loading and local-system render.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Improve loading and local-system render, closes [#11087](https://github.com/lobehub/lobe-chat/issues/11087) ([44630bc](https://github.com/lobehub/lobe-chat/commit/44630bc))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.183](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.182...v2.0.0-next.183)
|
||||
|
||||
<sup>Released on **2025-12-31**</sup>
|
||||
|
||||
#### 🐛 Bug Fixes
|
||||
|
||||
- **store**: Clear new key data when switchTopic to new state.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's fixed
|
||||
|
||||
- **store**: Clear new key data when switchTopic to new state, closes [#11078](https://github.com/lobehub/lobe-chat/issues/11078) ([180ea14](https://github.com/lobehub/lobe-chat/commit/180ea14))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.182](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.181...v2.0.0-next.182)
|
||||
|
||||
<sup>Released on **2025-12-31**</sup>
|
||||
|
||||
#### ✨ Features
|
||||
|
||||
- **misc**: Brand new 2.0 ui for next.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's improved
|
||||
|
||||
- **misc**: Brand new 2.0 ui for next ([e5d6d3d](https://github.com/lobehub/lobe-chat/commit/e5d6d3d))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.181](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.180...v2.0.0-next.181)
|
||||
|
||||
<sup>Released on **2025-12-31**</sup>
|
||||
|
||||
#### ♻ Code Refactoring
|
||||
|
||||
- **userMemories**: Added `benchmark_locomo` as source unify use the of source type.
|
||||
- **misc**: Add builtin tools, clean code, clean desktop relative code, clean page editor, flatten i18n keys and extract hardcoded strings in desktop, i18n formatting optimization, improve modal handling with createRawModal, move code-interpreter to single packages, refactor builtin-tool implement, refactor hooks, refactor implement, refactor implement for desktop, refactor local-system, refactor service, refactor static style, refactor to use better underline style, refactor to use better underline style, refactor tool prompt injection, refactor ui and layout, refactor with editor runtime, refactor with electron, refactor with es-toolkit, remove desktop-specific upload logic, rename browser identifier from 'chat' to 'app', tools ui, use /f/:fid as file mode, use supervisor role for agent group supervisor.
|
||||
|
||||
#### ✨ Features
|
||||
|
||||
- **auth**: Add confirm password field and integrate business signup logic, add useBusinessSignup hook for business signup functionality, enhance BetterAuthSignUpForm with businessElement and update useSignUp hook for improved signup process, integrate business sign-in features and update social sign-in logic, update useBusinessSignin to include getAdditionalData function for enhanced sign-in process.
|
||||
- **desktop**: MacOS About menu should navigate to Settings About tab.
|
||||
- **layout**: Integrate BusinessGlobalProvider for conditional rendering based on business features.
|
||||
- **memory-user-memory**: Added LoCoMo dataset loader & converter & exporter, support to extract memories from LoCoMo dataset, support to load in memory, and extract from in-memory memory sources.
|
||||
- **model**: Improve model list UI and add disabled models management.
|
||||
- **referral**: Add backfill referral code i18n keys.
|
||||
- **userMemories**: Apply userMemories.enable from settings for injecting, use capturedAt for time of memory entries, use honorific title for identity memory.
|
||||
- **misc**: Add a white waitlist in edge config env, add always show tools render in createPlan & createDoc tools, add batch tasks ui, add Bundle Analyzer workflow for detailed bundle size analysis, add business features support with new components and hooks, add business settings features with dynamic loading for Plans, Funds, Usage, Billing, and Referral tabs, add db and schema feature, add home page create group builder button, Add i18n UI locales and improve tool types, add like action in community detail, add memory implement, add subscription settings group with dynamic loading for Plans, Funds, Usage, Billing, and Referral tabs, add the market auth auto generate way, Add turbopack configuration support to CustomNextConfig, add user memory, agent builder, agent builder, agent builder and group builder, app ui page, brand new 2.0 ui for next, buildin some tools should save into docs, code-interpreter tool, code-interpreter tool, code-interpreter tool, desktop feature, enhance desktop onboarding with sign out and localization, enhance macOS desktop permissions and onboarding, enhance onboarding process by removing mode selection step and adding export functionality in advanced settings, file search feature, gtd create plan support streaming render, implement agent builder, implement builtin agents packages, implement memories package, implement Redis caching for presigned URLs in file proxy service, implement server data feature, include Subscription settings group in the Accordion component, Integrate bcryptjs for password verification in BetterAuth, integrate BrandingProviderCard and update Provider components for branding support, onboarding ui, page and knowledge base, rebranding total UI of app, refactor authentication handler to support dynamic loading of better-auth and next-auth, refactor desktop implement with brand new 2.0, rename codeinterpreter into lobe sandbox, server implement, support CMD K, support exec async sub agent task, support export and import topic JSON, support files upload in chat input, support notebook tool, support swr local cache, topic message swr cache, translate AI model descriptions to English, update agent builder ui, update create group chat use builder, update gtd tools( use editor & update metadata ), update user memory embedding model selection based on business features, user memory, user memory, user onboarding, when use usesend to create agent/group, the model should override by lobeAi, wrap ConversationArea and ModelSwitchPanel in TooltipGroup for enhanced UI.
|
||||
|
||||
#### 🐛 Bug Fixes
|
||||
|
||||
- **ci**: Skip backend routes in bundle analyzer build.
|
||||
- **desktop**: prevent window resize when onboarding, add safe top edge for message container.
|
||||
- **i18n**: Translate plugin.ts locale to English.
|
||||
- **image-generation**: Update chargeBeforeGenerate to return ChargeResult and include configForDatabase in parameters.
|
||||
- **memory-user-memory**: Should pre-process date & time.
|
||||
- **observability-otel**: Typo in package name.
|
||||
- **prebuild**: Correct syntax in partialBuildPages array.
|
||||
- **translation**: Add fallback for all English locale variants.
|
||||
- **userMemories**: 404/405 issue due to incorrectly used workflow name and mounted catch-all route, missing base memory as part of context, must assign workflow id, should use `context.invoke` for workflow instead of `context.run`, skip to handle WorkflowAbort, use date & time for building context, workflow id build issue.
|
||||
- **misc**: Agent profiles update, agent tools config set, editor placeholder, bump charts 3.0.4 to fix import es path, fix anthropic thinking budget, fix async task and improve tool style, fix default waitlist bug, fix delete agent group bug, Fix desktop test cases and refactor translations, Fix desktop test cases and refactor translations, fix gemini 3 model thinking issue, fix gemini 3 pro parallel tool use, fix gemini 3 thinking params, fix identity memory not working, fix supervisor flag, fix thread not working issue, fix when use branch topic,the branch index error problem, fixed the welcome card the create button not work, handle session invalidation on 401 error by logging out signed-in users, improve test infrastructure and mock configurations, locale resolve bug with ESM module loading, page agent editor, prevent redundant login redirect when already on auth pages, redis read json object, remove openapi pkg patch file, slove input editor on pause emit, slove swr mutate not work in Cache Provider, slove the group add member checkbox not work, slove the model select null problem, slove the mutate not work problem, slove when click agentbuilder should clean topic, slove when first call thread, not show ai chat message, support retry error message and fix continueGenerationMessage, update contextMenu in group tools message, update OFFICIAL_URL to app.lobehub.com, update PlanTag link paths for subscription settings, update test snapshots for model description changes, when use agentbuilder the topic id should use new & clear topic….
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Improve ExecTask and task message UI, improve gtd tool inspector and todo list, improve page document tool inspector UI, improve RunCommand Inspector, rebranding chat ui, refactor UI in features, rerun i18n, setting style, support streaming and display ui for group mode, support tool streaming and title custom render, update i18n, Update i18n microcopy, update ui.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Code refactoring
|
||||
|
||||
- **userMemories**: Added `benchmark_locomo` as source unify use the of source type, closes [#10922](https://github.com/lobehub/lobe-chat/issues/10922) ([03342a7](https://github.com/lobehub/lobe-chat/commit/03342a7))
|
||||
- **misc**: Add builtin tools ([26e73cc](https://github.com/lobehub/lobe-chat/commit/26e73cc))
|
||||
- **misc**: Clean code ([4ddb491](https://github.com/lobehub/lobe-chat/commit/4ddb491))
|
||||
- **misc**: Clean desktop relative code ([ffd7d23](https://github.com/lobehub/lobe-chat/commit/ffd7d23))
|
||||
- **misc**: Clean page editor, closes [#10966](https://github.com/lobehub/lobe-chat/issues/10966) ([15410d1](https://github.com/lobehub/lobe-chat/commit/15410d1))
|
||||
- **misc**: Flatten i18n keys and extract hardcoded strings in desktop, closes [#10939](https://github.com/lobehub/lobe-chat/issues/10939) ([e5f3a58](https://github.com/lobehub/lobe-chat/commit/e5f3a58))
|
||||
- **misc**: I18n formatting optimization, closes [#10929](https://github.com/lobehub/lobe-chat/issues/10929) [#10933](https://github.com/lobehub/lobe-chat/issues/10933) ([d692a37](https://github.com/lobehub/lobe-chat/commit/d692a37))
|
||||
- **misc**: Improve modal handling with createRawModal, closes [#11071](https://github.com/lobehub/lobe-chat/issues/11071) ([f5314c5](https://github.com/lobehub/lobe-chat/commit/f5314c5))
|
||||
- **misc**: Move code-interpreter to single packages ([1fa4357](https://github.com/lobehub/lobe-chat/commit/1fa4357))
|
||||
- **misc**: Refactor builtin-tool implement ([9ede8e7](https://github.com/lobehub/lobe-chat/commit/9ede8e7))
|
||||
- **misc**: Refactor hooks ([e3fa62e](https://github.com/lobehub/lobe-chat/commit/e3fa62e))
|
||||
- **misc**: Refactor implement ([34d059f](https://github.com/lobehub/lobe-chat/commit/34d059f))
|
||||
- **misc**: Refactor implement for desktop ([27f101f](https://github.com/lobehub/lobe-chat/commit/27f101f))
|
||||
- **misc**: Refactor local-system ([a69221f](https://github.com/lobehub/lobe-chat/commit/a69221f))
|
||||
- **misc**: Refactor service ([91bbbf5](https://github.com/lobehub/lobe-chat/commit/91bbbf5))
|
||||
- **misc**: Refactor static style, closes [#11010](https://github.com/lobehub/lobe-chat/issues/11010) ([d865e27](https://github.com/lobehub/lobe-chat/commit/d865e27))
|
||||
- **misc**: Refactor to use better underline style ([784bb58](https://github.com/lobehub/lobe-chat/commit/784bb58))
|
||||
- **misc**: Refactor to use better underline style ([5e10ac8](https://github.com/lobehub/lobe-chat/commit/5e10ac8))
|
||||
- **misc**: Refactor tool prompt injection ([6099ac3](https://github.com/lobehub/lobe-chat/commit/6099ac3))
|
||||
- **misc**: Refactor ui and layout ([436d9e5](https://github.com/lobehub/lobe-chat/commit/436d9e5))
|
||||
- **misc**: Refactor with editor runtime ([be2b41c](https://github.com/lobehub/lobe-chat/commit/be2b41c))
|
||||
- **misc**: Refactor with electron ([849ee3d](https://github.com/lobehub/lobe-chat/commit/849ee3d))
|
||||
- **misc**: Refactor with es-toolkit ([1848d27](https://github.com/lobehub/lobe-chat/commit/1848d27))
|
||||
- **misc**: Remove desktop-specific upload logic, closes [#11070](https://github.com/lobehub/lobe-chat/issues/11070) ([475065e](https://github.com/lobehub/lobe-chat/commit/475065e))
|
||||
- **misc**: Rename browser identifier from 'chat' to 'app', closes [#10940](https://github.com/lobehub/lobe-chat/issues/10940) ([dc870c7](https://github.com/lobehub/lobe-chat/commit/dc870c7))
|
||||
- **misc**: Tools ui ([6bf4546](https://github.com/lobehub/lobe-chat/commit/6bf4546))
|
||||
- **misc**: Use /f/:fid as file mode ([3b01174](https://github.com/lobehub/lobe-chat/commit/3b01174))
|
||||
- **misc**: Use supervisor role for agent group supervisor ([0ca823f](https://github.com/lobehub/lobe-chat/commit/0ca823f))
|
||||
|
||||
#### What's improved
|
||||
|
||||
- **auth**: Add confirm password field and integrate business signup logic ([2ccd5c7](https://github.com/lobehub/lobe-chat/commit/2ccd5c7))
|
||||
- **auth**: Add useBusinessSignup hook for business signup functionality ([3efb6cc](https://github.com/lobehub/lobe-chat/commit/3efb6cc))
|
||||
- **auth**: Enhance BetterAuthSignUpForm with businessElement and update useSignUp hook for improved signup process ([991d8c1](https://github.com/lobehub/lobe-chat/commit/991d8c1))
|
||||
- **auth**: Integrate business sign-in features and update social sign-in logic ([6dc7916](https://github.com/lobehub/lobe-chat/commit/6dc7916))
|
||||
- **auth**: Update useBusinessSignin to include getAdditionalData function for enhanced sign-in process ([c8e3bc9](https://github.com/lobehub/lobe-chat/commit/c8e3bc9))
|
||||
- **desktop**: MacOS About menu should navigate to Settings About tab, closes [#10942](https://github.com/lobehub/lobe-chat/issues/10942) ([1a4f456](https://github.com/lobehub/lobe-chat/commit/1a4f456))
|
||||
- **layout**: Integrate BusinessGlobalProvider for conditional rendering based on business features ([52c7a49](https://github.com/lobehub/lobe-chat/commit/52c7a49))
|
||||
- **memory-user-memory**: Added LoCoMo dataset loader & converter & exporter, closes [#10923](https://github.com/lobehub/lobe-chat/issues/10923) ([a5dd785](https://github.com/lobehub/lobe-chat/commit/a5dd785))
|
||||
- **memory-user-memory**: Support to extract memories from LoCoMo dataset, closes [#10925](https://github.com/lobehub/lobe-chat/issues/10925) ([c7c7d6f](https://github.com/lobehub/lobe-chat/commit/c7c7d6f))
|
||||
- **memory-user-memory**: Support to load in memory, and extract from in-memory memory sources, closes [#10924](https://github.com/lobehub/lobe-chat/issues/10924) ([9ac3ce7](https://github.com/lobehub/lobe-chat/commit/9ac3ce7))
|
||||
- **model**: Improve model list UI and add disabled models management, closes [#11036](https://github.com/lobehub/lobe-chat/issues/11036) ([4faa65c](https://github.com/lobehub/lobe-chat/commit/4faa65c))
|
||||
- **referral**: Add backfill referral code i18n keys ([bbf62ce](https://github.com/lobehub/lobe-chat/commit/bbf62ce))
|
||||
- **userMemories**: Apply userMemories.enable from settings for injecting, closes [#11038](https://github.com/lobehub/lobe-chat/issues/11038) ([1cc0e8c](https://github.com/lobehub/lobe-chat/commit/1cc0e8c))
|
||||
- **userMemories**: Use capturedAt for time of memory entries, closes [#11037](https://github.com/lobehub/lobe-chat/issues/11037) ([5615d20](https://github.com/lobehub/lobe-chat/commit/5615d20))
|
||||
- **userMemories**: Use honorific title for identity memory, closes [#11039](https://github.com/lobehub/lobe-chat/issues/11039) ([ab61c69](https://github.com/lobehub/lobe-chat/commit/ab61c69))
|
||||
- **misc**: Add a white waitlist in edge config env, closes [#11009](https://github.com/lobehub/lobe-chat/issues/11009) ([88f22f4](https://github.com/lobehub/lobe-chat/commit/88f22f4))
|
||||
- **misc**: Add always show tools render in createPlan & createDoc tools, closes [#10937](https://github.com/lobehub/lobe-chat/issues/10937) ([c224951](https://github.com/lobehub/lobe-chat/commit/c224951))
|
||||
- **misc**: Add batch tasks ui ([80587ae](https://github.com/lobehub/lobe-chat/commit/80587ae))
|
||||
- **misc**: Add Bundle Analyzer workflow for detailed bundle size analysis ([596e489](https://github.com/lobehub/lobe-chat/commit/596e489))
|
||||
- **misc**: Add business features support with new components and hooks ([1dccc04](https://github.com/lobehub/lobe-chat/commit/1dccc04))
|
||||
- **misc**: Add business settings features with dynamic loading for Plans, Funds, Usage, Billing, and Referral tabs ([35c6ad9](https://github.com/lobehub/lobe-chat/commit/35c6ad9))
|
||||
- **misc**: Add db and schema feature ([9e47c33](https://github.com/lobehub/lobe-chat/commit/9e47c33))
|
||||
- **misc**: Add home page create group builder button, closes [#10904](https://github.com/lobehub/lobe-chat/issues/10904) ([3183189](https://github.com/lobehub/lobe-chat/commit/3183189))
|
||||
- **misc**: Add i18n UI locales and improve tool types, closes [#10964](https://github.com/lobehub/lobe-chat/issues/10964) ([0e89ce5](https://github.com/lobehub/lobe-chat/commit/0e89ce5))
|
||||
- **misc**: Add like action in community detail, closes [#10971](https://github.com/lobehub/lobe-chat/issues/10971) ([c11d802](https://github.com/lobehub/lobe-chat/commit/c11d802))
|
||||
- **misc**: Add memory implement ([fdae83c](https://github.com/lobehub/lobe-chat/commit/fdae83c))
|
||||
- **misc**: Add subscription settings group with dynamic loading for Plans, Funds, Usage, Billing, and Referral tabs ([2ddc876](https://github.com/lobehub/lobe-chat/commit/2ddc876))
|
||||
- **misc**: Add the market auth auto generate way, closes [#10993](https://github.com/lobehub/lobe-chat/issues/10993) ([849ac73](https://github.com/lobehub/lobe-chat/commit/849ac73))
|
||||
- **misc**: Add turbopack configuration support to CustomNextConfig ([2e7076a](https://github.com/lobehub/lobe-chat/commit/2e7076a))
|
||||
- **misc**: Add user memory ([c305889](https://github.com/lobehub/lobe-chat/commit/c305889))
|
||||
- **misc**: Agent builder ([ede0ed6](https://github.com/lobehub/lobe-chat/commit/ede0ed6))
|
||||
- **misc**: Agent builder ([e3c9454](https://github.com/lobehub/lobe-chat/commit/e3c9454))
|
||||
- **misc**: Agent builder and group builder ([d735e2c](https://github.com/lobehub/lobe-chat/commit/d735e2c))
|
||||
- **misc**: App ui page ([78d07c0](https://github.com/lobehub/lobe-chat/commit/78d07c0))
|
||||
- **misc**: Brand new 2.0 ui for next ([f7d724f](https://github.com/lobehub/lobe-chat/commit/f7d724f))
|
||||
- **misc**: Buildin some tools should save into docs, closes [#10935](https://github.com/lobehub/lobe-chat/issues/10935) ([be4c17d](https://github.com/lobehub/lobe-chat/commit/be4c17d))
|
||||
- **misc**: Code-interpreter tool ([1940914](https://github.com/lobehub/lobe-chat/commit/1940914))
|
||||
- **misc**: Code-interpreter tool ([c931909](https://github.com/lobehub/lobe-chat/commit/c931909))
|
||||
- **misc**: Code-interpreter tool ([baa29c8](https://github.com/lobehub/lobe-chat/commit/baa29c8))
|
||||
- **misc**: Desktop feature ([ac93637](https://github.com/lobehub/lobe-chat/commit/ac93637))
|
||||
- **misc**: Enhance desktop onboarding with sign out and localization, closes [#11033](https://github.com/lobehub/lobe-chat/issues/11033) ([34a6312](https://github.com/lobehub/lobe-chat/commit/34a6312))
|
||||
- **misc**: Enhance macOS desktop permissions and onboarding, closes [#11016](https://github.com/lobehub/lobe-chat/issues/11016) ([9db8da8](https://github.com/lobehub/lobe-chat/commit/9db8da8))
|
||||
- **misc**: Enhance onboarding process by removing mode selection step and adding export functionality in advanced settings ([8b6c30e](https://github.com/lobehub/lobe-chat/commit/8b6c30e))
|
||||
- **misc**: File search feature ([9786d64](https://github.com/lobehub/lobe-chat/commit/9786d64))
|
||||
- **misc**: Gtd create plan support streaming render, closes [#11034](https://github.com/lobehub/lobe-chat/issues/11034) ([74d3555](https://github.com/lobehub/lobe-chat/commit/74d3555))
|
||||
- **misc**: Implement agent builder ([f638b97](https://github.com/lobehub/lobe-chat/commit/f638b97))
|
||||
- **misc**: Implement builtin agents packages ([2255a7c](https://github.com/lobehub/lobe-chat/commit/2255a7c))
|
||||
- **misc**: Implement memories package ([7f94ef1](https://github.com/lobehub/lobe-chat/commit/7f94ef1))
|
||||
- **misc**: Implement Redis caching for presigned URLs in file proxy service ([15722f1](https://github.com/lobehub/lobe-chat/commit/15722f1))
|
||||
- **misc**: Implement server data feature ([9c46c6e](https://github.com/lobehub/lobe-chat/commit/9c46c6e))
|
||||
- **misc**: Include Subscription settings group in the Accordion component ([8f2d57d](https://github.com/lobehub/lobe-chat/commit/8f2d57d))
|
||||
- **misc**: Integrate bcryptjs for password verification in BetterAuth ([180ebfd](https://github.com/lobehub/lobe-chat/commit/180ebfd))
|
||||
- **misc**: Integrate BrandingProviderCard and update Provider components for branding support ([6b5ce79](https://github.com/lobehub/lobe-chat/commit/6b5ce79))
|
||||
- **misc**: Onboarding ui ([81d33a6](https://github.com/lobehub/lobe-chat/commit/81d33a6))
|
||||
- **misc**: Page and knowledge base ([492d3cc](https://github.com/lobehub/lobe-chat/commit/492d3cc))
|
||||
- **misc**: Rebranding total UI of app ([13ca81b](https://github.com/lobehub/lobe-chat/commit/13ca81b))
|
||||
- **misc**: Refactor authentication handler to support dynamic loading of better-auth and next-auth ([d6419e4](https://github.com/lobehub/lobe-chat/commit/d6419e4))
|
||||
- **misc**: Refactor desktop implement with brand new 2.0 ([10e048c](https://github.com/lobehub/lobe-chat/commit/10e048c))
|
||||
- **misc**: Rename codeinterpreter into lobe sandbox, closes [#11076](https://github.com/lobehub/lobe-chat/issues/11076) ([2a631b4](https://github.com/lobehub/lobe-chat/commit/2a631b4))
|
||||
- **misc**: Server implement ([685a6cd](https://github.com/lobehub/lobe-chat/commit/685a6cd))
|
||||
- **misc**: Support CMD K ([d2bd8a6](https://github.com/lobehub/lobe-chat/commit/d2bd8a6))
|
||||
- **misc**: Support exec async sub agent task ([dba1acf](https://github.com/lobehub/lobe-chat/commit/dba1acf))
|
||||
- **misc**: Support export and import topic JSON, closes [#10885](https://github.com/lobehub/lobe-chat/issues/10885) ([0c5a41f](https://github.com/lobehub/lobe-chat/commit/0c5a41f))
|
||||
- **misc**: Support files upload in chat input, closes [#10967](https://github.com/lobehub/lobe-chat/issues/10967) ([60eba45](https://github.com/lobehub/lobe-chat/commit/60eba45))
|
||||
- **misc**: Support notebook tool, closes [#10902](https://github.com/lobehub/lobe-chat/issues/10902) ([e05375f](https://github.com/lobehub/lobe-chat/commit/e05375f))
|
||||
- **misc**: Support swr local cache, closes [#10884](https://github.com/lobehub/lobe-chat/issues/10884) ([bc3f3e2](https://github.com/lobehub/lobe-chat/commit/bc3f3e2))
|
||||
- **misc**: Topic message swr cache, closes [#10886](https://github.com/lobehub/lobe-chat/issues/10886) ([613a404](https://github.com/lobehub/lobe-chat/commit/613a404))
|
||||
- **misc**: Translate AI model descriptions to English, closes [#10989](https://github.com/lobehub/lobe-chat/issues/10989) ([36ea258](https://github.com/lobehub/lobe-chat/commit/36ea258))
|
||||
- **misc**: Update agent builder ui, closes [#10996](https://github.com/lobehub/lobe-chat/issues/10996) ([704ef7f](https://github.com/lobehub/lobe-chat/commit/704ef7f))
|
||||
- **misc**: Update create group chat use builder, closes [#11030](https://github.com/lobehub/lobe-chat/issues/11030) ([7ae24c2](https://github.com/lobehub/lobe-chat/commit/7ae24c2))
|
||||
- **misc**: Update gtd tools( use editor & update metadata ), closes [#11029](https://github.com/lobehub/lobe-chat/issues/11029) ([4a47ea0](https://github.com/lobehub/lobe-chat/commit/4a47ea0))
|
||||
- **misc**: Update user memory embedding model selection based on business features ([c026117](https://github.com/lobehub/lobe-chat/commit/c026117))
|
||||
- **misc**: User memory ([d5ce144](https://github.com/lobehub/lobe-chat/commit/d5ce144))
|
||||
- **misc**: User memory ([49ffcb5](https://github.com/lobehub/lobe-chat/commit/49ffcb5))
|
||||
- **misc**: User onboarding ([5e59388](https://github.com/lobehub/lobe-chat/commit/5e59388))
|
||||
- **misc**: When use usesend to create agent/group, the model should override by lobeAi, closes [#11048](https://github.com/lobehub/lobe-chat/issues/11048) ([754ffe1](https://github.com/lobehub/lobe-chat/commit/754ffe1))
|
||||
- **misc**: Wrap ConversationArea and ModelSwitchPanel in TooltipGroup for enhanced UI ([672bcf7](https://github.com/lobehub/lobe-chat/commit/672bcf7))
|
||||
|
||||
#### What's fixed
|
||||
|
||||
- **ci**: Skip backend routes in bundle analyzer build, closes [#10944](https://github.com/lobehub/lobe-chat/issues/10944) ([2fc3b42](https://github.com/lobehub/lobe-chat/commit/2fc3b42))
|
||||
- **desktop**: prevent window resize when onboarding, closes [#10887](https://github.com/lobehub/lobe-chat/issues/10887) ([c29c02b](https://github.com/lobehub/lobe-chat/commit/c29c02b))
|
||||
- **desktop**: Add safe top edge for message container, closes [#10908](https://github.com/lobehub/lobe-chat/issues/10908) ([2558b47](https://github.com/lobehub/lobe-chat/commit/2558b47))
|
||||
- **i18n**: Translate plugin.ts locale to English, closes [#10972](https://github.com/lobehub/lobe-chat/issues/10972) ([89f89c7](https://github.com/lobehub/lobe-chat/commit/89f89c7))
|
||||
- **image-generation**: Update chargeBeforeGenerate to return ChargeResult and include configForDatabase in parameters ([4f2a683](https://github.com/lobehub/lobe-chat/commit/4f2a683))
|
||||
- **memory-user-memory**: Should pre-process date & time, closes [#10979](https://github.com/lobehub/lobe-chat/issues/10979) ([c2bcf73](https://github.com/lobehub/lobe-chat/commit/c2bcf73))
|
||||
- **observability-otel**: Typo in package name, closes [#11025](https://github.com/lobehub/lobe-chat/issues/11025) ([63224dd](https://github.com/lobehub/lobe-chat/commit/63224dd))
|
||||
- **prebuild**: Correct syntax in partialBuildPages array ([9580672](https://github.com/lobehub/lobe-chat/commit/9580672))
|
||||
- **translation**: Add fallback for all English locale variants, closes [#10984](https://github.com/lobehub/lobe-chat/issues/10984) ([ce46996](https://github.com/lobehub/lobe-chat/commit/ce46996))
|
||||
- **userMemories**: 404/405 issue due to incorrectly used workflow name and mounted catch-all route, closes [#10995](https://github.com/lobehub/lobe-chat/issues/10995) ([45996c6](https://github.com/lobehub/lobe-chat/commit/45996c6))
|
||||
- **userMemories**: Missing base memory as part of context, closes [#11040](https://github.com/lobehub/lobe-chat/issues/11040) ([3c9bafe](https://github.com/lobehub/lobe-chat/commit/3c9bafe))
|
||||
- **userMemories**: Must assign workflow id, closes [#11021](https://github.com/lobehub/lobe-chat/issues/11021) ([78b0c7b](https://github.com/lobehub/lobe-chat/commit/78b0c7b))
|
||||
- **userMemories**: Should use `context.invoke` for workflow instead of `context.run`, closes [#10994](https://github.com/lobehub/lobe-chat/issues/10994) ([6592d10](https://github.com/lobehub/lobe-chat/commit/6592d10))
|
||||
- **userMemories**: Skip to handle WorkflowAbort, closes [#11031](https://github.com/lobehub/lobe-chat/issues/11031) ([17124a8](https://github.com/lobehub/lobe-chat/commit/17124a8))
|
||||
- **userMemories**: Use date & time for building context, closes [#10978](https://github.com/lobehub/lobe-chat/issues/10978) ([15bc6bc](https://github.com/lobehub/lobe-chat/commit/15bc6bc))
|
||||
- **userMemories**: Workflow id build issue, closes [#10998](https://github.com/lobehub/lobe-chat/issues/10998) ([0b110b6](https://github.com/lobehub/lobe-chat/commit/0b110b6))
|
||||
- **misc**: Agent profiles update, agent tools config set, editor placeholder, closes [#11074](https://github.com/lobehub/lobe-chat/issues/11074) ([f7cbfe4](https://github.com/lobehub/lobe-chat/commit/f7cbfe4))
|
||||
- **misc**: Bump charts 3.0.4 to fix import es path, closes [#10898](https://github.com/lobehub/lobe-chat/issues/10898) ([6d7dce7](https://github.com/lobehub/lobe-chat/commit/6d7dce7))
|
||||
- **misc**: Fix anthropic thinking budget ([6e19bd3](https://github.com/lobehub/lobe-chat/commit/6e19bd3))
|
||||
- **misc**: Fix async task and improve tool style ([1aa1c04](https://github.com/lobehub/lobe-chat/commit/1aa1c04))
|
||||
- **misc**: Fix default waitlist bug ([de62035](https://github.com/lobehub/lobe-chat/commit/de62035))
|
||||
- **misc**: Fix delete agent group bug ([0fe0d6f](https://github.com/lobehub/lobe-chat/commit/0fe0d6f))
|
||||
- **misc**: Fix desktop test cases and refactor translations, closes [#10956](https://github.com/lobehub/lobe-chat/issues/10956) ([568235c](https://github.com/lobehub/lobe-chat/commit/568235c))
|
||||
- **misc**: Fix desktop test cases and refactor translations, closes [#10955](https://github.com/lobehub/lobe-chat/issues/10955) ([b3520a2](https://github.com/lobehub/lobe-chat/commit/b3520a2))
|
||||
- **misc**: Fix gemini 3 model thinking issue ([69f4cf3](https://github.com/lobehub/lobe-chat/commit/69f4cf3))
|
||||
- **misc**: Fix gemini 3 pro parallel tool use ([a0cc9c3](https://github.com/lobehub/lobe-chat/commit/a0cc9c3))
|
||||
- **misc**: Fix gemini 3 thinking params ([89363b2](https://github.com/lobehub/lobe-chat/commit/89363b2))
|
||||
- **misc**: Fix identity memory not working, closes [#10916](https://github.com/lobehub/lobe-chat/issues/10916) ([fbd0b66](https://github.com/lobehub/lobe-chat/commit/fbd0b66))
|
||||
- **misc**: Fix supervisor flag ([fc20dbc](https://github.com/lobehub/lobe-chat/commit/fc20dbc))
|
||||
- **misc**: Fix thread not working issue ([7dd30eb](https://github.com/lobehub/lobe-chat/commit/7dd30eb))
|
||||
- **misc**: Fix when use branch topic,the branch index error problem, closes [#11049](https://github.com/lobehub/lobe-chat/issues/11049) ([34b5a32](https://github.com/lobehub/lobe-chat/commit/34b5a32))
|
||||
- **misc**: Fixed the welcome card the create button not work, closes [#11055](https://github.com/lobehub/lobe-chat/issues/11055) ([00e81f1](https://github.com/lobehub/lobe-chat/commit/00e81f1))
|
||||
- **misc**: Handle session invalidation on 401 error by logging out signed-in users ([499bd4a](https://github.com/lobehub/lobe-chat/commit/499bd4a))
|
||||
- **misc**: Improve test infrastructure and mock configurations, closes [#11028](https://github.com/lobehub/lobe-chat/issues/11028) ([da4eb9c](https://github.com/lobehub/lobe-chat/commit/da4eb9c))
|
||||
- **misc**: Locale resolve bug with ESM module loading, closes [#11018](https://github.com/lobehub/lobe-chat/issues/11018) ([770c872](https://github.com/lobehub/lobe-chat/commit/770c872))
|
||||
- **misc**: Page agent editor, closes [#10953](https://github.com/lobehub/lobe-chat/issues/10953) ([61b3031](https://github.com/lobehub/lobe-chat/commit/61b3031))
|
||||
- **misc**: Prevent redundant login redirect when already on auth pages ([1a5049c](https://github.com/lobehub/lobe-chat/commit/1a5049c))
|
||||
- **misc**: Redis read json object ([1718fa3](https://github.com/lobehub/lobe-chat/commit/1718fa3))
|
||||
- **misc**: Remove openapi pkg patch file, closes [#10910](https://github.com/lobehub/lobe-chat/issues/10910) ([a34c111](https://github.com/lobehub/lobe-chat/commit/a34c111))
|
||||
- **misc**: Slove input editor on pause emit, closes [#11051](https://github.com/lobehub/lobe-chat/issues/11051) ([d102d47](https://github.com/lobehub/lobe-chat/commit/d102d47))
|
||||
- **misc**: Slove swr mutate not work in Cache Provider, closes [#10895](https://github.com/lobehub/lobe-chat/issues/10895) ([b3fbffe](https://github.com/lobehub/lobe-chat/commit/b3fbffe))
|
||||
- **misc**: Slove the group add member checkbox not work, closes [#11045](https://github.com/lobehub/lobe-chat/issues/11045) [#11042](https://github.com/lobehub/lobe-chat/issues/11042) ([91d3f74](https://github.com/lobehub/lobe-chat/commit/91d3f74))
|
||||
- **misc**: Slove the model select null problem, closes [#10988](https://github.com/lobehub/lobe-chat/issues/10988) ([50aa304](https://github.com/lobehub/lobe-chat/commit/50aa304))
|
||||
- **misc**: Slove the mutate not work problem, closes [#10947](https://github.com/lobehub/lobe-chat/issues/10947) ([78ca5eb](https://github.com/lobehub/lobe-chat/commit/78ca5eb))
|
||||
- **misc**: Slove when click agentbuilder should clean topic, closes [#11068](https://github.com/lobehub/lobe-chat/issues/11068) ([048bd66](https://github.com/lobehub/lobe-chat/commit/048bd66))
|
||||
- **misc**: Slove when first call thread, not show ai chat message, closes [#10878](https://github.com/lobehub/lobe-chat/issues/10878) ([5a79cb9](https://github.com/lobehub/lobe-chat/commit/5a79cb9))
|
||||
- **misc**: Support retry error message and fix continueGenerationMessage ([8bf85fb](https://github.com/lobehub/lobe-chat/commit/8bf85fb))
|
||||
- **misc**: Update contextMenu in group tools message, closes [#11056](https://github.com/lobehub/lobe-chat/issues/11056) ([8b49414](https://github.com/lobehub/lobe-chat/commit/8b49414))
|
||||
- **misc**: Update OFFICIAL_URL to app.lobehub.com, closes [#11015](https://github.com/lobehub/lobe-chat/issues/11015) ([f9e11d0](https://github.com/lobehub/lobe-chat/commit/f9e11d0))
|
||||
- **misc**: Update PlanTag link paths for subscription settings ([ada71d3](https://github.com/lobehub/lobe-chat/commit/ada71d3))
|
||||
- **misc**: Update test snapshots for model description changes, closes [#11008](https://github.com/lobehub/lobe-chat/issues/11008) ([626e808](https://github.com/lobehub/lobe-chat/commit/626e808))
|
||||
- **misc**: When use agentbuilder the topic id should use new & clear topic…, closes [#10983](https://github.com/lobehub/lobe-chat/issues/10983) ([0b2b096](https://github.com/lobehub/lobe-chat/commit/0b2b096))
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Improve ExecTask and task message UI ([977a700](https://github.com/lobehub/lobe-chat/commit/977a700))
|
||||
- **misc**: Improve gtd tool inspector and todo list ([0664563](https://github.com/lobehub/lobe-chat/commit/0664563))
|
||||
- **misc**: Improve page document tool inspector UI, closes [#10977](https://github.com/lobehub/lobe-chat/issues/10977) ([7f69cb1](https://github.com/lobehub/lobe-chat/commit/7f69cb1))
|
||||
- **misc**: Improve RunCommand Inspector ([0751fa4](https://github.com/lobehub/lobe-chat/commit/0751fa4))
|
||||
- **misc**: Rebranding chat ui ([ad14222](https://github.com/lobehub/lobe-chat/commit/ad14222))
|
||||
- **misc**: Refactor UI in features ([83e689f](https://github.com/lobehub/lobe-chat/commit/83e689f))
|
||||
- **misc**: Rerun i18n ([80f511c](https://github.com/lobehub/lobe-chat/commit/80f511c))
|
||||
- **misc**: Setting style ([e8c755f](https://github.com/lobehub/lobe-chat/commit/e8c755f))
|
||||
- **misc**: Support streaming and display ui for group mode ([f708cdb](https://github.com/lobehub/lobe-chat/commit/f708cdb))
|
||||
- **misc**: Support tool streaming and title custom render, closes [#10976](https://github.com/lobehub/lobe-chat/issues/10976) ([576ccd6](https://github.com/lobehub/lobe-chat/commit/576ccd6))
|
||||
- **misc**: Update i18n ([2e6fd07](https://github.com/lobehub/lobe-chat/commit/2e6fd07))
|
||||
- **misc**: Update i18n microcopy, closes [#10905](https://github.com/lobehub/lobe-chat/issues/10905) ([024aeb2](https://github.com/lobehub/lobe-chat/commit/024aeb2))
|
||||
- **misc**: Update ui ([1693fc5](https://github.com/lobehub/lobe-chat/commit/1693fc5))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.180](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.179...v2.0.0-next.180)
|
||||
|
||||
<sup>Released on **2025-12-26**</sup>
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.179](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.178...v2.0.0-next.179)
|
||||
|
||||
<sup>Released on **2025-12-25**</sup>
|
||||
|
||||
#### 🐛 Bug Fixes
|
||||
|
||||
- **scripts**: Fix syntax error in prebuild.mts.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's fixed
|
||||
|
||||
- **scripts**: Fix syntax error in prebuild.mts, closes [#10952](https://github.com/lobehub/lobe-chat/issues/10952) ([3d46c13](https://github.com/lobehub/lobe-chat/commit/3d46c13))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.178](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.177...v2.0.0-next.178)
|
||||
|
||||
<sup>Released on **2025-12-24**</sup>
|
||||
|
||||
#### 🐛 Bug Fixes
|
||||
|
||||
- **ci**: Always continue build to upload bundle analyzer report, skip backend routes in bundle analyzer build.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's fixed
|
||||
|
||||
- **ci**: Always continue build to upload bundle analyzer report, closes [#10946](https://github.com/lobehub/lobe-chat/issues/10946) ([8d37811](https://github.com/lobehub/lobe-chat/commit/8d37811))
|
||||
- **ci**: Skip backend routes in bundle analyzer build, closes [#10944](https://github.com/lobehub/lobe-chat/issues/10944) ([0276b87](https://github.com/lobehub/lobe-chat/commit/0276b87))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.177](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.176...v2.0.0-next.177)
|
||||
|
||||
<sup>Released on **2025-12-24**</sup>
|
||||
|
||||
#### ✨ Features
|
||||
|
||||
- **ci**: Add bundle analyzer workflow.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's improved
|
||||
|
||||
- **ci**: Add bundle analyzer workflow, closes [#10932](https://github.com/lobehub/lobe-chat/issues/10932) ([c470cfb](https://github.com/lobehub/lobe-chat/commit/c470cfb))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.176](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.175...v2.0.0-next.176)
|
||||
|
||||
<sup>Released on **2025-12-23**</sup>
|
||||
|
||||
#### ✨ Features
|
||||
|
||||
- **misc**: Mobile native better auth support.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's improved
|
||||
|
||||
- **misc**: Mobile native better auth support, closes [#10871](https://github.com/lobehub/lobe-chat/issues/10871) ([8c42a93](https://github.com/lobehub/lobe-chat/commit/8c42a93))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.175](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.174...v2.0.0-next.175)
|
||||
|
||||
<sup>Released on **2025-12-21**</sup>
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.174](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.173...v2.0.0-next.174)
|
||||
|
||||
<sup>Released on **2025-12-20**</sup>
|
||||
|
||||
#### ♻ Code Refactoring
|
||||
|
||||
- **misc**: Refactor database schema.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Code refactoring
|
||||
|
||||
- **misc**: Refactor database schema, closes [#10860](https://github.com/lobehub/lobe-chat/issues/10860) ([5c489bc](https://github.com/lobehub/lobe-chat/commit/5c489bc))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.173](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.172...v2.0.0-next.173)
|
||||
|
||||
<sup>Released on **2025-12-16**</sup>
|
||||
|
||||
#### 🐛 Bug Fixes
|
||||
|
||||
- **misc**: Request to gpt5 series should not with `top_p`, temperature when reasoning effort is not none.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### What's fixed
|
||||
|
||||
- **misc**: Request to gpt5 series should not with `top_p`, temperature when reasoning effort is not none, closes [#10800](https://github.com/lobehub/lobe-chat/issues/10800) ([b4ad470](https://github.com/lobehub/lobe-chat/commit/b4ad470))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.172](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.171...v2.0.0-next.172)
|
||||
|
||||
<sup>Released on **2025-12-15**</sup>
|
||||
|
||||
#### 💄 Styles
|
||||
|
||||
- **misc**: Update i18n.
|
||||
|
||||
<br/>
|
||||
|
||||
<details>
|
||||
<summary><kbd>Improvements and Fixes</kbd></summary>
|
||||
|
||||
#### Styles
|
||||
|
||||
- **misc**: Update i18n, closes [#10759](https://github.com/lobehub/lobe-chat/issues/10759) ([24cae77](https://github.com/lobehub/lobe-chat/commit/24cae77))
|
||||
|
||||
</details>
|
||||
|
||||
<div align="right">
|
||||
|
||||
[](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## [Version 2.0.0-next.171](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.170...v2.0.0-next.171)
|
||||
|
||||
<sup>Released on **2025-12-14**</sup>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This document serves as a shared guideline for all team members when using Claude Code in this opensource lobe-chat(also known as lobehub) repository.
|
||||
This document serves as a shared guideline for all team members when using Claude Code in this repository.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
@@ -14,9 +14,10 @@ read @.cursor/rules/project-structure.mdc
|
||||
|
||||
### Git Workflow
|
||||
|
||||
- The current release branch is `next` instead of `main` until v2.0.0 is officially released
|
||||
- use rebase for git pull
|
||||
- git commit message should prefix with gitmoji
|
||||
- git branch name format template: <type>/<feature-name>
|
||||
- git branch name format example: tj/feat/feature-name
|
||||
- use .github/PULL_REQUEST_TEMPLATE.md to generate pull request description
|
||||
- PR titles starting with `✨ feat/` or `🐛 fix` will trigger the release workflow upon merge. Only use these prefixes for significant user-facing feature changes or bug fixes
|
||||
|
||||
@@ -49,7 +50,7 @@ see @.cursor/rules/typescript.mdc
|
||||
|
||||
### Typecheck
|
||||
|
||||
- use `bun run type-check` to check type errors.
|
||||
- use `bun run typecheck` to check type errors.
|
||||
|
||||
### i18n
|
||||
|
||||
@@ -57,7 +58,7 @@ see @.cursor/rules/typescript.mdc
|
||||
- **Dev**: Translate `locales/zh-CN/namespace.json` and `locales/en-US/namespace.json` locales file only for dev preview
|
||||
- DON'T run `pnpm i18n`, let CI auto handle it
|
||||
|
||||
## Linear Issue Management (ignore if not installed linear mcp)
|
||||
## Linear Issue Management
|
||||
|
||||
When working with Linear issues:
|
||||
|
||||
@@ -85,7 +86,7 @@ When creating new Linear issues using `mcp__linear-server__create_issue`, **MUST
|
||||
**Workflow for EACH individual issue:**
|
||||
|
||||
1. Complete the implementation for this specific issue
|
||||
2. Run type check: `bun run type-check`
|
||||
2. Run type check: `bun run typecheck`
|
||||
3. Run related tests if applicable
|
||||
4. Create PR if needed
|
||||
5. **IMMEDIATELY** update issue status to **"In Review"** (NOT "Done"): `mcp__linear-server__update_issue`
|
||||
|
||||
+1
-2
@@ -74,14 +74,13 @@ ENV NEXT_PUBLIC_ANALYTICS_UMAMI="${NEXT_PUBLIC_ANALYTICS_UMAMI}" \
|
||||
NEXT_PUBLIC_UMAMI_WEBSITE_ID="${NEXT_PUBLIC_UMAMI_WEBSITE_ID}"
|
||||
|
||||
# Node
|
||||
ENV NODE_OPTIONS="--max-old-space-size=8192"
|
||||
ENV NODE_OPTIONS="--max-old-space-size=6144"
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json pnpm-workspace.yaml ./
|
||||
COPY .npmrc ./
|
||||
COPY packages ./packages
|
||||
COPY patches ./patches
|
||||
# bring in desktop workspace manifest so pnpm can resolve it
|
||||
COPY apps/desktop/src/main/package.json ./apps/desktop/src/main/package.json
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ read @.cursor/rules/project-structure.mdc
|
||||
|
||||
- use rebase for git pull
|
||||
- git commit message should prefix with gitmoji
|
||||
- git branch name format template: <type>/<feature-name>
|
||||
- git branch name format example: tj/feat/feature-name
|
||||
- use .github/PULL_REQUEST_TEMPLATE.md to generate pull request description
|
||||
- PR titles starting with `✨ feat/` or `🐛 fix` will trigger the release workflow upon merge. Only use these prefixes for significant user-facing feature changes or bug fixes
|
||||
|
||||
@@ -47,7 +47,7 @@ see @.cursor/rules/typescript.mdc
|
||||
|
||||
### Typecheck
|
||||
|
||||
- use `bun run type-check` to check type errors.
|
||||
- use `bun run typecheck` to check type errors.
|
||||
|
||||
### i18n
|
||||
|
||||
|
||||
@@ -345,14 +345,14 @@ In addition, these plugins are not limited to news aggregation, but can also ext
|
||||
|
||||
<!-- PLUGIN LIST -->
|
||||
|
||||
| Recent Submits | Description |
|
||||
| -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Shopping tools](https://lobechat.com/discover/plugin/ShoppingTools)<br/><sup>By **shoppingtools** on **2025-12-17**</sup> | Search for products on eBay & AliExpress, find eBay events & coupons. Get prompt examples.<br/>`shopping` `e-bay` `ali-express` `coupons` |
|
||||
| [SEO Assistant](https://lobechat.com/discover/plugin/seo_assistant)<br/><sup>By **webfx** on **2025-12-17**</sup> | The SEO Assistant can generate search engine keyword information in order to aid the creation of content.<br/>`seo` `keyword` |
|
||||
| [Video Captions](https://lobechat.com/discover/plugin/VideoCaptions)<br/><sup>By **maila** on **2025-12-13**</sup> | Convert Youtube links into transcribed text, enable asking questions, create chapters, and summarize its content.<br/>`video-to-text` `youtube` |
|
||||
| [WeatherGPT](https://lobechat.com/discover/plugin/WeatherGPT)<br/><sup>By **steven-tey** on **2025-12-13**</sup> | Get current weather information for a specific location.<br/>`weather` |
|
||||
| Recent Submits | Description |
|
||||
| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Video Captions](https://lobechat.com/discover/plugin/VideoCaptions)<br/><sup>By **maila** on **2025-12-13**</sup> | Convert Youtube links into transcribed text, enable asking questions, create chapters, and summarize its content.<br/>`video-to-text` `youtube` |
|
||||
| [WeatherGPT](https://lobechat.com/discover/plugin/WeatherGPT)<br/><sup>By **steven-tey** on **2025-12-13**</sup> | Get current weather information for a specific location.<br/>`weather` |
|
||||
| [Git OSS Stats](https://lobechat.com/discover/plugin/gitUserRepoStats)<br/><sup>By **yunwei37** on **2025-12-13**</sup> | Dynamically generate and analyze stats and history for OSS repos and developers.<br/>`github` `oss` |
|
||||
| [Questmate Forms](https://lobechat.com/discover/plugin/questmate)<br/><sup>By **questmate** on **2025-12-13**</sup> | Create forms, checklists and workflows (we call 'em Quests!) that you can assign, schedule or make public.<br/>`forms` `checklists` `productivity` |
|
||||
|
||||
> 📊 Total plugins: [<kbd>**40**</kbd>](https://lobechat.com/discover/plugins)
|
||||
> 📊 Total plugins: [<kbd>**41**</kbd>](https://lobechat.com/discover/plugins)
|
||||
|
||||
<!-- PLUGIN LIST -->
|
||||
|
||||
@@ -820,7 +820,7 @@ This project is [LobeHub Community License](./LICENSE) licensed.
|
||||
[docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
|
||||
[docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square&sort=semver
|
||||
[docs]: https://lobehub.com/docs/usage/start
|
||||
[docs-dev-guide]: https://lobehub.com/docs/development/start
|
||||
[docs-dev-guide]: https://github.com/lobehub/lobe-chat/wiki/index
|
||||
[docs-docker]: https://lobehub.com/docs/self-hosting/server-database/docker-compose
|
||||
[docs-env-var]: https://lobehub.com/docs/self-hosting/environment-variables
|
||||
[docs-feat-agent]: https://lobehub.com/docs/usage/features/agent-market
|
||||
@@ -840,7 +840,7 @@ This project is [LobeHub Community License](./LICENSE) licensed.
|
||||
[docs-feat-tts]: https://lobehub.com/docs/usage/features/tts
|
||||
[docs-feat-vision]: https://lobehub.com/docs/usage/features/vision
|
||||
[docs-function-call]: https://lobehub.com/blog/openai-function-call
|
||||
[docs-lighthouse]: https://lobehub.com/docs/development/others/lighthouse
|
||||
[docs-lighthouse]: https://github.com/lobehub/lobe-chat/wiki/Lighthouse
|
||||
[docs-plugin-dev]: https://lobehub.com/docs/usage/plugins/development
|
||||
[docs-self-hosting]: https://lobehub.com/docs/self-hosting/start
|
||||
[docs-upstream-sync]: https://lobehub.com/docs/self-hosting/advanced/upstream-sync
|
||||
|
||||
+12
-12
@@ -12,7 +12,7 @@
|
||||
<h1>Lobe Chat</h1>
|
||||
|
||||
现代化设计的开源 ChatGPT/LLMs 聊天应用与开发框架<br/>
|
||||
支持语音合成、多模态、可扩展的([function call][docs-function-call])插件系统<br/>
|
||||
支持语音合成、多模态、可扩展的([function call][docs-functionc-call])插件系统<br/>
|
||||
一键**免费**拥有你自己的 ChatGPT/Gemini/Claude/Ollama 应用
|
||||
|
||||
[English](./README.md) · **简体中文** · [官网][official-site] · [更新日志][changelog] · [文档][docs] · [博客][blog] · [反馈问题][github-issues-link]
|
||||
@@ -338,14 +338,14 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
|
||||
|
||||
<!-- PLUGIN LIST -->
|
||||
|
||||
| 最近新增 | 描述 |
|
||||
| -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
||||
| [购物工具](https://lobechat.com/discover/plugin/ShoppingTools)<br/><sup>By **shoppingtools** on **2025-12-17**</sup> | 在 eBay 和 AliExpress 上搜索产品,查找 eBay 活动和优惠券。获取快速示例。<br/>`购物` `e-bay` `ali-express` `优惠券` |
|
||||
| [SEO 助手](https://lobechat.com/discover/plugin/seo_assistant)<br/><sup>By **webfx** on **2025-12-17**</sup> | SEO 助手可以生成搜索引擎关键词信息,以帮助创建内容。<br/>`seo` `关键词` |
|
||||
| [视频字幕](https://lobechat.com/discover/plugin/VideoCaptions)<br/><sup>By **maila** on **2025-12-13**</sup> | 将 Youtube 链接转换为转录文本,使其能够提问,创建章节,并总结其内容。<br/>`视频转文字` `you-tube` |
|
||||
| [天气 GPT](https://lobechat.com/discover/plugin/WeatherGPT)<br/><sup>By **steven-tey** on **2025-12-13**</sup> | 获取特定位置的当前天气信息。<br/>`天气` |
|
||||
| 最近新增 | 描述 |
|
||||
| ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| [视频字幕](https://lobechat.com/discover/plugin/VideoCaptions)<br/><sup>By **maila** on **2025-12-13**</sup> | 将 Youtube 链接转换为转录文本,使其能够提问,创建章节,并总结其内容。<br/>`视频转文字` `you-tube` |
|
||||
| [天气 GPT](https://lobechat.com/discover/plugin/WeatherGPT)<br/><sup>By **steven-tey** on **2025-12-13**</sup> | 获取特定位置的当前天气信息。<br/>`天气` |
|
||||
| [Git OSS Stats](https://lobechat.com/discover/plugin/gitUserRepoStats)<br/><sup>By **yunwei37** on **2025-12-13**</sup> | 动态生成和分析开源软件仓库和开发者的统计数据和历史记录。<br/>`github` `oss` |
|
||||
| [Questmate Forms](https://lobechat.com/discover/plugin/questmate)<br/><sup>By **questmate** on **2025-12-13**</sup> | 创建表单、清单和工作流程(我们称之为任务!),您可以分配、安排或公开。<br/>`表单` `清单` `生产力` |
|
||||
|
||||
> 📊 Total plugins: [<kbd>**40**</kbd>](https://lobechat.com/discover/plugins)
|
||||
> 📊 Total plugins: [<kbd>**41**</kbd>](https://lobechat.com/discover/plugins)
|
||||
|
||||
<!-- PLUGIN LIST -->
|
||||
|
||||
@@ -667,7 +667,7 @@ API Key 是使用 LobeChat 进行大语言模型会话的必要信息,本节
|
||||
|
||||
## 🧩 插件体系
|
||||
|
||||
插件提供了扩展 LobeChat [Function Calling][docs-function-call] 能力的方法。可以用于引入新的 Function Calling,甚至是新的消息结果渲染方式。如果你对插件开发感兴趣,请在 Wiki 中查阅我们的 [📘 插件开发指引][docs-plugin-dev] 。
|
||||
插件提供了扩展 LobeChat [Function Calling][docs-functionc-call] 能力的方法。可以用于引入新的 Function Calling,甚至是新的消息结果渲染方式。如果你对插件开发感兴趣,请在 Wiki 中查阅我们的 [📘 插件开发指引][docs-plugin-dev] 。
|
||||
|
||||
- [lobe-chat-plugins][lobe-chat-plugins]:插件索引从该仓库的 index.json 中获取插件列表并显示给用户。
|
||||
- [chat-plugin-template][chat-plugin-template]:插件开发模版,你可以通过项目模版快速新建插件项目。
|
||||
@@ -839,7 +839,7 @@ This project is [LobeHub Community License](./LICENSE) licensed.
|
||||
[docker-size-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
|
||||
[docker-size-shield]: https://img.shields.io/docker/image-size/lobehub/lobe-chat-database?color=369eff&labelColor=black&style=flat-square&sort=semver
|
||||
[docs]: https://lobehub.com/zh/docs/usage/start
|
||||
[docs-dev-guide]: https://lobehub.com/docs/development/start
|
||||
[docs-dev-guide]: https://github.com/lobehub/lobe-chat/wiki/index
|
||||
[docs-docker]: https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose
|
||||
[docs-env-var]: https://lobehub.com/docs/self-hosting/environment-variables
|
||||
[docs-feat-agent]: https://lobehub.com/docs/usage/features/agent-market
|
||||
@@ -858,8 +858,8 @@ This project is [LobeHub Community License](./LICENSE) licensed.
|
||||
[docs-feat-theme]: https://lobehub.com/docs/usage/features/theme
|
||||
[docs-feat-tts]: https://lobehub.com/docs/usage/features/tts
|
||||
[docs-feat-vision]: https://lobehub.com/docs/usage/features/vision
|
||||
[docs-function-call]: https://lobehub.com/zh/blog/openai-function-call
|
||||
[docs-lighthouse]: https://lobehub.com/docs/development/others/lighthouse
|
||||
[docs-functionc-call]: https://lobehub.com/zh/blog/openai-function-call
|
||||
[docs-lighthouse]: https://github.com/lobehub/lobe-chat/wiki/Lighthouse.zh-CN
|
||||
[docs-plugin-dev]: https://lobehub.com/docs/usage/plugins/development
|
||||
[docs-self-hosting]: https://lobehub.com/docs/self-hosting/start
|
||||
[docs-upstream-sync]: https://lobehub.com/docs/self-hosting/advanced/upstream-sync
|
||||
|
||||
@@ -8,7 +8,7 @@ module.exports = defineConfig({
|
||||
'ar',
|
||||
'bg-BG',
|
||||
'zh-TW',
|
||||
'en',
|
||||
'en-US',
|
||||
'ru-RU',
|
||||
'ja-JP',
|
||||
'ko-KR',
|
||||
|
||||
@@ -4,19 +4,3 @@ ignore-workspace-root-check=true
|
||||
|
||||
electron_mirror=https://npmmirror.com/mirrors/electron/
|
||||
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/
|
||||
|
||||
public-hoist-pattern[]=*@umijs/lint*
|
||||
public-hoist-pattern[]=*unicorn*
|
||||
public-hoist-pattern[]=*changelog*
|
||||
public-hoist-pattern[]=*commitlint*
|
||||
public-hoist-pattern[]=*eslint*
|
||||
public-hoist-pattern[]=*postcss*
|
||||
public-hoist-pattern[]=*prettier*
|
||||
public-hoist-pattern[]=*remark*
|
||||
public-hoist-pattern[]=*semantic-release*
|
||||
public-hoist-pattern[]=*stylelint*
|
||||
|
||||
public-hoist-pattern[]=@auth/core
|
||||
public-hoist-pattern[]=@clerk/backend
|
||||
public-hoist-pattern[]=@clerk/types
|
||||
public-hoist-pattern[]=pdfjs-dist
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
# Prettierignore for LobeHub
|
||||
################################################################
|
||||
|
||||
# general
|
||||
.DS_Store
|
||||
.editorconfig
|
||||
.idea
|
||||
.history
|
||||
.temp
|
||||
.env.local
|
||||
.husky
|
||||
.npmrc
|
||||
.gitkeep
|
||||
venv
|
||||
temp
|
||||
tmp
|
||||
LICENSE
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
*.log
|
||||
*.lock
|
||||
package-lock.json
|
||||
|
||||
# ci
|
||||
coverage
|
||||
.coverage
|
||||
.eslintcache
|
||||
.stylelintcache
|
||||
test-output
|
||||
__snapshots__
|
||||
*.snap
|
||||
|
||||
# production
|
||||
dist
|
||||
es
|
||||
lib
|
||||
logs
|
||||
|
||||
# umi
|
||||
.umi
|
||||
.umi-production
|
||||
.umi-test
|
||||
.dumi/tmp*
|
||||
|
||||
# ignore files
|
||||
.*ignore
|
||||
|
||||
# docker
|
||||
docker
|
||||
Dockerfile*
|
||||
|
||||
# image
|
||||
*.webp
|
||||
*.gif
|
||||
*.png
|
||||
*.jpg
|
||||
*.svg
|
||||
|
||||
# misc
|
||||
# add other ignore file below
|
||||
.next
|
||||
@@ -1 +0,0 @@
|
||||
module.exports = require('@lobehub/lint').prettier;
|
||||
@@ -1 +0,0 @@
|
||||
module.exports = require('@lobehub/lint').remarklint;
|
||||
@@ -1,39 +0,0 @@
|
||||
# Stylelintignore for LobeHub
|
||||
################################################################
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
|
||||
# ci
|
||||
coverage
|
||||
.coverage
|
||||
|
||||
# production
|
||||
dist
|
||||
es
|
||||
lib
|
||||
logs
|
||||
|
||||
# framework specific
|
||||
.next
|
||||
.umi
|
||||
.umi-production
|
||||
.umi-test
|
||||
.dumi/tmp*
|
||||
|
||||
# temporary directories
|
||||
tmp
|
||||
temp
|
||||
.temp
|
||||
.local
|
||||
docs/.local
|
||||
|
||||
# cache directories
|
||||
.cache
|
||||
|
||||
# AI coding tools directories
|
||||
.claude
|
||||
.serena
|
||||
|
||||
# MCP tools
|
||||
/.serena/**
|
||||
@@ -1,9 +0,0 @@
|
||||
const config = require('@lobehub/lint').stylelint;
|
||||
|
||||
module.exports = {
|
||||
...config,
|
||||
rules: {
|
||||
'selector-id-pattern': null,
|
||||
...config.rules,
|
||||
},
|
||||
};
|
||||
@@ -32,7 +32,7 @@ pnpm install-isolated
|
||||
pnpm electron:dev
|
||||
|
||||
# Type checking
|
||||
pnpm type-check
|
||||
pnpm typecheck
|
||||
|
||||
# Run tests
|
||||
pnpm test
|
||||
@@ -66,9 +66,9 @@ cp .env.desktop .env
|
||||
pnpm electron:dev # Start with hot reload
|
||||
|
||||
# 2. Code Quality
|
||||
pnpm lint # ESLint checking
|
||||
pnpm format # Prettier formatting
|
||||
pnpm type-check # TypeScript validation
|
||||
pnpm lint # ESLint checking
|
||||
pnpm format # Prettier formatting
|
||||
pnpm typecheck # TypeScript validation
|
||||
|
||||
# 3. Testing
|
||||
pnpm test # Run Vitest tests
|
||||
@@ -313,7 +313,7 @@ tests/ # Integration tests
|
||||
```bash
|
||||
pnpm test # Run all tests
|
||||
pnpm test:watch # Watch mode
|
||||
pnpm type-check # Type validation
|
||||
pnpm typecheck # Type validation
|
||||
```
|
||||
|
||||
### Test Coverage
|
||||
|
||||
@@ -32,7 +32,7 @@ pnpm install-isolated
|
||||
pnpm electron:dev
|
||||
|
||||
# 类型检查
|
||||
pnpm type-check
|
||||
pnpm typecheck
|
||||
|
||||
# 运行测试
|
||||
pnpm test
|
||||
@@ -66,9 +66,9 @@ cp .env.desktop .env
|
||||
pnpm electron:dev # 启动热重载开发服务器
|
||||
|
||||
# 2. 代码质量
|
||||
pnpm lint # ESLint 检查
|
||||
pnpm format # Prettier 格式化
|
||||
pnpm type-check # TypeScript 验证
|
||||
pnpm lint # ESLint 检查
|
||||
pnpm format # Prettier 格式化
|
||||
pnpm typecheck # TypeScript 验证
|
||||
|
||||
# 3. 测试
|
||||
pnpm test # 运行 Vitest 测试
|
||||
@@ -302,7 +302,7 @@ tests/ # 集成测试
|
||||
```bash
|
||||
pnpm test # 运行所有测试
|
||||
pnpm test:watch # 监视模式
|
||||
pnpm type-check # 类型验证
|
||||
pnpm typecheck # 类型验证
|
||||
```
|
||||
|
||||
### 测试覆盖
|
||||
|
||||
@@ -165,16 +165,12 @@ const config = {
|
||||
CFBundleURLSchemes: [protocolScheme],
|
||||
},
|
||||
],
|
||||
NSAppleEventsUsageDescription:
|
||||
'Application needs to control System Settings to help you grant Full Disk Access automatically.',
|
||||
NSCameraUsageDescription: "Application requests access to the device's camera.",
|
||||
NSDocumentsFolderUsageDescription:
|
||||
"Application requests access to the user's Documents folder.",
|
||||
NSDownloadsFolderUsageDescription:
|
||||
"Application requests access to the user's Downloads folder.",
|
||||
NSMicrophoneUsageDescription: "Application requests access to the device's microphone.",
|
||||
NSScreenCaptureUsageDescription:
|
||||
'Application requests access to record and analyze screen content for AI assistance.',
|
||||
},
|
||||
gatekeeperAssess: false,
|
||||
hardenedRuntime: hasAppleCertificate,
|
||||
|
||||
@@ -11,31 +11,23 @@
|
||||
"author": "LobeHub",
|
||||
"main": "./dist/main/index.js",
|
||||
"scripts": {
|
||||
"build": "electron-vite build",
|
||||
"build": "npm run typecheck && electron-vite build",
|
||||
"build-local": "npm run build && electron-builder --dir --config electron-builder.js --c.mac.notarize=false -c.mac.identity=null --c.asar=false",
|
||||
"build:linux": "npm run build && electron-builder --linux --config electron-builder.js --publish never",
|
||||
"build:mac": "npm run build && electron-builder --mac --config electron-builder.js --publish never",
|
||||
"build:mac:local": "npm run build && UPDATE_CHANNEL=nightly electron-builder --mac --config electron-builder.js --publish never",
|
||||
"build:win": "npm run build && electron-builder --win --config electron-builder.js --publish never",
|
||||
"dev": "electron-vite dev",
|
||||
"electron:dev": "electron-vite dev",
|
||||
"electron:run-unpack": "electron .",
|
||||
"format": "prettier --write ",
|
||||
"i18n": "tsx scripts/i18nWorkflow/index.ts && lobe-i18n",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"install-isolated": "pnpm install",
|
||||
"lint": "npm run lint:ts && npm run lint:style && npm run type-check && npm run lint:circular",
|
||||
"lint:circular": "npm run lint:circular:main && npm run lint:circular:packages",
|
||||
"lint:circular:main": "dpdm src/**/*.ts --no-warning --no-tree --exit-code circular:1 --no-progress -T true --skip-dynamic-imports circular",
|
||||
"lint:circular:packages": "dpdm packages/**/src/**/*.ts --no-warning --no-tree --exit-code circular:1 --no-progress -T true --skip-dynamic-imports circular",
|
||||
"lint:md": "remark . --silent --output",
|
||||
"lint:style": "stylelint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
|
||||
"lint:ts": "eslint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
|
||||
"lint": "eslint --cache ",
|
||||
"start": "electron-vite preview",
|
||||
"stylelint": "stylelint \"src/**/*.{js,jsx,ts,tsx}\" --fix",
|
||||
"test": "vitest --run",
|
||||
"type-check": "tsgo --noEmit -p tsconfig.json",
|
||||
"typecheck": "tsgo --noEmit -p tsconfig.json"
|
||||
"typecheck": "tsgo --noEmit -p tsconfig.json",
|
||||
"dev": "electron-vite dev"
|
||||
},
|
||||
"dependencies": {
|
||||
"electron-updater": "^6.6.2",
|
||||
@@ -56,26 +48,23 @@
|
||||
"@lobechat/electron-server-ipc": "workspace:*",
|
||||
"@lobechat/file-loaders": "workspace:*",
|
||||
"@lobehub/i18n-cli": "^1.25.1",
|
||||
"@modelcontextprotocol/sdk": "^1.24.3",
|
||||
"@types/async-retry": "^1.4.9",
|
||||
"@types/lodash": "^4.17.21",
|
||||
"@types/resolve": "^1.20.6",
|
||||
"@types/semver": "^7.7.1",
|
||||
"@types/set-cookie-parser": "^2.4.10",
|
||||
"@t3-oss/env-core": "^0.13.8",
|
||||
"@typescript/native-preview": "7.0.0-dev.20251210.1",
|
||||
"@modelcontextprotocol/sdk": "^1.24.3",
|
||||
"async-retry": "^1.3.3",
|
||||
"consola": "^3.4.2",
|
||||
"cookie": "^1.1.1",
|
||||
"diff": "^8.0.2",
|
||||
"electron": "^38.7.2",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-is": "^3.0.0",
|
||||
"electron-log": "^5.4.3",
|
||||
"electron-store": "^8.2.0",
|
||||
"electron-vite": "^4.0.1",
|
||||
"es-toolkit": "^1.43.0",
|
||||
"eslint": "^8.57.1",
|
||||
"execa": "^9.6.1",
|
||||
"fast-glob": "^3.3.3",
|
||||
"fix-path": "^5.0.0",
|
||||
@@ -84,19 +73,17 @@
|
||||
"https-proxy-agent": "^7.0.6",
|
||||
"i18next": "^25.7.2",
|
||||
"just-diff": "^6.0.2",
|
||||
"prettier": "^3.7.4",
|
||||
"remark-cli": "^12.0.1",
|
||||
"lodash": "^4.17.21",
|
||||
"lodash-es": "^4.17.21",
|
||||
"resolve": "^1.22.11",
|
||||
"semver": "^7.7.3",
|
||||
"set-cookie-parser": "^2.7.2",
|
||||
"stylelint": "^15.11.0",
|
||||
"tsx": "^4.21.0",
|
||||
"typescript": "^5.9.3",
|
||||
"undici": "^7.16.0",
|
||||
"uuid": "^13.0.0",
|
||||
"vite": "^7.2.7",
|
||||
"vitest": "^3.2.4",
|
||||
"zod": "^3.25.76"
|
||||
"vitest": "^3.2.4"
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "إضافة",
|
||||
"actions.back": "عودة",
|
||||
"actions.cancel": "إلغاء",
|
||||
"actions.close": "إغلاق",
|
||||
"actions.confirm": "تأكيد",
|
||||
"actions.delete": "حذف",
|
||||
"actions.edit": "تعديل",
|
||||
"actions.more": "المزيد",
|
||||
"actions.next": "التالي",
|
||||
"actions.ok": "حسناً",
|
||||
"actions.previous": "السابق",
|
||||
"actions.refresh": "تحديث",
|
||||
"actions.remove": "إزالة",
|
||||
"actions.retry": "إعادة المحاولة",
|
||||
"actions.save": "حفظ",
|
||||
"actions.search": "بحث",
|
||||
"actions.submit": "إرسال",
|
||||
"app.description": "منصة تعاون مساعدك الذكي",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "خطأ",
|
||||
"status.info": "معلومات",
|
||||
"status.loading": "جارٍ التحميل",
|
||||
"status.success": "نجاح",
|
||||
"status.warning": "تحذير"
|
||||
}
|
||||
"actions": {
|
||||
"add": "إضافة",
|
||||
"back": "عودة",
|
||||
"cancel": "إلغاء",
|
||||
"close": "إغلاق",
|
||||
"confirm": "تأكيد",
|
||||
"delete": "حذف",
|
||||
"edit": "تعديل",
|
||||
"more": "المزيد",
|
||||
"next": "التالي",
|
||||
"ok": "حسناً",
|
||||
"previous": "السابق",
|
||||
"refresh": "تحديث",
|
||||
"remove": "إزالة",
|
||||
"retry": "إعادة المحاولة",
|
||||
"save": "حفظ",
|
||||
"search": "بحث",
|
||||
"submit": "إرسال"
|
||||
},
|
||||
"app": {
|
||||
"description": "منصة تعاون مساعدك الذكي",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "خطأ",
|
||||
"info": "معلومات",
|
||||
"loading": "جارٍ التحميل",
|
||||
"success": "نجاح",
|
||||
"warning": "تحذير"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "تأكيد",
|
||||
"about.detail": "تطبيق دردشة يعتمد على نموذج لغة كبير",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "حول",
|
||||
"confirm.cancel": "إلغاء",
|
||||
"confirm.no": "لا",
|
||||
"confirm.title": "تأكيد",
|
||||
"confirm.yes": "نعم",
|
||||
"error.button": "تأكيد",
|
||||
"error.detail": "حدث خطأ أثناء العملية، يرجى المحاولة لاحقًا",
|
||||
"error.message": "حدث خطأ",
|
||||
"error.title": "خطأ",
|
||||
"update.downloadAndInstall": "تنزيل وتثبيت",
|
||||
"update.downloadComplete": "اكتمل التنزيل",
|
||||
"update.downloadCompleteMessage": "تم تنزيل حزمة التحديث، هل ترغب في التثبيت الآن؟",
|
||||
"update.installLater": "تثبيت لاحقًا",
|
||||
"update.installNow": "تثبيت الآن",
|
||||
"update.later": "تذكير لاحقًا",
|
||||
"update.newVersion": "تم اكتشاف إصدار جديد",
|
||||
"update.newVersionAvailable": "تم اكتشاف إصدار جديد: {{version}}",
|
||||
"update.skipThisVersion": "تخطي هذا الإصدار"
|
||||
}
|
||||
"about": {
|
||||
"button": "تأكيد",
|
||||
"detail": "تطبيق دردشة يعتمد على نموذج لغة كبير",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "حول"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "إلغاء",
|
||||
"no": "لا",
|
||||
"title": "تأكيد",
|
||||
"yes": "نعم"
|
||||
},
|
||||
"error": {
|
||||
"button": "تأكيد",
|
||||
"detail": "حدث خطأ أثناء العملية، يرجى المحاولة لاحقًا",
|
||||
"message": "حدث خطأ",
|
||||
"title": "خطأ"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "تنزيل وتثبيت",
|
||||
"downloadComplete": "اكتمل التنزيل",
|
||||
"downloadCompleteMessage": "تم تنزيل حزمة التحديث، هل ترغب في التثبيت الآن؟",
|
||||
"installLater": "تثبيت لاحقًا",
|
||||
"installNow": "تثبيت الآن",
|
||||
"later": "تذكير لاحقًا",
|
||||
"newVersion": "تم اكتشاف إصدار جديد",
|
||||
"newVersionAvailable": "تم اكتشاف إصدار جديد: {{version}}",
|
||||
"skipThisVersion": "تخطي هذا الإصدار"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "التحقق من التحديثات...",
|
||||
"dev.devPanel": "لوحة المطور",
|
||||
"dev.devTools": "أدوات المطور",
|
||||
"dev.forceReload": "إعادة تحميل قسري",
|
||||
"dev.openStore": "فتح ملف التخزين",
|
||||
"dev.refreshMenu": "تحديث القائمة",
|
||||
"dev.reload": "إعادة تحميل",
|
||||
"dev.title": "تطوير",
|
||||
"edit.copy": "نسخ",
|
||||
"edit.cut": "قص",
|
||||
"edit.delete": "حذف",
|
||||
"edit.paste": "لصق",
|
||||
"edit.redo": "إعادة",
|
||||
"edit.selectAll": "تحديد الكل",
|
||||
"edit.speech": "صوت",
|
||||
"edit.startSpeaking": "بدء القراءة",
|
||||
"edit.stopSpeaking": "إيقاف القراءة",
|
||||
"edit.title": "تحرير",
|
||||
"edit.undo": "تراجع",
|
||||
"file.preferences": "التفضيلات",
|
||||
"file.quit": "خروج",
|
||||
"file.title": "ملف",
|
||||
"help.about": "حول",
|
||||
"help.githubRepo": "مستودع GitHub",
|
||||
"help.reportIssue": "الإبلاغ عن مشكلة",
|
||||
"help.title": "مساعدة",
|
||||
"help.visitWebsite": "زيارة الموقع الرسمي",
|
||||
"macOS.about": "حول {{appName}}",
|
||||
"macOS.devTools": "أدوات مطور LobeHub",
|
||||
"macOS.hide": "إخفاء {{appName}}",
|
||||
"macOS.hideOthers": "إخفاء الآخرين",
|
||||
"macOS.preferences": "إعدادات مفضلة...",
|
||||
"macOS.services": "خدمات",
|
||||
"macOS.unhide": "إظهار الكل",
|
||||
"tray.open": "فتح {{appName}}",
|
||||
"tray.quit": "خروج",
|
||||
"tray.show": "عرض {{appName}}",
|
||||
"view.forceReload": "إعادة تحميل قسري",
|
||||
"view.reload": "إعادة تحميل",
|
||||
"view.resetZoom": "إعادة تعيين التكبير",
|
||||
"view.title": "عرض",
|
||||
"view.toggleFullscreen": "تبديل وضع ملء الشاشة",
|
||||
"view.zoomIn": "تكبير",
|
||||
"view.zoomOut": "تصغير",
|
||||
"window.bringAllToFront": "إحضار جميع النوافذ إلى الأمام",
|
||||
"window.close": "إغلاق",
|
||||
"window.front": "إحضار جميع النوافذ إلى الأمام",
|
||||
"window.minimize": "تصغير",
|
||||
"window.title": "نافذة",
|
||||
"window.toggleFullscreen": "تبديل وضع ملء الشاشة",
|
||||
"window.zoom": "تكبير"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "التحقق من التحديثات..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "لوحة المطور",
|
||||
"devTools": "أدوات المطور",
|
||||
"forceReload": "إعادة تحميل قسري",
|
||||
"openStore": "فتح ملف التخزين",
|
||||
"refreshMenu": "تحديث القائمة",
|
||||
"reload": "إعادة تحميل",
|
||||
"title": "تطوير"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "نسخ",
|
||||
"cut": "قص",
|
||||
"delete": "حذف",
|
||||
"paste": "لصق",
|
||||
"redo": "إعادة",
|
||||
"selectAll": "تحديد الكل",
|
||||
"speech": "صوت",
|
||||
"startSpeaking": "بدء القراءة",
|
||||
"stopSpeaking": "إيقاف القراءة",
|
||||
"title": "تحرير",
|
||||
"undo": "تراجع"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "التفضيلات",
|
||||
"quit": "خروج",
|
||||
"title": "ملف"
|
||||
},
|
||||
"help": {
|
||||
"about": "حول",
|
||||
"githubRepo": "مستودع GitHub",
|
||||
"reportIssue": "الإبلاغ عن مشكلة",
|
||||
"title": "مساعدة",
|
||||
"visitWebsite": "زيارة الموقع الرسمي"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "حول {{appName}}",
|
||||
"devTools": "أدوات مطور LobeHub",
|
||||
"hide": "إخفاء {{appName}}",
|
||||
"hideOthers": "إخفاء الآخرين",
|
||||
"preferences": "إعدادات مفضلة...",
|
||||
"services": "خدمات",
|
||||
"unhide": "إظهار الكل"
|
||||
},
|
||||
"tray": {
|
||||
"open": "فتح {{appName}}",
|
||||
"quit": "خروج",
|
||||
"show": "عرض {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "إعادة تحميل قسري",
|
||||
"reload": "إعادة تحميل",
|
||||
"resetZoom": "إعادة تعيين التكبير",
|
||||
"title": "عرض",
|
||||
"toggleFullscreen": "تبديل وضع ملء الشاشة",
|
||||
"zoomIn": "تكبير",
|
||||
"zoomOut": "تصغير"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "إحضار جميع النوافذ إلى الأمام",
|
||||
"close": "إغلاق",
|
||||
"front": "إحضار جميع النوافذ إلى الأمام",
|
||||
"minimize": "تصغير",
|
||||
"title": "نافذة",
|
||||
"toggleFullscreen": "تبديل وضع ملء الشاشة",
|
||||
"zoom": "تكبير"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Добави",
|
||||
"actions.back": "Назад",
|
||||
"actions.cancel": "Отмени",
|
||||
"actions.close": "Затвори",
|
||||
"actions.confirm": "Потвърди",
|
||||
"actions.delete": "Изтрий",
|
||||
"actions.edit": "Редактирай",
|
||||
"actions.more": "Повече",
|
||||
"actions.next": "Следващ",
|
||||
"actions.ok": "Добре",
|
||||
"actions.previous": "Предишен",
|
||||
"actions.refresh": "Освежи",
|
||||
"actions.remove": "Премахни",
|
||||
"actions.retry": "Опитай отново",
|
||||
"actions.save": "Запази",
|
||||
"actions.search": "Търси",
|
||||
"actions.submit": "Изпрати",
|
||||
"app.description": "Твоята платформа за сътрудничество с AI асистент",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Грешка",
|
||||
"status.info": "Информация",
|
||||
"status.loading": "Зареждане",
|
||||
"status.success": "Успех",
|
||||
"status.warning": "Предупреждение"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Добави",
|
||||
"back": "Назад",
|
||||
"cancel": "Отмени",
|
||||
"close": "Затвори",
|
||||
"confirm": "Потвърди",
|
||||
"delete": "Изтрий",
|
||||
"edit": "Редактирай",
|
||||
"more": "Повече",
|
||||
"next": "Следващ",
|
||||
"ok": "Добре",
|
||||
"previous": "Предишен",
|
||||
"refresh": "Освежи",
|
||||
"remove": "Премахни",
|
||||
"retry": "Опитай отново",
|
||||
"save": "Запази",
|
||||
"search": "Търси",
|
||||
"submit": "Изпрати"
|
||||
},
|
||||
"app": {
|
||||
"description": "Твоята платформа за сътрудничество с AI асистент",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Грешка",
|
||||
"info": "Информация",
|
||||
"loading": "Зареждане",
|
||||
"success": "Успех",
|
||||
"warning": "Предупреждение"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Потвърди",
|
||||
"about.detail": "Приложение за чат, базирано на голям езиков модел",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "За нас",
|
||||
"confirm.cancel": "Отказ",
|
||||
"confirm.no": "Не",
|
||||
"confirm.title": "Потвърждение",
|
||||
"confirm.yes": "Да",
|
||||
"error.button": "Потвърди",
|
||||
"error.detail": "Възникна грешка по време на операцията, моля опитайте отново по-късно",
|
||||
"error.message": "Възникна грешка",
|
||||
"error.title": "Грешка",
|
||||
"update.downloadAndInstall": "Изтегли и инсталирай",
|
||||
"update.downloadComplete": "Изтеглянето е завършено",
|
||||
"update.downloadCompleteMessage": "Актуализационният пакет е изтеглен, желаете ли да го инсталирате веднага?",
|
||||
"update.installLater": "Инсталирай по-късно",
|
||||
"update.installNow": "Инсталирай сега",
|
||||
"update.later": "Напомни по-късно",
|
||||
"update.newVersion": "Открита нова версия",
|
||||
"update.newVersionAvailable": "Открита нова версия: {{version}}",
|
||||
"update.skipThisVersion": "Пропусни тази версия"
|
||||
}
|
||||
"about": {
|
||||
"button": "Потвърди",
|
||||
"detail": "Приложение за чат, базирано на голям езиков модел",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "За нас"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Отказ",
|
||||
"no": "Не",
|
||||
"title": "Потвърждение",
|
||||
"yes": "Да"
|
||||
},
|
||||
"error": {
|
||||
"button": "Потвърди",
|
||||
"detail": "Възникна грешка по време на операцията, моля опитайте отново по-късно",
|
||||
"message": "Възникна грешка",
|
||||
"title": "Грешка"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Изтегли и инсталирай",
|
||||
"downloadComplete": "Изтеглянето е завършено",
|
||||
"downloadCompleteMessage": "Актуализационният пакет е изтеглен, желаете ли да го инсталирате веднага?",
|
||||
"installLater": "Инсталирай по-късно",
|
||||
"installNow": "Инсталирай сега",
|
||||
"later": "Напомни по-късно",
|
||||
"newVersion": "Открита нова версия",
|
||||
"newVersionAvailable": "Открита нова версия: {{version}}",
|
||||
"skipThisVersion": "Пропусни тази версия"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Проверка за актуализации...",
|
||||
"dev.devPanel": "Панел на разработчика",
|
||||
"dev.devTools": "Инструменти за разработчици",
|
||||
"dev.forceReload": "Принудително презареждане",
|
||||
"dev.openStore": "Отворете файла за съхранение",
|
||||
"dev.refreshMenu": "Освежаване на менюто",
|
||||
"dev.reload": "Презареждане",
|
||||
"dev.title": "Разработка",
|
||||
"edit.copy": "Копиране",
|
||||
"edit.cut": "Изрязване",
|
||||
"edit.delete": "Изтрий",
|
||||
"edit.paste": "Поставяне",
|
||||
"edit.redo": "Повторно",
|
||||
"edit.selectAll": "Избери всичко",
|
||||
"edit.speech": "Глас",
|
||||
"edit.startSpeaking": "Започни четене",
|
||||
"edit.stopSpeaking": "Спри четенето",
|
||||
"edit.title": "Редактиране",
|
||||
"edit.undo": "Отмяна",
|
||||
"file.preferences": "Предпочитания",
|
||||
"file.quit": "Изход",
|
||||
"file.title": "Файл",
|
||||
"help.about": "За",
|
||||
"help.githubRepo": "GitHub хранилище",
|
||||
"help.reportIssue": "Докладвай проблем",
|
||||
"help.title": "Помощ",
|
||||
"help.visitWebsite": "Посети уебсайта",
|
||||
"macOS.about": "За {{appName}}",
|
||||
"macOS.devTools": "Инструменти за разработчици на LobeHub",
|
||||
"macOS.hide": "Скрий {{appName}}",
|
||||
"macOS.hideOthers": "Скрий другите",
|
||||
"macOS.preferences": "Настройки...",
|
||||
"macOS.services": "Услуги",
|
||||
"macOS.unhide": "Покажи всичко",
|
||||
"tray.open": "Отвори {{appName}}",
|
||||
"tray.quit": "Изход",
|
||||
"tray.show": "Покажи {{appName}}",
|
||||
"view.forceReload": "Принудително презареждане",
|
||||
"view.reload": "Презареждане",
|
||||
"view.resetZoom": "Нулиране на мащаба",
|
||||
"view.title": "Изглед",
|
||||
"view.toggleFullscreen": "Превключи на цял екран",
|
||||
"view.zoomIn": "Увеличи",
|
||||
"view.zoomOut": "Намали",
|
||||
"window.bringAllToFront": "Премести всички прозорци напред",
|
||||
"window.close": "Затвори",
|
||||
"window.front": "Премести всички прозорци напред",
|
||||
"window.minimize": "Минимизирай",
|
||||
"window.title": "Прозорец",
|
||||
"window.toggleFullscreen": "Превключи на цял екран",
|
||||
"window.zoom": "Мащаб"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Проверка за актуализации..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Панел на разработчика",
|
||||
"devTools": "Инструменти за разработчици",
|
||||
"forceReload": "Принудително презареждане",
|
||||
"openStore": "Отворете файла за съхранение",
|
||||
"refreshMenu": "Освежаване на менюто",
|
||||
"reload": "Презареждане",
|
||||
"title": "Разработка"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Копиране",
|
||||
"cut": "Изрязване",
|
||||
"delete": "Изтрий",
|
||||
"paste": "Поставяне",
|
||||
"redo": "Повторно",
|
||||
"selectAll": "Избери всичко",
|
||||
"speech": "Глас",
|
||||
"startSpeaking": "Започни четене",
|
||||
"stopSpeaking": "Спри четенето",
|
||||
"title": "Редактиране",
|
||||
"undo": "Отмяна"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Предпочитания",
|
||||
"quit": "Изход",
|
||||
"title": "Файл"
|
||||
},
|
||||
"help": {
|
||||
"about": "За",
|
||||
"githubRepo": "GitHub хранилище",
|
||||
"reportIssue": "Докладвай проблем",
|
||||
"title": "Помощ",
|
||||
"visitWebsite": "Посети уебсайта"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "За {{appName}}",
|
||||
"devTools": "Инструменти за разработчици на LobeHub",
|
||||
"hide": "Скрий {{appName}}",
|
||||
"hideOthers": "Скрий другите",
|
||||
"preferences": "Настройки...",
|
||||
"services": "Услуги",
|
||||
"unhide": "Покажи всичко"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Отвори {{appName}}",
|
||||
"quit": "Изход",
|
||||
"show": "Покажи {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Принудително презареждане",
|
||||
"reload": "Презареждане",
|
||||
"resetZoom": "Нулиране на мащаба",
|
||||
"title": "Изглед",
|
||||
"toggleFullscreen": "Превключи на цял екран",
|
||||
"zoomIn": "Увеличи",
|
||||
"zoomOut": "Намали"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Премести всички прозорци напред",
|
||||
"close": "Затвори",
|
||||
"front": "Премести всички прозорци напред",
|
||||
"minimize": "Минимизирай",
|
||||
"title": "Прозорец",
|
||||
"toggleFullscreen": "Превключи на цял екран",
|
||||
"zoom": "Мащаб"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Hinzufügen",
|
||||
"actions.back": "Zurück",
|
||||
"actions.cancel": "Abbrechen",
|
||||
"actions.close": "Schließen",
|
||||
"actions.confirm": "Bestätigen",
|
||||
"actions.delete": "Löschen",
|
||||
"actions.edit": "Bearbeiten",
|
||||
"actions.more": "Mehr",
|
||||
"actions.next": "Weiter",
|
||||
"actions.ok": "OK",
|
||||
"actions.previous": "Zurück",
|
||||
"actions.refresh": "Aktualisieren",
|
||||
"actions.remove": "Entfernen",
|
||||
"actions.retry": "Erneut versuchen",
|
||||
"actions.save": "Speichern",
|
||||
"actions.search": "Suchen",
|
||||
"actions.submit": "Einreichen",
|
||||
"app.description": "Ihre KI-Assistenten-Kollaborationsplattform",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Fehler",
|
||||
"status.info": "Information",
|
||||
"status.loading": "Lädt",
|
||||
"status.success": "Erfolg",
|
||||
"status.warning": "Warnung"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Hinzufügen",
|
||||
"back": "Zurück",
|
||||
"cancel": "Abbrechen",
|
||||
"close": "Schließen",
|
||||
"confirm": "Bestätigen",
|
||||
"delete": "Löschen",
|
||||
"edit": "Bearbeiten",
|
||||
"more": "Mehr",
|
||||
"next": "Weiter",
|
||||
"ok": "OK",
|
||||
"previous": "Zurück",
|
||||
"refresh": "Aktualisieren",
|
||||
"remove": "Entfernen",
|
||||
"retry": "Erneut versuchen",
|
||||
"save": "Speichern",
|
||||
"search": "Suchen",
|
||||
"submit": "Einreichen"
|
||||
},
|
||||
"app": {
|
||||
"description": "Ihre KI-Assistenten-Kollaborationsplattform",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Fehler",
|
||||
"info": "Information",
|
||||
"loading": "Lädt",
|
||||
"success": "Erfolg",
|
||||
"warning": "Warnung"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Bestätigen",
|
||||
"about.detail": "Eine Chat-Anwendung, die auf einem großen Sprachmodell basiert",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Über",
|
||||
"confirm.cancel": "Abbrechen",
|
||||
"confirm.no": "Nein",
|
||||
"confirm.title": "Bestätigung",
|
||||
"confirm.yes": "Ja",
|
||||
"error.button": "Bestätigen",
|
||||
"error.detail": "Während der Operation ist ein Fehler aufgetreten, bitte versuchen Sie es später erneut",
|
||||
"error.message": "Ein Fehler ist aufgetreten",
|
||||
"error.title": "Fehler",
|
||||
"update.downloadAndInstall": "Herunterladen und installieren",
|
||||
"update.downloadComplete": "Download abgeschlossen",
|
||||
"update.downloadCompleteMessage": "Das Update-Paket wurde heruntergeladen, möchten Sie es jetzt installieren?",
|
||||
"update.installLater": "Später installieren",
|
||||
"update.installNow": "Jetzt installieren",
|
||||
"update.later": "Später erinnern",
|
||||
"update.newVersion": "Neue Version gefunden",
|
||||
"update.newVersionAvailable": "Neue Version verfügbar: {{version}}",
|
||||
"update.skipThisVersion": "Diese Version überspringen"
|
||||
}
|
||||
"about": {
|
||||
"button": "Bestätigen",
|
||||
"detail": "Eine Chat-Anwendung, die auf einem großen Sprachmodell basiert",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Über"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Abbrechen",
|
||||
"no": "Nein",
|
||||
"title": "Bestätigung",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"error": {
|
||||
"button": "Bestätigen",
|
||||
"detail": "Während der Operation ist ein Fehler aufgetreten, bitte versuchen Sie es später erneut",
|
||||
"message": "Ein Fehler ist aufgetreten",
|
||||
"title": "Fehler"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Herunterladen und installieren",
|
||||
"downloadComplete": "Download abgeschlossen",
|
||||
"downloadCompleteMessage": "Das Update-Paket wurde heruntergeladen, möchten Sie es jetzt installieren?",
|
||||
"installLater": "Später installieren",
|
||||
"installNow": "Jetzt installieren",
|
||||
"later": "Später erinnern",
|
||||
"newVersion": "Neue Version gefunden",
|
||||
"newVersionAvailable": "Neue Version verfügbar: {{version}}",
|
||||
"skipThisVersion": "Diese Version überspringen"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Überprüfen Sie auf Updates...",
|
||||
"dev.devPanel": "Entwicklerpanel",
|
||||
"dev.devTools": "Entwicklerwerkzeuge",
|
||||
"dev.forceReload": "Erzwinge Neuladen",
|
||||
"dev.openStore": "Speicherdatei öffnen",
|
||||
"dev.refreshMenu": "Menü aktualisieren",
|
||||
"dev.reload": "Neuladen",
|
||||
"dev.title": "Entwicklung",
|
||||
"edit.copy": "Kopieren",
|
||||
"edit.cut": "Ausschneiden",
|
||||
"edit.delete": "Löschen",
|
||||
"edit.paste": "Einfügen",
|
||||
"edit.redo": "Wiederherstellen",
|
||||
"edit.selectAll": "Alles auswählen",
|
||||
"edit.speech": "Sprache",
|
||||
"edit.startSpeaking": "Beginne zu sprechen",
|
||||
"edit.stopSpeaking": "Stoppe das Sprechen",
|
||||
"edit.title": "Bearbeiten",
|
||||
"edit.undo": "Rückgängig",
|
||||
"file.preferences": "Einstellungen",
|
||||
"file.quit": "Beenden",
|
||||
"file.title": "Datei",
|
||||
"help.about": "Über",
|
||||
"help.githubRepo": "GitHub-Repository",
|
||||
"help.reportIssue": "Problem melden",
|
||||
"help.title": "Hilfe",
|
||||
"help.visitWebsite": "Besuche die Website",
|
||||
"macOS.about": "Über {{appName}}",
|
||||
"macOS.devTools": "LobeHub Entwicklerwerkzeuge",
|
||||
"macOS.hide": "{{appName}} ausblenden",
|
||||
"macOS.hideOthers": "Andere ausblenden",
|
||||
"macOS.preferences": "Einstellungen...",
|
||||
"macOS.services": "Dienste",
|
||||
"macOS.unhide": "Alle anzeigen",
|
||||
"tray.open": "{{appName}} öffnen",
|
||||
"tray.quit": "Beenden",
|
||||
"tray.show": "{{appName}} anzeigen",
|
||||
"view.forceReload": "Erzwinge Neuladen",
|
||||
"view.reload": "Neuladen",
|
||||
"view.resetZoom": "Zoom zurücksetzen",
|
||||
"view.title": "Ansicht",
|
||||
"view.toggleFullscreen": "Vollbild umschalten",
|
||||
"view.zoomIn": "Vergrößern",
|
||||
"view.zoomOut": "Verkleinern",
|
||||
"window.bringAllToFront": "Alle Fenster in den Vordergrund bringen",
|
||||
"window.close": "Schließen",
|
||||
"window.front": "Alle Fenster in den Vordergrund bringen",
|
||||
"window.minimize": "Minimieren",
|
||||
"window.title": "Fenster",
|
||||
"window.toggleFullscreen": "Vollbild umschalten",
|
||||
"window.zoom": "Zoom"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Überprüfen Sie auf Updates..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Entwicklerpanel",
|
||||
"devTools": "Entwicklerwerkzeuge",
|
||||
"forceReload": "Erzwinge Neuladen",
|
||||
"openStore": "Speicherdatei öffnen",
|
||||
"refreshMenu": "Menü aktualisieren",
|
||||
"reload": "Neuladen",
|
||||
"title": "Entwicklung"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Kopieren",
|
||||
"cut": "Ausschneiden",
|
||||
"delete": "Löschen",
|
||||
"paste": "Einfügen",
|
||||
"redo": "Wiederherstellen",
|
||||
"selectAll": "Alles auswählen",
|
||||
"speech": "Sprache",
|
||||
"startSpeaking": "Beginne zu sprechen",
|
||||
"stopSpeaking": "Stoppe das Sprechen",
|
||||
"title": "Bearbeiten",
|
||||
"undo": "Rückgängig"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Einstellungen",
|
||||
"quit": "Beenden",
|
||||
"title": "Datei"
|
||||
},
|
||||
"help": {
|
||||
"about": "Über",
|
||||
"githubRepo": "GitHub-Repository",
|
||||
"reportIssue": "Problem melden",
|
||||
"title": "Hilfe",
|
||||
"visitWebsite": "Besuche die Website"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "Über {{appName}}",
|
||||
"devTools": "LobeHub Entwicklerwerkzeuge",
|
||||
"hide": "{{appName}} ausblenden",
|
||||
"hideOthers": "Andere ausblenden",
|
||||
"preferences": "Einstellungen...",
|
||||
"services": "Dienste",
|
||||
"unhide": "Alle anzeigen"
|
||||
},
|
||||
"tray": {
|
||||
"open": "{{appName}} öffnen",
|
||||
"quit": "Beenden",
|
||||
"show": "{{appName}} anzeigen"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Erzwinge Neuladen",
|
||||
"reload": "Neuladen",
|
||||
"resetZoom": "Zoom zurücksetzen",
|
||||
"title": "Ansicht",
|
||||
"toggleFullscreen": "Vollbild umschalten",
|
||||
"zoomIn": "Vergrößern",
|
||||
"zoomOut": "Verkleinern"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Alle Fenster in den Vordergrund bringen",
|
||||
"close": "Schließen",
|
||||
"front": "Alle Fenster in den Vordergrund bringen",
|
||||
"minimize": "Minimieren",
|
||||
"title": "Fenster",
|
||||
"toggleFullscreen": "Vollbild umschalten",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"actions": {
|
||||
"add": "Add",
|
||||
"back": "Back",
|
||||
"cancel": "Cancel",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"delete": "Delete",
|
||||
"edit": "Edit",
|
||||
"more": "More",
|
||||
"next": "Next",
|
||||
"ok": "OK",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"remove": "Remove",
|
||||
"retry": "Retry",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"submit": "Submit"
|
||||
},
|
||||
"app": {
|
||||
"description": "Your AI Assistant Collaboration Platform",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Error",
|
||||
"info": "Information",
|
||||
"loading": "Loading",
|
||||
"success": "Success",
|
||||
"warning": "Warning"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"about": {
|
||||
"button": "OK",
|
||||
"detail": "A chat application based on a large language model",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "About"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Cancel",
|
||||
"no": "No",
|
||||
"title": "Confirm",
|
||||
"yes": "Yes"
|
||||
},
|
||||
"error": {
|
||||
"button": "OK",
|
||||
"detail": "An error occurred during the operation, please try again later",
|
||||
"message": "An error occurred",
|
||||
"title": "Error"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Download and Install",
|
||||
"downloadComplete": "Download Complete",
|
||||
"downloadCompleteMessage": "The update package has been downloaded, would you like to install it now?",
|
||||
"installLater": "Install Later",
|
||||
"installNow": "Install Now",
|
||||
"later": "Remind Me Later",
|
||||
"newVersion": "New Version Found",
|
||||
"newVersionAvailable": "New version available: {{version}}",
|
||||
"skipThisVersion": "Skip This Version"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"common": {
|
||||
"checkUpdates": "Checking for updates..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Developer Panel",
|
||||
"devTools": "Developer Tools",
|
||||
"forceReload": "Force Reload",
|
||||
"openStore": "Open Storage File",
|
||||
"refreshMenu": "Refresh menu",
|
||||
"reload": "Reload",
|
||||
"title": "Development"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Copy",
|
||||
"cut": "Cut",
|
||||
"delete": "Delete",
|
||||
"paste": "Paste",
|
||||
"redo": "Redo",
|
||||
"selectAll": "Select All",
|
||||
"speech": "Speech",
|
||||
"startSpeaking": "Start Speaking",
|
||||
"stopSpeaking": "Stop Speaking",
|
||||
"title": "Edit",
|
||||
"undo": "Undo"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Preferences",
|
||||
"quit": "Quit",
|
||||
"title": "File"
|
||||
},
|
||||
"help": {
|
||||
"about": "About",
|
||||
"githubRepo": "GitHub Repository",
|
||||
"reportIssue": "Report Issue",
|
||||
"title": "Help",
|
||||
"visitWebsite": "Visit Website"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "About {{appName}}",
|
||||
"devTools": "LobeHub Developer Tools",
|
||||
"hide": "Hide {{appName}}",
|
||||
"hideOthers": "Hide Others",
|
||||
"preferences": "Preferences...",
|
||||
"services": "Services",
|
||||
"unhide": "Show All"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Open {{appName}}",
|
||||
"quit": "Quit",
|
||||
"show": "Show {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Force Reload",
|
||||
"reload": "Reload",
|
||||
"resetZoom": "Reset Zoom",
|
||||
"title": "View",
|
||||
"toggleFullscreen": "Toggle Fullscreen",
|
||||
"zoomIn": "Zoom In",
|
||||
"zoomOut": "Zoom Out"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Bring All Windows to Front",
|
||||
"close": "Close",
|
||||
"front": "Bring All Windows to Front",
|
||||
"minimize": "Minimize",
|
||||
"title": "Window",
|
||||
"toggleFullscreen": "Toggle Fullscreen",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Agregar",
|
||||
"actions.back": "Volver",
|
||||
"actions.cancel": "Cancelar",
|
||||
"actions.close": "Cerrar",
|
||||
"actions.confirm": "Confirmar",
|
||||
"actions.delete": "Eliminar",
|
||||
"actions.edit": "Editar",
|
||||
"actions.more": "Más",
|
||||
"actions.next": "Siguiente",
|
||||
"actions.ok": "Aceptar",
|
||||
"actions.previous": "Anterior",
|
||||
"actions.refresh": "Actualizar",
|
||||
"actions.remove": "Eliminar",
|
||||
"actions.retry": "Reintentar",
|
||||
"actions.save": "Guardar",
|
||||
"actions.search": "Buscar",
|
||||
"actions.submit": "Enviar",
|
||||
"app.description": "Tu plataforma de colaboración con el asistente de IA",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Error",
|
||||
"status.info": "Información",
|
||||
"status.loading": "Cargando",
|
||||
"status.success": "Éxito",
|
||||
"status.warning": "Advertencia"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Agregar",
|
||||
"back": "Volver",
|
||||
"cancel": "Cancelar",
|
||||
"close": "Cerrar",
|
||||
"confirm": "Confirmar",
|
||||
"delete": "Eliminar",
|
||||
"edit": "Editar",
|
||||
"more": "Más",
|
||||
"next": "Siguiente",
|
||||
"ok": "Aceptar",
|
||||
"previous": "Anterior",
|
||||
"refresh": "Actualizar",
|
||||
"remove": "Eliminar",
|
||||
"retry": "Reintentar",
|
||||
"save": "Guardar",
|
||||
"search": "Buscar",
|
||||
"submit": "Enviar"
|
||||
},
|
||||
"app": {
|
||||
"description": "Tu plataforma de colaboración con el asistente de IA",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Error",
|
||||
"info": "Información",
|
||||
"loading": "Cargando",
|
||||
"success": "Éxito",
|
||||
"warning": "Advertencia"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Aceptar",
|
||||
"about.detail": "Una aplicación de chat basada en un modelo de lenguaje grande",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Acerca de",
|
||||
"confirm.cancel": "Cancelar",
|
||||
"confirm.no": "No",
|
||||
"confirm.title": "Confirmar",
|
||||
"confirm.yes": "Sí",
|
||||
"error.button": "Aceptar",
|
||||
"error.detail": "Se produjo un error durante la operación, por favor intente de nuevo más tarde",
|
||||
"error.message": "Se produjo un error",
|
||||
"error.title": "Error",
|
||||
"update.downloadAndInstall": "Descargar e instalar",
|
||||
"update.downloadComplete": "Descarga completada",
|
||||
"update.downloadCompleteMessage": "El paquete de actualización se ha descargado, ¿desea instalarlo ahora?",
|
||||
"update.installLater": "Instalar más tarde",
|
||||
"update.installNow": "Instalar ahora",
|
||||
"update.later": "Recordar más tarde",
|
||||
"update.newVersion": "Nueva versión disponible",
|
||||
"update.newVersionAvailable": "Nueva versión encontrada: {{version}}",
|
||||
"update.skipThisVersion": "Saltar esta versión"
|
||||
}
|
||||
"about": {
|
||||
"button": "Aceptar",
|
||||
"detail": "Una aplicación de chat basada en un modelo de lenguaje grande",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Acerca de"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Cancelar",
|
||||
"no": "No",
|
||||
"title": "Confirmar",
|
||||
"yes": "Sí"
|
||||
},
|
||||
"error": {
|
||||
"button": "Aceptar",
|
||||
"detail": "Se produjo un error durante la operación, por favor intente de nuevo más tarde",
|
||||
"message": "Se produjo un error",
|
||||
"title": "Error"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Descargar e instalar",
|
||||
"downloadComplete": "Descarga completada",
|
||||
"downloadCompleteMessage": "El paquete de actualización se ha descargado, ¿desea instalarlo ahora?",
|
||||
"installLater": "Instalar más tarde",
|
||||
"installNow": "Instalar ahora",
|
||||
"later": "Recordar más tarde",
|
||||
"newVersion": "Nueva versión disponible",
|
||||
"newVersionAvailable": "Nueva versión encontrada: {{version}}",
|
||||
"skipThisVersion": "Saltar esta versión"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Comprobando actualizaciones...",
|
||||
"dev.devPanel": "Panel de desarrollador",
|
||||
"dev.devTools": "Herramientas de desarrollador",
|
||||
"dev.forceReload": "Recargar forzosamente",
|
||||
"dev.openStore": "Abrir archivo de almacenamiento",
|
||||
"dev.refreshMenu": "Actualizar menú",
|
||||
"dev.reload": "Recargar",
|
||||
"dev.title": "Desarrollo",
|
||||
"edit.copy": "Copiar",
|
||||
"edit.cut": "Cortar",
|
||||
"edit.delete": "Eliminar",
|
||||
"edit.paste": "Pegar",
|
||||
"edit.redo": "Rehacer",
|
||||
"edit.selectAll": "Seleccionar todo",
|
||||
"edit.speech": "Voz",
|
||||
"edit.startSpeaking": "Comenzar a leer en voz alta",
|
||||
"edit.stopSpeaking": "Detener lectura en voz alta",
|
||||
"edit.title": "Editar",
|
||||
"edit.undo": "Deshacer",
|
||||
"file.preferences": "Preferencias",
|
||||
"file.quit": "Salir",
|
||||
"file.title": "Archivo",
|
||||
"help.about": "Acerca de",
|
||||
"help.githubRepo": "Repositorio de GitHub",
|
||||
"help.reportIssue": "Reportar un problema",
|
||||
"help.title": "Ayuda",
|
||||
"help.visitWebsite": "Visitar el sitio web",
|
||||
"macOS.about": "Acerca de {{appName}}",
|
||||
"macOS.devTools": "Herramientas de desarrollador de LobeHub",
|
||||
"macOS.hide": "Ocultar {{appName}}",
|
||||
"macOS.hideOthers": "Ocultar otros",
|
||||
"macOS.preferences": "Configuración...",
|
||||
"macOS.services": "Servicios",
|
||||
"macOS.unhide": "Mostrar todo",
|
||||
"tray.open": "Abrir {{appName}}",
|
||||
"tray.quit": "Salir",
|
||||
"tray.show": "Mostrar {{appName}}",
|
||||
"view.forceReload": "Recargar forzosamente",
|
||||
"view.reload": "Recargar",
|
||||
"view.resetZoom": "Restablecer zoom",
|
||||
"view.title": "Vista",
|
||||
"view.toggleFullscreen": "Alternar pantalla completa",
|
||||
"view.zoomIn": "Acercar",
|
||||
"view.zoomOut": "Alejar",
|
||||
"window.bringAllToFront": "Traer todas las ventanas al frente",
|
||||
"window.close": "Cerrar",
|
||||
"window.front": "Traer todas las ventanas al frente",
|
||||
"window.minimize": "Minimizar",
|
||||
"window.title": "Ventana",
|
||||
"window.toggleFullscreen": "Alternar pantalla completa",
|
||||
"window.zoom": "Zoom"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Comprobando actualizaciones..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Panel de desarrollador",
|
||||
"devTools": "Herramientas de desarrollador",
|
||||
"forceReload": "Recargar forzosamente",
|
||||
"openStore": "Abrir archivo de almacenamiento",
|
||||
"refreshMenu": "Actualizar menú",
|
||||
"reload": "Recargar",
|
||||
"title": "Desarrollo"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Copiar",
|
||||
"cut": "Cortar",
|
||||
"delete": "Eliminar",
|
||||
"paste": "Pegar",
|
||||
"redo": "Rehacer",
|
||||
"selectAll": "Seleccionar todo",
|
||||
"speech": "Voz",
|
||||
"startSpeaking": "Comenzar a leer en voz alta",
|
||||
"stopSpeaking": "Detener lectura en voz alta",
|
||||
"title": "Editar",
|
||||
"undo": "Deshacer"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Preferencias",
|
||||
"quit": "Salir",
|
||||
"title": "Archivo"
|
||||
},
|
||||
"help": {
|
||||
"about": "Acerca de",
|
||||
"githubRepo": "Repositorio de GitHub",
|
||||
"reportIssue": "Reportar un problema",
|
||||
"title": "Ayuda",
|
||||
"visitWebsite": "Visitar el sitio web"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "Acerca de {{appName}}",
|
||||
"devTools": "Herramientas de desarrollador de LobeHub",
|
||||
"hide": "Ocultar {{appName}}",
|
||||
"hideOthers": "Ocultar otros",
|
||||
"preferences": "Configuración...",
|
||||
"services": "Servicios",
|
||||
"unhide": "Mostrar todo"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Abrir {{appName}}",
|
||||
"quit": "Salir",
|
||||
"show": "Mostrar {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Recargar forzosamente",
|
||||
"reload": "Recargar",
|
||||
"resetZoom": "Restablecer zoom",
|
||||
"title": "Vista",
|
||||
"toggleFullscreen": "Alternar pantalla completa",
|
||||
"zoomIn": "Acercar",
|
||||
"zoomOut": "Alejar"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Traer todas las ventanas al frente",
|
||||
"close": "Cerrar",
|
||||
"front": "Traer todas las ventanas al frente",
|
||||
"minimize": "Minimizar",
|
||||
"title": "Ventana",
|
||||
"toggleFullscreen": "Alternar pantalla completa",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "افزودن",
|
||||
"actions.back": "بازگشت",
|
||||
"actions.cancel": "لغو",
|
||||
"actions.close": "بستن",
|
||||
"actions.confirm": "تأیید",
|
||||
"actions.delete": "حذف",
|
||||
"actions.edit": "ویرایش",
|
||||
"actions.more": "بیشتر",
|
||||
"actions.next": "مرحله بعد",
|
||||
"actions.ok": "تأیید",
|
||||
"actions.previous": "مرحله قبل",
|
||||
"actions.refresh": "بهروزرسانی",
|
||||
"actions.remove": "حذف",
|
||||
"actions.retry": "تلاش مجدد",
|
||||
"actions.save": "ذخیره",
|
||||
"actions.search": "جستجو",
|
||||
"actions.submit": "ارسال",
|
||||
"app.description": "پلتفرم همکاری دستیار هوش مصنوعی شما",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "خطا",
|
||||
"status.info": "اطلاعات",
|
||||
"status.loading": "در حال بارگذاری",
|
||||
"status.success": "موفق",
|
||||
"status.warning": "هشدار"
|
||||
}
|
||||
"actions": {
|
||||
"add": "افزودن",
|
||||
"back": "بازگشت",
|
||||
"cancel": "لغو",
|
||||
"close": "بستن",
|
||||
"confirm": "تأیید",
|
||||
"delete": "حذف",
|
||||
"edit": "ویرایش",
|
||||
"more": "بیشتر",
|
||||
"next": "مرحله بعد",
|
||||
"ok": "تأیید",
|
||||
"previous": "مرحله قبل",
|
||||
"refresh": "بهروزرسانی",
|
||||
"remove": "حذف",
|
||||
"retry": "تلاش مجدد",
|
||||
"save": "ذخیره",
|
||||
"search": "جستجو",
|
||||
"submit": "ارسال"
|
||||
},
|
||||
"app": {
|
||||
"description": "پلتفرم همکاری دستیار هوش مصنوعی شما",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "خطا",
|
||||
"info": "اطلاعات",
|
||||
"loading": "در حال بارگذاری",
|
||||
"success": "موفق",
|
||||
"warning": "هشدار"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "تأیید",
|
||||
"about.detail": "یک برنامه چت مبتنی بر مدلهای زبانی بزرگ",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "درباره",
|
||||
"confirm.cancel": "لغو",
|
||||
"confirm.no": "خیر",
|
||||
"confirm.title": "تأیید",
|
||||
"confirm.yes": "بله",
|
||||
"error.button": "تأیید",
|
||||
"error.detail": "در حین انجام عملیات خطایی رخ داده است، لطفاً بعداً دوباره تلاش کنید",
|
||||
"error.message": "خطا رخ داده است",
|
||||
"error.title": "خطا",
|
||||
"update.downloadAndInstall": "دانلود و نصب",
|
||||
"update.downloadComplete": "دانلود کامل شد",
|
||||
"update.downloadCompleteMessage": "بسته بهروزرسانی دانلود شده است، آیا میخواهید بلافاصله نصب کنید؟",
|
||||
"update.installLater": "نصب بعداً",
|
||||
"update.installNow": "نصب اکنون",
|
||||
"update.later": "یادآوری بعداً",
|
||||
"update.newVersion": "نسخه جدیدی پیدا شد",
|
||||
"update.newVersionAvailable": "نسخه جدید پیدا شد: {{version}}",
|
||||
"update.skipThisVersion": "این نسخه را نادیده بگیرید"
|
||||
}
|
||||
"about": {
|
||||
"button": "تأیید",
|
||||
"detail": "یک برنامه چت مبتنی بر مدلهای زبانی بزرگ",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "درباره"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "لغو",
|
||||
"no": "خیر",
|
||||
"title": "تأیید",
|
||||
"yes": "بله"
|
||||
},
|
||||
"error": {
|
||||
"button": "تأیید",
|
||||
"detail": "در حین انجام عملیات خطایی رخ داده است، لطفاً بعداً دوباره تلاش کنید",
|
||||
"message": "خطا رخ داده است",
|
||||
"title": "خطا"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "دانلود و نصب",
|
||||
"downloadComplete": "دانلود کامل شد",
|
||||
"downloadCompleteMessage": "بسته بهروزرسانی دانلود شده است، آیا میخواهید بلافاصله نصب کنید؟",
|
||||
"installLater": "نصب بعداً",
|
||||
"installNow": "نصب اکنون",
|
||||
"later": "یادآوری بعداً",
|
||||
"newVersion": "نسخه جدیدی پیدا شد",
|
||||
"newVersionAvailable": "نسخه جدید پیدا شد: {{version}}",
|
||||
"skipThisVersion": "این نسخه را نادیده بگیرید"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "بررسی بهروزرسانی...",
|
||||
"dev.devPanel": "پنل توسعهدهنده",
|
||||
"dev.devTools": "ابزارهای توسعهدهنده",
|
||||
"dev.forceReload": "بارگذاری اجباری",
|
||||
"dev.openStore": "باز کردن فایلهای ذخیره شده",
|
||||
"dev.refreshMenu": "بهروزرسانی منو",
|
||||
"dev.reload": "بارگذاری مجدد",
|
||||
"dev.title": "توسعه",
|
||||
"edit.copy": "کپی",
|
||||
"edit.cut": "برش",
|
||||
"edit.delete": "حذف",
|
||||
"edit.paste": "چسباندن",
|
||||
"edit.redo": "انجام مجدد",
|
||||
"edit.selectAll": "انتخاب همه",
|
||||
"edit.speech": "گفتار",
|
||||
"edit.startSpeaking": "شروع به خواندن",
|
||||
"edit.stopSpeaking": "متوقف کردن خواندن",
|
||||
"edit.title": "ویرایش",
|
||||
"edit.undo": "بازگشت",
|
||||
"file.preferences": "تنظیمات",
|
||||
"file.quit": "خروج",
|
||||
"file.title": "فایل",
|
||||
"help.about": "درباره",
|
||||
"help.githubRepo": "مخزن GitHub",
|
||||
"help.reportIssue": "گزارش مشکل",
|
||||
"help.title": "کمک",
|
||||
"help.visitWebsite": "بازدید از وبسایت",
|
||||
"macOS.about": "درباره {{appName}}",
|
||||
"macOS.devTools": "ابزارهای توسعهدهنده LobeHub",
|
||||
"macOS.hide": "پنهان کردن {{appName}}",
|
||||
"macOS.hideOthers": "پنهان کردن دیگران",
|
||||
"macOS.preferences": "تنظیمات...",
|
||||
"macOS.services": "خدمات",
|
||||
"macOS.unhide": "نمایش همه",
|
||||
"tray.open": "باز کردن {{appName}}",
|
||||
"tray.quit": "خروج",
|
||||
"tray.show": "نمایش {{appName}}",
|
||||
"view.forceReload": "بارگذاری اجباری",
|
||||
"view.reload": "بارگذاری مجدد",
|
||||
"view.resetZoom": "تنظیم زوم به حالت اولیه",
|
||||
"view.title": "نمایش",
|
||||
"view.toggleFullscreen": "تغییر به حالت تمام صفحه",
|
||||
"view.zoomIn": "بزرگنمایی",
|
||||
"view.zoomOut": "کوچکنمایی",
|
||||
"window.bringAllToFront": "همه پنجرهها را به جلو بیاورید",
|
||||
"window.close": "بستن",
|
||||
"window.front": "همه پنجرهها را به جلو بیاورید",
|
||||
"window.minimize": "کوچک کردن",
|
||||
"window.title": "پنجره",
|
||||
"window.toggleFullscreen": "تغییر به حالت تمام صفحه",
|
||||
"window.zoom": "زوم"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "بررسی بهروزرسانی..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "پنل توسعهدهنده",
|
||||
"devTools": "ابزارهای توسعهدهنده",
|
||||
"forceReload": "بارگذاری اجباری",
|
||||
"openStore": "باز کردن فایلهای ذخیره شده",
|
||||
"refreshMenu": "بهروزرسانی منو",
|
||||
"reload": "بارگذاری مجدد",
|
||||
"title": "توسعه"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "کپی",
|
||||
"cut": "برش",
|
||||
"delete": "حذف",
|
||||
"paste": "چسباندن",
|
||||
"redo": "انجام مجدد",
|
||||
"selectAll": "انتخاب همه",
|
||||
"speech": "گفتار",
|
||||
"startSpeaking": "شروع به خواندن",
|
||||
"stopSpeaking": "متوقف کردن خواندن",
|
||||
"title": "ویرایش",
|
||||
"undo": "بازگشت"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "تنظیمات",
|
||||
"quit": "خروج",
|
||||
"title": "فایل"
|
||||
},
|
||||
"help": {
|
||||
"about": "درباره",
|
||||
"githubRepo": "مخزن GitHub",
|
||||
"reportIssue": "گزارش مشکل",
|
||||
"title": "کمک",
|
||||
"visitWebsite": "بازدید از وبسایت"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "درباره {{appName}}",
|
||||
"devTools": "ابزارهای توسعهدهنده LobeHub",
|
||||
"hide": "پنهان کردن {{appName}}",
|
||||
"hideOthers": "پنهان کردن دیگران",
|
||||
"preferences": "تنظیمات...",
|
||||
"services": "خدمات",
|
||||
"unhide": "نمایش همه"
|
||||
},
|
||||
"tray": {
|
||||
"open": "باز کردن {{appName}}",
|
||||
"quit": "خروج",
|
||||
"show": "نمایش {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "بارگذاری اجباری",
|
||||
"reload": "بارگذاری مجدد",
|
||||
"resetZoom": "تنظیم زوم به حالت اولیه",
|
||||
"title": "نمایش",
|
||||
"toggleFullscreen": "تغییر به حالت تمام صفحه",
|
||||
"zoomIn": "بزرگنمایی",
|
||||
"zoomOut": "کوچکنمایی"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "همه پنجرهها را به جلو بیاورید",
|
||||
"close": "بستن",
|
||||
"front": "همه پنجرهها را به جلو بیاورید",
|
||||
"minimize": "کوچک کردن",
|
||||
"title": "پنجره",
|
||||
"toggleFullscreen": "تغییر به حالت تمام صفحه",
|
||||
"zoom": "زوم"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Ajouter",
|
||||
"actions.back": "Retour",
|
||||
"actions.cancel": "Annuler",
|
||||
"actions.close": "Fermer",
|
||||
"actions.confirm": "Confirmer",
|
||||
"actions.delete": "Supprimer",
|
||||
"actions.edit": "Éditer",
|
||||
"actions.more": "Plus",
|
||||
"actions.next": "Suivant",
|
||||
"actions.ok": "D'accord",
|
||||
"actions.previous": "Précédent",
|
||||
"actions.refresh": "Rafraîchir",
|
||||
"actions.remove": "Retirer",
|
||||
"actions.retry": "Réessayer",
|
||||
"actions.save": "Enregistrer",
|
||||
"actions.search": "Rechercher",
|
||||
"actions.submit": "Soumettre",
|
||||
"app.description": "Votre plateforme de collaboration avec l'assistant IA",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Erreur",
|
||||
"status.info": "Information",
|
||||
"status.loading": "Chargement",
|
||||
"status.success": "Succès",
|
||||
"status.warning": "Avertissement"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Ajouter",
|
||||
"back": "Retour",
|
||||
"cancel": "Annuler",
|
||||
"close": "Fermer",
|
||||
"confirm": "Confirmer",
|
||||
"delete": "Supprimer",
|
||||
"edit": "Éditer",
|
||||
"more": "Plus",
|
||||
"next": "Suivant",
|
||||
"ok": "D'accord",
|
||||
"previous": "Précédent",
|
||||
"refresh": "Rafraîchir",
|
||||
"remove": "Retirer",
|
||||
"retry": "Réessayer",
|
||||
"save": "Enregistrer",
|
||||
"search": "Rechercher",
|
||||
"submit": "Soumettre"
|
||||
},
|
||||
"app": {
|
||||
"description": "Votre plateforme de collaboration avec l'assistant IA",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Erreur",
|
||||
"info": "Information",
|
||||
"loading": "Chargement",
|
||||
"success": "Succès",
|
||||
"warning": "Avertissement"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "D'accord",
|
||||
"about.detail": "Une application de chat basée sur un grand modèle de langage",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "À propos",
|
||||
"confirm.cancel": "Annuler",
|
||||
"confirm.no": "Non",
|
||||
"confirm.title": "Confirmer",
|
||||
"confirm.yes": "Oui",
|
||||
"error.button": "D'accord",
|
||||
"error.detail": "Une erreur s'est produite lors de l'opération, veuillez réessayer plus tard",
|
||||
"error.message": "Une erreur s'est produite",
|
||||
"error.title": "Erreur",
|
||||
"update.downloadAndInstall": "Télécharger et installer",
|
||||
"update.downloadComplete": "Téléchargement terminé",
|
||||
"update.downloadCompleteMessage": "Le paquet de mise à jour a été téléchargé, souhaitez-vous l'installer maintenant ?",
|
||||
"update.installLater": "Installer plus tard",
|
||||
"update.installNow": "Installer maintenant",
|
||||
"update.later": "Rappeler plus tard",
|
||||
"update.newVersion": "Nouvelle version détectée",
|
||||
"update.newVersionAvailable": "Nouvelle version disponible : {{version}}",
|
||||
"update.skipThisVersion": "Ignorer cette version"
|
||||
}
|
||||
"about": {
|
||||
"button": "D'accord",
|
||||
"detail": "Une application de chat basée sur un grand modèle de langage",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "À propos"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Annuler",
|
||||
"no": "Non",
|
||||
"title": "Confirmer",
|
||||
"yes": "Oui"
|
||||
},
|
||||
"error": {
|
||||
"button": "D'accord",
|
||||
"detail": "Une erreur s'est produite lors de l'opération, veuillez réessayer plus tard",
|
||||
"message": "Une erreur s'est produite",
|
||||
"title": "Erreur"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Télécharger et installer",
|
||||
"downloadComplete": "Téléchargement terminé",
|
||||
"downloadCompleteMessage": "Le paquet de mise à jour a été téléchargé, souhaitez-vous l'installer maintenant ?",
|
||||
"installLater": "Installer plus tard",
|
||||
"installNow": "Installer maintenant",
|
||||
"later": "Rappeler plus tard",
|
||||
"newVersion": "Nouvelle version détectée",
|
||||
"newVersionAvailable": "Nouvelle version disponible : {{version}}",
|
||||
"skipThisVersion": "Ignorer cette version"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Vérifier les mises à jour...",
|
||||
"dev.devPanel": "Panneau de développement",
|
||||
"dev.devTools": "Outils de développement",
|
||||
"dev.forceReload": "Recharger de force",
|
||||
"dev.openStore": "Ouvrir le fichier de stockage",
|
||||
"dev.refreshMenu": "Rafraîchir le menu",
|
||||
"dev.reload": "Recharger",
|
||||
"dev.title": "Développement",
|
||||
"edit.copy": "Copier",
|
||||
"edit.cut": "Couper",
|
||||
"edit.delete": "Supprimer",
|
||||
"edit.paste": "Coller",
|
||||
"edit.redo": "Rétablir",
|
||||
"edit.selectAll": "Tout sélectionner",
|
||||
"edit.speech": "Voix",
|
||||
"edit.startSpeaking": "Commencer à lire",
|
||||
"edit.stopSpeaking": "Arrêter de lire",
|
||||
"edit.title": "Édition",
|
||||
"edit.undo": "Annuler",
|
||||
"file.preferences": "Préférences",
|
||||
"file.quit": "Quitter",
|
||||
"file.title": "Fichier",
|
||||
"help.about": "À propos",
|
||||
"help.githubRepo": "Dépôt GitHub",
|
||||
"help.reportIssue": "Signaler un problème",
|
||||
"help.title": "Aide",
|
||||
"help.visitWebsite": "Visiter le site officiel",
|
||||
"macOS.about": "À propos de {{appName}}",
|
||||
"macOS.devTools": "Outils de développement LobeHub",
|
||||
"macOS.hide": "Masquer {{appName}}",
|
||||
"macOS.hideOthers": "Masquer les autres",
|
||||
"macOS.preferences": "Préférences...",
|
||||
"macOS.services": "Services",
|
||||
"macOS.unhide": "Tout afficher",
|
||||
"tray.open": "Ouvrir {{appName}}",
|
||||
"tray.quit": "Quitter",
|
||||
"tray.show": "Afficher {{appName}}",
|
||||
"view.forceReload": "Recharger de force",
|
||||
"view.reload": "Recharger",
|
||||
"view.resetZoom": "Réinitialiser le zoom",
|
||||
"view.title": "Affichage",
|
||||
"view.toggleFullscreen": "Basculer en plein écran",
|
||||
"view.zoomIn": "Zoomer",
|
||||
"view.zoomOut": "Dézoomer",
|
||||
"window.bringAllToFront": "Mettre toutes les fenêtres au premier plan",
|
||||
"window.close": "Fermer",
|
||||
"window.front": "Mettre toutes les fenêtres au premier plan",
|
||||
"window.minimize": "Réduire",
|
||||
"window.title": "Fenêtre",
|
||||
"window.toggleFullscreen": "Basculer en plein écran",
|
||||
"window.zoom": "Zoom"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Vérifier les mises à jour..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Panneau de développement",
|
||||
"devTools": "Outils de développement",
|
||||
"forceReload": "Recharger de force",
|
||||
"openStore": "Ouvrir le fichier de stockage",
|
||||
"refreshMenu": "Rafraîchir le menu",
|
||||
"reload": "Recharger",
|
||||
"title": "Développement"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Copier",
|
||||
"cut": "Couper",
|
||||
"delete": "Supprimer",
|
||||
"paste": "Coller",
|
||||
"redo": "Rétablir",
|
||||
"selectAll": "Tout sélectionner",
|
||||
"speech": "Voix",
|
||||
"startSpeaking": "Commencer à lire",
|
||||
"stopSpeaking": "Arrêter de lire",
|
||||
"title": "Édition",
|
||||
"undo": "Annuler"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Préférences",
|
||||
"quit": "Quitter",
|
||||
"title": "Fichier"
|
||||
},
|
||||
"help": {
|
||||
"about": "À propos",
|
||||
"githubRepo": "Dépôt GitHub",
|
||||
"reportIssue": "Signaler un problème",
|
||||
"title": "Aide",
|
||||
"visitWebsite": "Visiter le site officiel"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "À propos de {{appName}}",
|
||||
"devTools": "Outils de développement LobeHub",
|
||||
"hide": "Masquer {{appName}}",
|
||||
"hideOthers": "Masquer les autres",
|
||||
"preferences": "Préférences...",
|
||||
"services": "Services",
|
||||
"unhide": "Tout afficher"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Ouvrir {{appName}}",
|
||||
"quit": "Quitter",
|
||||
"show": "Afficher {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Recharger de force",
|
||||
"reload": "Recharger",
|
||||
"resetZoom": "Réinitialiser le zoom",
|
||||
"title": "Affichage",
|
||||
"toggleFullscreen": "Basculer en plein écran",
|
||||
"zoomIn": "Zoomer",
|
||||
"zoomOut": "Dézoomer"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Mettre toutes les fenêtres au premier plan",
|
||||
"close": "Fermer",
|
||||
"front": "Mettre toutes les fenêtres au premier plan",
|
||||
"minimize": "Réduire",
|
||||
"title": "Fenêtre",
|
||||
"toggleFullscreen": "Basculer en plein écran",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Aggiungi",
|
||||
"actions.back": "Indietro",
|
||||
"actions.cancel": "Annulla",
|
||||
"actions.close": "Chiudi",
|
||||
"actions.confirm": "Conferma",
|
||||
"actions.delete": "Elimina",
|
||||
"actions.edit": "Modifica",
|
||||
"actions.more": "Di più",
|
||||
"actions.next": "Avanti",
|
||||
"actions.ok": "OK",
|
||||
"actions.previous": "Indietro",
|
||||
"actions.refresh": "Aggiorna",
|
||||
"actions.remove": "Rimuovi",
|
||||
"actions.retry": "Riprova",
|
||||
"actions.save": "Salva",
|
||||
"actions.search": "Cerca",
|
||||
"actions.submit": "Invia",
|
||||
"app.description": "La tua piattaforma di collaborazione con assistente AI",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Errore",
|
||||
"status.info": "Informazioni",
|
||||
"status.loading": "Caricamento in corso",
|
||||
"status.success": "Successo",
|
||||
"status.warning": "Avviso"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Aggiungi",
|
||||
"back": "Indietro",
|
||||
"cancel": "Annulla",
|
||||
"close": "Chiudi",
|
||||
"confirm": "Conferma",
|
||||
"delete": "Elimina",
|
||||
"edit": "Modifica",
|
||||
"more": "Di più",
|
||||
"next": "Avanti",
|
||||
"ok": "OK",
|
||||
"previous": "Indietro",
|
||||
"refresh": "Aggiorna",
|
||||
"remove": "Rimuovi",
|
||||
"retry": "Riprova",
|
||||
"save": "Salva",
|
||||
"search": "Cerca",
|
||||
"submit": "Invia"
|
||||
},
|
||||
"app": {
|
||||
"description": "La tua piattaforma di collaborazione con assistente AI",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Errore",
|
||||
"info": "Informazioni",
|
||||
"loading": "Caricamento in corso",
|
||||
"success": "Successo",
|
||||
"warning": "Avviso"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Conferma",
|
||||
"about.detail": "Un'app di chat basata su un grande modello linguistico",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Informazioni",
|
||||
"confirm.cancel": "Annulla",
|
||||
"confirm.no": "No",
|
||||
"confirm.title": "Conferma",
|
||||
"confirm.yes": "Sì",
|
||||
"error.button": "Conferma",
|
||||
"error.detail": "Si è verificato un errore durante l'operazione, riprovare più tardi",
|
||||
"error.message": "Si è verificato un errore",
|
||||
"error.title": "Errore",
|
||||
"update.downloadAndInstall": "Scarica e installa",
|
||||
"update.downloadComplete": "Download completato",
|
||||
"update.downloadCompleteMessage": "Il pacchetto di aggiornamento è stato scaricato, vuoi installarlo subito?",
|
||||
"update.installLater": "Installa più tardi",
|
||||
"update.installNow": "Installa ora",
|
||||
"update.later": "Promemoria più tardi",
|
||||
"update.newVersion": "Nuova versione disponibile",
|
||||
"update.newVersionAvailable": "Nuova versione trovata: {{version}}",
|
||||
"update.skipThisVersion": "Salta questa versione"
|
||||
}
|
||||
"about": {
|
||||
"button": "Conferma",
|
||||
"detail": "Un'app di chat basata su un grande modello linguistico",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Informazioni"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Annulla",
|
||||
"no": "No",
|
||||
"title": "Conferma",
|
||||
"yes": "Sì"
|
||||
},
|
||||
"error": {
|
||||
"button": "Conferma",
|
||||
"detail": "Si è verificato un errore durante l'operazione, riprovare più tardi",
|
||||
"message": "Si è verificato un errore",
|
||||
"title": "Errore"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Scarica e installa",
|
||||
"downloadComplete": "Download completato",
|
||||
"downloadCompleteMessage": "Il pacchetto di aggiornamento è stato scaricato, vuoi installarlo subito?",
|
||||
"installLater": "Installa più tardi",
|
||||
"installNow": "Installa ora",
|
||||
"later": "Promemoria più tardi",
|
||||
"newVersion": "Nuova versione disponibile",
|
||||
"newVersionAvailable": "Nuova versione trovata: {{version}}",
|
||||
"skipThisVersion": "Salta questa versione"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Controlla aggiornamenti...",
|
||||
"dev.devPanel": "Pannello sviluppatore",
|
||||
"dev.devTools": "Strumenti per sviluppatori",
|
||||
"dev.forceReload": "Ricarica forzata",
|
||||
"dev.openStore": "Apri il file di archiviazione",
|
||||
"dev.refreshMenu": "Aggiorna menu",
|
||||
"dev.reload": "Ricarica",
|
||||
"dev.title": "Sviluppo",
|
||||
"edit.copy": "Copia",
|
||||
"edit.cut": "Taglia",
|
||||
"edit.delete": "Elimina",
|
||||
"edit.paste": "Incolla",
|
||||
"edit.redo": "Ripeti",
|
||||
"edit.selectAll": "Seleziona tutto",
|
||||
"edit.speech": "Voce",
|
||||
"edit.startSpeaking": "Inizia a leggere",
|
||||
"edit.stopSpeaking": "Ferma la lettura",
|
||||
"edit.title": "Modifica",
|
||||
"edit.undo": "Annulla",
|
||||
"file.preferences": "Preferenze",
|
||||
"file.quit": "Esci",
|
||||
"file.title": "File",
|
||||
"help.about": "Informazioni",
|
||||
"help.githubRepo": "Repository GitHub",
|
||||
"help.reportIssue": "Segnala un problema",
|
||||
"help.title": "Aiuto",
|
||||
"help.visitWebsite": "Visita il sito ufficiale",
|
||||
"macOS.about": "Informazioni su {{appName}}",
|
||||
"macOS.devTools": "Strumenti per sviluppatori LobeHub",
|
||||
"macOS.hide": "Nascondi {{appName}}",
|
||||
"macOS.hideOthers": "Nascondi altri",
|
||||
"macOS.preferences": "Impostazioni...",
|
||||
"macOS.services": "Servizi",
|
||||
"macOS.unhide": "Mostra tutto",
|
||||
"tray.open": "Apri {{appName}}",
|
||||
"tray.quit": "Esci",
|
||||
"tray.show": "Mostra {{appName}}",
|
||||
"view.forceReload": "Ricarica forzata",
|
||||
"view.reload": "Ricarica",
|
||||
"view.resetZoom": "Reimposta zoom",
|
||||
"view.title": "Visualizza",
|
||||
"view.toggleFullscreen": "Attiva/disattiva schermo intero",
|
||||
"view.zoomIn": "Ingrandisci",
|
||||
"view.zoomOut": "Riduci",
|
||||
"window.bringAllToFront": "Porta tutte le finestre in primo piano",
|
||||
"window.close": "Chiudi",
|
||||
"window.front": "Porta tutte le finestre in primo piano",
|
||||
"window.minimize": "Minimizza",
|
||||
"window.title": "Finestra",
|
||||
"window.toggleFullscreen": "Attiva/disattiva schermo intero",
|
||||
"window.zoom": "Zoom"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Controlla aggiornamenti..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Pannello sviluppatore",
|
||||
"devTools": "Strumenti per sviluppatori",
|
||||
"forceReload": "Ricarica forzata",
|
||||
"openStore": "Apri il file di archiviazione",
|
||||
"refreshMenu": "Aggiorna menu",
|
||||
"reload": "Ricarica",
|
||||
"title": "Sviluppo"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Copia",
|
||||
"cut": "Taglia",
|
||||
"delete": "Elimina",
|
||||
"paste": "Incolla",
|
||||
"redo": "Ripeti",
|
||||
"selectAll": "Seleziona tutto",
|
||||
"speech": "Voce",
|
||||
"startSpeaking": "Inizia a leggere",
|
||||
"stopSpeaking": "Ferma la lettura",
|
||||
"title": "Modifica",
|
||||
"undo": "Annulla"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Preferenze",
|
||||
"quit": "Esci",
|
||||
"title": "File"
|
||||
},
|
||||
"help": {
|
||||
"about": "Informazioni",
|
||||
"githubRepo": "Repository GitHub",
|
||||
"reportIssue": "Segnala un problema",
|
||||
"title": "Aiuto",
|
||||
"visitWebsite": "Visita il sito ufficiale"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "Informazioni su {{appName}}",
|
||||
"devTools": "Strumenti per sviluppatori LobeHub",
|
||||
"hide": "Nascondi {{appName}}",
|
||||
"hideOthers": "Nascondi altri",
|
||||
"preferences": "Impostazioni...",
|
||||
"services": "Servizi",
|
||||
"unhide": "Mostra tutto"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Apri {{appName}}",
|
||||
"quit": "Esci",
|
||||
"show": "Mostra {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Ricarica forzata",
|
||||
"reload": "Ricarica",
|
||||
"resetZoom": "Reimposta zoom",
|
||||
"title": "Visualizza",
|
||||
"toggleFullscreen": "Attiva/disattiva schermo intero",
|
||||
"zoomIn": "Ingrandisci",
|
||||
"zoomOut": "Riduci"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Porta tutte le finestre in primo piano",
|
||||
"close": "Chiudi",
|
||||
"front": "Porta tutte le finestre in primo piano",
|
||||
"minimize": "Minimizza",
|
||||
"title": "Finestra",
|
||||
"toggleFullscreen": "Attiva/disattiva schermo intero",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "追加",
|
||||
"actions.back": "戻る",
|
||||
"actions.cancel": "キャンセル",
|
||||
"actions.close": "閉じる",
|
||||
"actions.confirm": "確認",
|
||||
"actions.delete": "削除",
|
||||
"actions.edit": "編集",
|
||||
"actions.more": "もっと見る",
|
||||
"actions.next": "次へ",
|
||||
"actions.ok": "OK",
|
||||
"actions.previous": "前へ",
|
||||
"actions.refresh": "更新",
|
||||
"actions.remove": "削除",
|
||||
"actions.retry": "再試行",
|
||||
"actions.save": "保存",
|
||||
"actions.search": "検索",
|
||||
"actions.submit": "送信",
|
||||
"app.description": "あなたのAIアシスタント協力プラットフォーム",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "エラー",
|
||||
"status.info": "情報",
|
||||
"status.loading": "読み込み中",
|
||||
"status.success": "成功",
|
||||
"status.warning": "警告"
|
||||
}
|
||||
"actions": {
|
||||
"add": "追加",
|
||||
"back": "戻る",
|
||||
"cancel": "キャンセル",
|
||||
"close": "閉じる",
|
||||
"confirm": "確認",
|
||||
"delete": "削除",
|
||||
"edit": "編集",
|
||||
"more": "もっと見る",
|
||||
"next": "次へ",
|
||||
"ok": "OK",
|
||||
"previous": "前へ",
|
||||
"refresh": "更新",
|
||||
"remove": "削除",
|
||||
"retry": "再試行",
|
||||
"save": "保存",
|
||||
"search": "検索",
|
||||
"submit": "送信"
|
||||
},
|
||||
"app": {
|
||||
"description": "あなたのAIアシスタント協力プラットフォーム",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "エラー",
|
||||
"info": "情報",
|
||||
"loading": "読み込み中",
|
||||
"success": "成功",
|
||||
"warning": "警告"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "確定",
|
||||
"about.detail": "大規模言語モデルに基づくチャットアプリ",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "について",
|
||||
"confirm.cancel": "キャンセル",
|
||||
"confirm.no": "いいえ",
|
||||
"confirm.title": "確認",
|
||||
"confirm.yes": "はい",
|
||||
"error.button": "確定",
|
||||
"error.detail": "操作中にエラーが発生しました。後で再試行してください。",
|
||||
"error.message": "エラーが発生しました",
|
||||
"error.title": "エラー",
|
||||
"update.downloadAndInstall": "ダウンロードしてインストール",
|
||||
"update.downloadComplete": "ダウンロード完了",
|
||||
"update.downloadCompleteMessage": "更新パッケージのダウンロードが完了しました。今すぐインストールしますか?",
|
||||
"update.installLater": "後でインストール",
|
||||
"update.installNow": "今すぐインストール",
|
||||
"update.later": "後でリマインド",
|
||||
"update.newVersion": "新しいバージョンが見つかりました",
|
||||
"update.newVersionAvailable": "新しいバージョンが見つかりました: {{version}}",
|
||||
"update.skipThisVersion": "このバージョンをスキップ"
|
||||
}
|
||||
"about": {
|
||||
"button": "確定",
|
||||
"detail": "大規模言語モデルに基づくチャットアプリ",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "について"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "キャンセル",
|
||||
"no": "いいえ",
|
||||
"title": "確認",
|
||||
"yes": "はい"
|
||||
},
|
||||
"error": {
|
||||
"button": "確定",
|
||||
"detail": "操作中にエラーが発生しました。後で再試行してください。",
|
||||
"message": "エラーが発生しました",
|
||||
"title": "エラー"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "ダウンロードしてインストール",
|
||||
"downloadComplete": "ダウンロード完了",
|
||||
"downloadCompleteMessage": "更新パッケージのダウンロードが完了しました。今すぐインストールしますか?",
|
||||
"installLater": "後でインストール",
|
||||
"installNow": "今すぐインストール",
|
||||
"later": "後でリマインド",
|
||||
"newVersion": "新しいバージョンが見つかりました",
|
||||
"newVersionAvailable": "新しいバージョンが見つかりました: {{version}}",
|
||||
"skipThisVersion": "このバージョンをスキップ"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "更新を確認しています...",
|
||||
"dev.devPanel": "開発者パネル",
|
||||
"dev.devTools": "開発者ツール",
|
||||
"dev.forceReload": "強制再読み込み",
|
||||
"dev.openStore": "ストレージファイルを開く",
|
||||
"dev.refreshMenu": "メニューを更新",
|
||||
"dev.reload": "再読み込み",
|
||||
"dev.title": "開発",
|
||||
"edit.copy": "コピー",
|
||||
"edit.cut": "切り取り",
|
||||
"edit.delete": "削除",
|
||||
"edit.paste": "貼り付け",
|
||||
"edit.redo": "やり直し",
|
||||
"edit.selectAll": "すべて選択",
|
||||
"edit.speech": "音声",
|
||||
"edit.startSpeaking": "読み上げ開始",
|
||||
"edit.stopSpeaking": "読み上げ停止",
|
||||
"edit.title": "編集",
|
||||
"edit.undo": "元に戻す",
|
||||
"file.preferences": "設定",
|
||||
"file.quit": "終了",
|
||||
"file.title": "ファイル",
|
||||
"help.about": "について",
|
||||
"help.githubRepo": "GitHub リポジトリ",
|
||||
"help.reportIssue": "問題を報告",
|
||||
"help.title": "ヘルプ",
|
||||
"help.visitWebsite": "公式ウェブサイトを訪問",
|
||||
"macOS.about": "{{appName}} について",
|
||||
"macOS.devTools": "LobeHub 開発者ツール",
|
||||
"macOS.hide": "{{appName}} を隠す",
|
||||
"macOS.hideOthers": "他を隠す",
|
||||
"macOS.preferences": "環境設定...",
|
||||
"macOS.services": "サービス",
|
||||
"macOS.unhide": "すべて表示",
|
||||
"tray.open": "{{appName}} を開く",
|
||||
"tray.quit": "終了",
|
||||
"tray.show": "{{appName}} を表示",
|
||||
"view.forceReload": "強制再読み込み",
|
||||
"view.reload": "再読み込み",
|
||||
"view.resetZoom": "ズームをリセット",
|
||||
"view.title": "ビュー",
|
||||
"view.toggleFullscreen": "フルスクリーン切替",
|
||||
"view.zoomIn": "ズームイン",
|
||||
"view.zoomOut": "ズームアウト",
|
||||
"window.bringAllToFront": "すべてのウィンドウを前面に",
|
||||
"window.close": "閉じる",
|
||||
"window.front": "すべてのウィンドウを前面に",
|
||||
"window.minimize": "最小化",
|
||||
"window.title": "ウィンドウ",
|
||||
"window.toggleFullscreen": "フルスクリーン切替",
|
||||
"window.zoom": "ズーム"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "更新を確認しています..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "開発者パネル",
|
||||
"devTools": "開発者ツール",
|
||||
"forceReload": "強制再読み込み",
|
||||
"openStore": "ストレージファイルを開く",
|
||||
"refreshMenu": "メニューを更新",
|
||||
"reload": "再読み込み",
|
||||
"title": "開発"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "コピー",
|
||||
"cut": "切り取り",
|
||||
"delete": "削除",
|
||||
"paste": "貼り付け",
|
||||
"redo": "やり直し",
|
||||
"selectAll": "すべて選択",
|
||||
"speech": "音声",
|
||||
"startSpeaking": "読み上げ開始",
|
||||
"stopSpeaking": "読み上げ停止",
|
||||
"title": "編集",
|
||||
"undo": "元に戻す"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "設定",
|
||||
"quit": "終了",
|
||||
"title": "ファイル"
|
||||
},
|
||||
"help": {
|
||||
"about": "について",
|
||||
"githubRepo": "GitHub リポジトリ",
|
||||
"reportIssue": "問題を報告",
|
||||
"title": "ヘルプ",
|
||||
"visitWebsite": "公式ウェブサイトを訪問"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "{{appName}} について",
|
||||
"devTools": "LobeHub 開発者ツール",
|
||||
"hide": "{{appName}} を隠す",
|
||||
"hideOthers": "他を隠す",
|
||||
"preferences": "環境設定...",
|
||||
"services": "サービス",
|
||||
"unhide": "すべて表示"
|
||||
},
|
||||
"tray": {
|
||||
"open": "{{appName}} を開く",
|
||||
"quit": "終了",
|
||||
"show": "{{appName}} を表示"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "強制再読み込み",
|
||||
"reload": "再読み込み",
|
||||
"resetZoom": "ズームをリセット",
|
||||
"title": "ビュー",
|
||||
"toggleFullscreen": "フルスクリーン切替",
|
||||
"zoomIn": "ズームイン",
|
||||
"zoomOut": "ズームアウト"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "すべてのウィンドウを前面に",
|
||||
"close": "閉じる",
|
||||
"front": "すべてのウィンドウを前面に",
|
||||
"minimize": "最小化",
|
||||
"title": "ウィンドウ",
|
||||
"toggleFullscreen": "フルスクリーン切替",
|
||||
"zoom": "ズーム"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "추가",
|
||||
"actions.back": "뒤로",
|
||||
"actions.cancel": "취소",
|
||||
"actions.close": "닫기",
|
||||
"actions.confirm": "확인",
|
||||
"actions.delete": "삭제",
|
||||
"actions.edit": "편집",
|
||||
"actions.more": "더보기",
|
||||
"actions.next": "다음",
|
||||
"actions.ok": "확인",
|
||||
"actions.previous": "이전",
|
||||
"actions.refresh": "새로 고침",
|
||||
"actions.remove": "제거",
|
||||
"actions.retry": "다시 시도",
|
||||
"actions.save": "저장",
|
||||
"actions.search": "검색",
|
||||
"actions.submit": "제출",
|
||||
"app.description": "당신의 AI 비서 협업 플랫폼",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "오류",
|
||||
"status.info": "정보",
|
||||
"status.loading": "로딩 중",
|
||||
"status.success": "성공",
|
||||
"status.warning": "경고"
|
||||
}
|
||||
"actions": {
|
||||
"add": "추가",
|
||||
"back": "뒤로",
|
||||
"cancel": "취소",
|
||||
"close": "닫기",
|
||||
"confirm": "확인",
|
||||
"delete": "삭제",
|
||||
"edit": "편집",
|
||||
"more": "더보기",
|
||||
"next": "다음",
|
||||
"ok": "확인",
|
||||
"previous": "이전",
|
||||
"refresh": "새로 고침",
|
||||
"remove": "제거",
|
||||
"retry": "다시 시도",
|
||||
"save": "저장",
|
||||
"search": "검색",
|
||||
"submit": "제출"
|
||||
},
|
||||
"app": {
|
||||
"description": "당신의 AI 비서 협업 플랫폼",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "오류",
|
||||
"info": "정보",
|
||||
"loading": "로딩 중",
|
||||
"success": "성공",
|
||||
"warning": "경고"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "확인",
|
||||
"about.detail": "대형 언어 모델 기반의 채팅 애플리케이션",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "정보",
|
||||
"confirm.cancel": "취소",
|
||||
"confirm.no": "아니요",
|
||||
"confirm.title": "확인",
|
||||
"confirm.yes": "예",
|
||||
"error.button": "확인",
|
||||
"error.detail": "작업 중 오류가 발생했습니다. 나중에 다시 시도해 주세요.",
|
||||
"error.message": "오류 발생",
|
||||
"error.title": "오류",
|
||||
"update.downloadAndInstall": "다운로드 및 설치",
|
||||
"update.downloadComplete": "다운로드 완료",
|
||||
"update.downloadCompleteMessage": "업데이트 패키지가 다운로드 완료되었습니다. 지금 설치하시겠습니까?",
|
||||
"update.installLater": "나중에 설치",
|
||||
"update.installNow": "지금 설치",
|
||||
"update.later": "나중에 알림",
|
||||
"update.newVersion": "새 버전 발견",
|
||||
"update.newVersionAvailable": "새 버전 발견: {{version}}",
|
||||
"update.skipThisVersion": "이 버전 건너뛰기"
|
||||
}
|
||||
"about": {
|
||||
"button": "확인",
|
||||
"detail": "대형 언어 모델 기반의 채팅 애플리케이션",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "정보"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "취소",
|
||||
"no": "아니요",
|
||||
"title": "확인",
|
||||
"yes": "예"
|
||||
},
|
||||
"error": {
|
||||
"button": "확인",
|
||||
"detail": "작업 중 오류가 발생했습니다. 나중에 다시 시도해 주세요.",
|
||||
"message": "오류 발생",
|
||||
"title": "오류"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "다운로드 및 설치",
|
||||
"downloadComplete": "다운로드 완료",
|
||||
"downloadCompleteMessage": "업데이트 패키지가 다운로드 완료되었습니다. 지금 설치하시겠습니까?",
|
||||
"installLater": "나중에 설치",
|
||||
"installNow": "지금 설치",
|
||||
"later": "나중에 알림",
|
||||
"newVersion": "새 버전 발견",
|
||||
"newVersionAvailable": "새 버전 발견: {{version}}",
|
||||
"skipThisVersion": "이 버전 건너뛰기"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "업데이트 확인 중...",
|
||||
"dev.devPanel": "개발자 패널",
|
||||
"dev.devTools": "개발자 도구",
|
||||
"dev.forceReload": "강제 새로 고침",
|
||||
"dev.openStore": "저장 파일 열기",
|
||||
"dev.refreshMenu": "메뉴 새로 고침",
|
||||
"dev.reload": "새로 고침",
|
||||
"dev.title": "개발",
|
||||
"edit.copy": "복사",
|
||||
"edit.cut": "잘라내기",
|
||||
"edit.delete": "삭제",
|
||||
"edit.paste": "붙여넣기",
|
||||
"edit.redo": "다시 실행",
|
||||
"edit.selectAll": "모두 선택",
|
||||
"edit.speech": "음성",
|
||||
"edit.startSpeaking": "읽기 시작",
|
||||
"edit.stopSpeaking": "읽기 중지",
|
||||
"edit.title": "편집",
|
||||
"edit.undo": "실행 취소",
|
||||
"file.preferences": "환경 설정",
|
||||
"file.quit": "종료",
|
||||
"file.title": "파일",
|
||||
"help.about": "정보",
|
||||
"help.githubRepo": "GitHub 저장소",
|
||||
"help.reportIssue": "문제 보고",
|
||||
"help.title": "도움말",
|
||||
"help.visitWebsite": "웹사이트 방문",
|
||||
"macOS.about": "{{appName}} 정보",
|
||||
"macOS.devTools": "LobeHub 개발자 도구",
|
||||
"macOS.hide": "{{appName}} 숨기기",
|
||||
"macOS.hideOthers": "다른 것 숨기기",
|
||||
"macOS.preferences": "환경 설정...",
|
||||
"macOS.services": "서비스",
|
||||
"macOS.unhide": "모두 표시",
|
||||
"tray.open": "{{appName}} 열기",
|
||||
"tray.quit": "종료",
|
||||
"tray.show": "{{appName}} 표시",
|
||||
"view.forceReload": "강제 새로 고침",
|
||||
"view.reload": "새로 고침",
|
||||
"view.resetZoom": "줌 초기화",
|
||||
"view.title": "보기",
|
||||
"view.toggleFullscreen": "전체 화면 전환",
|
||||
"view.zoomIn": "확대",
|
||||
"view.zoomOut": "축소",
|
||||
"window.bringAllToFront": "모든 창 앞으로 가져오기",
|
||||
"window.close": "닫기",
|
||||
"window.front": "모든 창 앞으로 가져오기",
|
||||
"window.minimize": "최소화",
|
||||
"window.title": "창",
|
||||
"window.toggleFullscreen": "전체 화면 전환",
|
||||
"window.zoom": "줌"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "업데이트 확인 중..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "개발자 패널",
|
||||
"devTools": "개발자 도구",
|
||||
"forceReload": "강제 새로 고침",
|
||||
"openStore": "저장 파일 열기",
|
||||
"refreshMenu": "메뉴 새로 고침",
|
||||
"reload": "새로 고침",
|
||||
"title": "개발"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "복사",
|
||||
"cut": "잘라내기",
|
||||
"delete": "삭제",
|
||||
"paste": "붙여넣기",
|
||||
"redo": "다시 실행",
|
||||
"selectAll": "모두 선택",
|
||||
"speech": "음성",
|
||||
"startSpeaking": "읽기 시작",
|
||||
"stopSpeaking": "읽기 중지",
|
||||
"title": "편집",
|
||||
"undo": "실행 취소"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "환경 설정",
|
||||
"quit": "종료",
|
||||
"title": "파일"
|
||||
},
|
||||
"help": {
|
||||
"about": "정보",
|
||||
"githubRepo": "GitHub 저장소",
|
||||
"reportIssue": "문제 보고",
|
||||
"title": "도움말",
|
||||
"visitWebsite": "웹사이트 방문"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "{{appName}} 정보",
|
||||
"devTools": "LobeHub 개발자 도구",
|
||||
"hide": "{{appName}} 숨기기",
|
||||
"hideOthers": "다른 것 숨기기",
|
||||
"preferences": "환경 설정...",
|
||||
"services": "서비스",
|
||||
"unhide": "모두 표시"
|
||||
},
|
||||
"tray": {
|
||||
"open": "{{appName}} 열기",
|
||||
"quit": "종료",
|
||||
"show": "{{appName}} 표시"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "강제 새로 고침",
|
||||
"reload": "새로 고침",
|
||||
"resetZoom": "줌 초기화",
|
||||
"title": "보기",
|
||||
"toggleFullscreen": "전체 화면 전환",
|
||||
"zoomIn": "확대",
|
||||
"zoomOut": "축소"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "모든 창 앞으로 가져오기",
|
||||
"close": "닫기",
|
||||
"front": "모든 창 앞으로 가져오기",
|
||||
"minimize": "최소화",
|
||||
"title": "창",
|
||||
"toggleFullscreen": "전체 화면 전환",
|
||||
"zoom": "줌"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Toevoegen",
|
||||
"actions.back": "Terug",
|
||||
"actions.cancel": "Annuleren",
|
||||
"actions.close": "Sluiten",
|
||||
"actions.confirm": "Bevestigen",
|
||||
"actions.delete": "Verwijderen",
|
||||
"actions.edit": "Bewerken",
|
||||
"actions.more": "Meer",
|
||||
"actions.next": "Volgende stap",
|
||||
"actions.ok": "OK",
|
||||
"actions.previous": "Vorige stap",
|
||||
"actions.refresh": "Vernieuwen",
|
||||
"actions.remove": "Verwijderen",
|
||||
"actions.retry": "Opnieuw proberen",
|
||||
"actions.save": "Opslaan",
|
||||
"actions.search": "Zoeken",
|
||||
"actions.submit": "Indienen",
|
||||
"app.description": "Jouw AI-assistent samenwerkingsplatform",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Fout",
|
||||
"status.info": "Informatie",
|
||||
"status.loading": "Laden",
|
||||
"status.success": "Succes",
|
||||
"status.warning": "Waarschuwing"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Toevoegen",
|
||||
"back": "Terug",
|
||||
"cancel": "Annuleren",
|
||||
"close": "Sluiten",
|
||||
"confirm": "Bevestigen",
|
||||
"delete": "Verwijderen",
|
||||
"edit": "Bewerken",
|
||||
"more": "Meer",
|
||||
"next": "Volgende stap",
|
||||
"ok": "OK",
|
||||
"previous": "Vorige stap",
|
||||
"refresh": "Vernieuwen",
|
||||
"remove": "Verwijderen",
|
||||
"retry": "Opnieuw proberen",
|
||||
"save": "Opslaan",
|
||||
"search": "Zoeken",
|
||||
"submit": "Indienen"
|
||||
},
|
||||
"app": {
|
||||
"description": "Jouw AI-assistent samenwerkingsplatform",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Fout",
|
||||
"info": "Informatie",
|
||||
"loading": "Laden",
|
||||
"success": "Succes",
|
||||
"warning": "Waarschuwing"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Bevestigen",
|
||||
"about.detail": "Een chatapplicatie gebaseerd op een groot taalmodel",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Over",
|
||||
"confirm.cancel": "Annuleren",
|
||||
"confirm.no": "Nee",
|
||||
"confirm.title": "Bevestigen",
|
||||
"confirm.yes": "Ja",
|
||||
"error.button": "Bevestigen",
|
||||
"error.detail": "Er is een fout opgetreden tijdens de operatie, probeer het later opnieuw",
|
||||
"error.message": "Er is een fout opgetreden",
|
||||
"error.title": "Fout",
|
||||
"update.downloadAndInstall": "Downloaden en installeren",
|
||||
"update.downloadComplete": "Download voltooid",
|
||||
"update.downloadCompleteMessage": "Het updatepakket is gedownload, wilt u het nu installeren?",
|
||||
"update.installLater": "Later installeren",
|
||||
"update.installNow": "Nu installeren",
|
||||
"update.later": "Later herinneren",
|
||||
"update.newVersion": "Nieuwe versie gevonden",
|
||||
"update.newVersionAvailable": "Nieuwe versie beschikbaar: {{version}}",
|
||||
"update.skipThisVersion": "Deze versie overslaan"
|
||||
}
|
||||
"about": {
|
||||
"button": "Bevestigen",
|
||||
"detail": "Een chatapplicatie gebaseerd op een groot taalmodel",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Over"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Annuleren",
|
||||
"no": "Nee",
|
||||
"title": "Bevestigen",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"error": {
|
||||
"button": "Bevestigen",
|
||||
"detail": "Er is een fout opgetreden tijdens de operatie, probeer het later opnieuw",
|
||||
"message": "Er is een fout opgetreden",
|
||||
"title": "Fout"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Downloaden en installeren",
|
||||
"downloadComplete": "Download voltooid",
|
||||
"downloadCompleteMessage": "Het updatepakket is gedownload, wilt u het nu installeren?",
|
||||
"installLater": "Later installeren",
|
||||
"installNow": "Nu installeren",
|
||||
"later": "Later herinneren",
|
||||
"newVersion": "Nieuwe versie gevonden",
|
||||
"newVersionAvailable": "Nieuwe versie beschikbaar: {{version}}",
|
||||
"skipThisVersion": "Deze versie overslaan"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Updates controleren...",
|
||||
"dev.devPanel": "Ontwikkelaarspaneel",
|
||||
"dev.devTools": "Ontwikkelaarstools",
|
||||
"dev.forceReload": "Forceer herladen",
|
||||
"dev.openStore": "Open opslagbestand",
|
||||
"dev.refreshMenu": "Menu verversen",
|
||||
"dev.reload": "Herladen",
|
||||
"dev.title": "Ontwikkeling",
|
||||
"edit.copy": "Kopiëren",
|
||||
"edit.cut": "Knippen",
|
||||
"edit.delete": "Verwijderen",
|
||||
"edit.paste": "Plakken",
|
||||
"edit.redo": "Opnieuw doen",
|
||||
"edit.selectAll": "Alles selecteren",
|
||||
"edit.speech": "Spraak",
|
||||
"edit.startSpeaking": "Begin met voorlezen",
|
||||
"edit.stopSpeaking": "Stop met voorlezen",
|
||||
"edit.title": "Bewerken",
|
||||
"edit.undo": "Ongedaan maken",
|
||||
"file.preferences": "Voorkeuren",
|
||||
"file.quit": "Afsluiten",
|
||||
"file.title": "Bestand",
|
||||
"help.about": "Over",
|
||||
"help.githubRepo": "GitHub-repo",
|
||||
"help.reportIssue": "Probleem melden",
|
||||
"help.title": "Hulp",
|
||||
"help.visitWebsite": "Bezoek de website",
|
||||
"macOS.about": "Over {{appName}}",
|
||||
"macOS.devTools": "LobeHub Ontwikkelaarstools",
|
||||
"macOS.hide": "Verberg {{appName}}",
|
||||
"macOS.hideOthers": "Verberg anderen",
|
||||
"macOS.preferences": "Voorkeuren...",
|
||||
"macOS.services": "Diensten",
|
||||
"macOS.unhide": "Toon alles",
|
||||
"tray.open": "Open {{appName}}",
|
||||
"tray.quit": "Afsluiten",
|
||||
"tray.show": "Toon {{appName}}",
|
||||
"view.forceReload": "Forceer herladen",
|
||||
"view.reload": "Herladen",
|
||||
"view.resetZoom": "Zoom resetten",
|
||||
"view.title": "Weergave",
|
||||
"view.toggleFullscreen": "Schakel volledig scherm in/uit",
|
||||
"view.zoomIn": "Inzoomen",
|
||||
"view.zoomOut": "Uitzoomen",
|
||||
"window.bringAllToFront": "Breng alle vensters naar voren",
|
||||
"window.close": "Sluiten",
|
||||
"window.front": "Breng alle vensters naar voren",
|
||||
"window.minimize": "Minimaliseren",
|
||||
"window.title": "Venster",
|
||||
"window.toggleFullscreen": "Schakel volledig scherm in/uit",
|
||||
"window.zoom": "Inzoomen"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Updates controleren..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Ontwikkelaarspaneel",
|
||||
"devTools": "Ontwikkelaarstools",
|
||||
"forceReload": "Forceer herladen",
|
||||
"openStore": "Open opslagbestand",
|
||||
"refreshMenu": "Menu verversen",
|
||||
"reload": "Herladen",
|
||||
"title": "Ontwikkeling"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Kopiëren",
|
||||
"cut": "Knippen",
|
||||
"delete": "Verwijderen",
|
||||
"paste": "Plakken",
|
||||
"redo": "Opnieuw doen",
|
||||
"selectAll": "Alles selecteren",
|
||||
"speech": "Spraak",
|
||||
"startSpeaking": "Begin met voorlezen",
|
||||
"stopSpeaking": "Stop met voorlezen",
|
||||
"title": "Bewerken",
|
||||
"undo": "Ongedaan maken"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Voorkeuren",
|
||||
"quit": "Afsluiten",
|
||||
"title": "Bestand"
|
||||
},
|
||||
"help": {
|
||||
"about": "Over",
|
||||
"githubRepo": "GitHub-repo",
|
||||
"reportIssue": "Probleem melden",
|
||||
"title": "Hulp",
|
||||
"visitWebsite": "Bezoek de website"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "Over {{appName}}",
|
||||
"devTools": "LobeHub Ontwikkelaarstools",
|
||||
"hide": "Verberg {{appName}}",
|
||||
"hideOthers": "Verberg anderen",
|
||||
"preferences": "Voorkeuren...",
|
||||
"services": "Diensten",
|
||||
"unhide": "Toon alles"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Open {{appName}}",
|
||||
"quit": "Afsluiten",
|
||||
"show": "Toon {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Forceer herladen",
|
||||
"reload": "Herladen",
|
||||
"resetZoom": "Zoom resetten",
|
||||
"title": "Weergave",
|
||||
"toggleFullscreen": "Schakel volledig scherm in/uit",
|
||||
"zoomIn": "Inzoomen",
|
||||
"zoomOut": "Uitzoomen"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Breng alle vensters naar voren",
|
||||
"close": "Sluiten",
|
||||
"front": "Breng alle vensters naar voren",
|
||||
"minimize": "Minimaliseren",
|
||||
"title": "Venster",
|
||||
"toggleFullscreen": "Schakel volledig scherm in/uit",
|
||||
"zoom": "Inzoomen"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Dodaj",
|
||||
"actions.back": "Wstecz",
|
||||
"actions.cancel": "Anuluj",
|
||||
"actions.close": "Zamknij",
|
||||
"actions.confirm": "Potwierdź",
|
||||
"actions.delete": "Usuń",
|
||||
"actions.edit": "Edytuj",
|
||||
"actions.more": "Więcej",
|
||||
"actions.next": "Dalej",
|
||||
"actions.ok": "OK",
|
||||
"actions.previous": "Cofnij",
|
||||
"actions.refresh": "Odśwież",
|
||||
"actions.remove": "Usuń",
|
||||
"actions.retry": "Spróbuj ponownie",
|
||||
"actions.save": "Zapisz",
|
||||
"actions.search": "Szukaj",
|
||||
"actions.submit": "Wyślij",
|
||||
"app.description": "Twoja platforma współpracy z asystentem AI",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Błąd",
|
||||
"status.info": "Informacja",
|
||||
"status.loading": "Ładowanie",
|
||||
"status.success": "Sukces",
|
||||
"status.warning": "Ostrzeżenie"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Dodaj",
|
||||
"back": "Wstecz",
|
||||
"cancel": "Anuluj",
|
||||
"close": "Zamknij",
|
||||
"confirm": "Potwierdź",
|
||||
"delete": "Usuń",
|
||||
"edit": "Edytuj",
|
||||
"more": "Więcej",
|
||||
"next": "Dalej",
|
||||
"ok": "OK",
|
||||
"previous": "Cofnij",
|
||||
"refresh": "Odśwież",
|
||||
"remove": "Usuń",
|
||||
"retry": "Spróbuj ponownie",
|
||||
"save": "Zapisz",
|
||||
"search": "Szukaj",
|
||||
"submit": "Wyślij"
|
||||
},
|
||||
"app": {
|
||||
"description": "Twoja platforma współpracy z asystentem AI",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Błąd",
|
||||
"info": "Informacja",
|
||||
"loading": "Ładowanie",
|
||||
"success": "Sukces",
|
||||
"warning": "Ostrzeżenie"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "OK",
|
||||
"about.detail": "Aplikacja czatu oparta na dużym modelu językowym",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "O aplikacji",
|
||||
"confirm.cancel": "Anuluj",
|
||||
"confirm.no": "Nie",
|
||||
"confirm.title": "Potwierdzenie",
|
||||
"confirm.yes": "Tak",
|
||||
"error.button": "OK",
|
||||
"error.detail": "Wystąpił błąd podczas operacji, spróbuj ponownie później",
|
||||
"error.message": "Wystąpił błąd",
|
||||
"error.title": "Błąd",
|
||||
"update.downloadAndInstall": "Pobierz i zainstaluj",
|
||||
"update.downloadComplete": "Pobieranie zakończone",
|
||||
"update.downloadCompleteMessage": "Pakiet aktualizacji został pobrany, czy chcesz go teraz zainstalować?",
|
||||
"update.installLater": "Zainstaluj później",
|
||||
"update.installNow": "Zainstaluj teraz",
|
||||
"update.later": "Przypomnij później",
|
||||
"update.newVersion": "Nowa wersja dostępna",
|
||||
"update.newVersionAvailable": "Znaleziono nową wersję: {{version}}",
|
||||
"update.skipThisVersion": "Pomiń tę wersję"
|
||||
}
|
||||
"about": {
|
||||
"button": "OK",
|
||||
"detail": "Aplikacja czatu oparta na dużym modelu językowym",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "O aplikacji"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Anuluj",
|
||||
"no": "Nie",
|
||||
"title": "Potwierdzenie",
|
||||
"yes": "Tak"
|
||||
},
|
||||
"error": {
|
||||
"button": "OK",
|
||||
"detail": "Wystąpił błąd podczas operacji, spróbuj ponownie później",
|
||||
"message": "Wystąpił błąd",
|
||||
"title": "Błąd"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Pobierz i zainstaluj",
|
||||
"downloadComplete": "Pobieranie zakończone",
|
||||
"downloadCompleteMessage": "Pakiet aktualizacji został pobrany, czy chcesz go teraz zainstalować?",
|
||||
"installLater": "Zainstaluj później",
|
||||
"installNow": "Zainstaluj teraz",
|
||||
"later": "Przypomnij później",
|
||||
"newVersion": "Nowa wersja dostępna",
|
||||
"newVersionAvailable": "Znaleziono nową wersję: {{version}}",
|
||||
"skipThisVersion": "Pomiń tę wersję"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Sprawdzanie aktualizacji...",
|
||||
"dev.devPanel": "Panel dewelopera",
|
||||
"dev.devTools": "Narzędzia dewelopera",
|
||||
"dev.forceReload": "Wymuś ponowne załadowanie",
|
||||
"dev.openStore": "Otwórz plik magazynu",
|
||||
"dev.refreshMenu": "Odśwież menu",
|
||||
"dev.reload": "Przeładuj",
|
||||
"dev.title": "Rozwój",
|
||||
"edit.copy": "Kopiuj",
|
||||
"edit.cut": "Wytnij",
|
||||
"edit.delete": "Usuń",
|
||||
"edit.paste": "Wklej",
|
||||
"edit.redo": "Ponów",
|
||||
"edit.selectAll": "Zaznacz wszystko",
|
||||
"edit.speech": "Mowa",
|
||||
"edit.startSpeaking": "Rozpocznij czytanie",
|
||||
"edit.stopSpeaking": "Zatrzymaj czytanie",
|
||||
"edit.title": "Edycja",
|
||||
"edit.undo": "Cofnij",
|
||||
"file.preferences": "Preferencje",
|
||||
"file.quit": "Zakończ",
|
||||
"file.title": "Plik",
|
||||
"help.about": "O",
|
||||
"help.githubRepo": "Repozytorium GitHub",
|
||||
"help.reportIssue": "Zgłoś problem",
|
||||
"help.title": "Pomoc",
|
||||
"help.visitWebsite": "Odwiedź stronę internetową",
|
||||
"macOS.about": "O {{appName}}",
|
||||
"macOS.devTools": "Narzędzia dewelopera LobeHub",
|
||||
"macOS.hide": "Ukryj {{appName}}",
|
||||
"macOS.hideOthers": "Ukryj inne",
|
||||
"macOS.preferences": "Ustawienia...",
|
||||
"macOS.services": "Usługi",
|
||||
"macOS.unhide": "Pokaż wszystko",
|
||||
"tray.open": "Otwórz {{appName}}",
|
||||
"tray.quit": "Zakończ",
|
||||
"tray.show": "Pokaż {{appName}}",
|
||||
"view.forceReload": "Wymuś ponowne załadowanie",
|
||||
"view.reload": "Przeładuj",
|
||||
"view.resetZoom": "Zresetuj powiększenie",
|
||||
"view.title": "Widok",
|
||||
"view.toggleFullscreen": "Przełącz tryb pełnoekranowy",
|
||||
"view.zoomIn": "Powiększ",
|
||||
"view.zoomOut": "Pomniejsz",
|
||||
"window.bringAllToFront": "Przenieś wszystkie okna na wierzch",
|
||||
"window.close": "Zamknij",
|
||||
"window.front": "Przenieś wszystkie okna na wierzch",
|
||||
"window.minimize": "Zminimalizuj",
|
||||
"window.title": "Okno",
|
||||
"window.toggleFullscreen": "Przełącz tryb pełnoekranowy",
|
||||
"window.zoom": "Powiększenie"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Sprawdzanie aktualizacji..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Panel dewelopera",
|
||||
"devTools": "Narzędzia dewelopera",
|
||||
"forceReload": "Wymuś ponowne załadowanie",
|
||||
"openStore": "Otwórz plik magazynu",
|
||||
"refreshMenu": "Odśwież menu",
|
||||
"reload": "Przeładuj",
|
||||
"title": "Rozwój"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Kopiuj",
|
||||
"cut": "Wytnij",
|
||||
"delete": "Usuń",
|
||||
"paste": "Wklej",
|
||||
"redo": "Ponów",
|
||||
"selectAll": "Zaznacz wszystko",
|
||||
"speech": "Mowa",
|
||||
"startSpeaking": "Rozpocznij czytanie",
|
||||
"stopSpeaking": "Zatrzymaj czytanie",
|
||||
"title": "Edycja",
|
||||
"undo": "Cofnij"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Preferencje",
|
||||
"quit": "Zakończ",
|
||||
"title": "Plik"
|
||||
},
|
||||
"help": {
|
||||
"about": "O",
|
||||
"githubRepo": "Repozytorium GitHub",
|
||||
"reportIssue": "Zgłoś problem",
|
||||
"title": "Pomoc",
|
||||
"visitWebsite": "Odwiedź stronę internetową"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "O {{appName}}",
|
||||
"devTools": "Narzędzia dewelopera LobeHub",
|
||||
"hide": "Ukryj {{appName}}",
|
||||
"hideOthers": "Ukryj inne",
|
||||
"preferences": "Ustawienia...",
|
||||
"services": "Usługi",
|
||||
"unhide": "Pokaż wszystko"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Otwórz {{appName}}",
|
||||
"quit": "Zakończ",
|
||||
"show": "Pokaż {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Wymuś ponowne załadowanie",
|
||||
"reload": "Przeładuj",
|
||||
"resetZoom": "Zresetuj powiększenie",
|
||||
"title": "Widok",
|
||||
"toggleFullscreen": "Przełącz tryb pełnoekranowy",
|
||||
"zoomIn": "Powiększ",
|
||||
"zoomOut": "Pomniejsz"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Przenieś wszystkie okna na wierzch",
|
||||
"close": "Zamknij",
|
||||
"front": "Przenieś wszystkie okna na wierzch",
|
||||
"minimize": "Zminimalizuj",
|
||||
"title": "Okno",
|
||||
"toggleFullscreen": "Przełącz tryb pełnoekranowy",
|
||||
"zoom": "Powiększenie"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Adicionar",
|
||||
"actions.back": "Voltar",
|
||||
"actions.cancel": "Cancelar",
|
||||
"actions.close": "Fechar",
|
||||
"actions.confirm": "Confirmar",
|
||||
"actions.delete": "Excluir",
|
||||
"actions.edit": "Editar",
|
||||
"actions.more": "Mais",
|
||||
"actions.next": "Próximo",
|
||||
"actions.ok": "OK",
|
||||
"actions.previous": "Anterior",
|
||||
"actions.refresh": "Atualizar",
|
||||
"actions.remove": "Remover",
|
||||
"actions.retry": "Tentar novamente",
|
||||
"actions.save": "Salvar",
|
||||
"actions.search": "Pesquisar",
|
||||
"actions.submit": "Enviar",
|
||||
"app.description": "Sua plataforma de colaboração com assistente de IA",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Erro",
|
||||
"status.info": "Informação",
|
||||
"status.loading": "Carregando",
|
||||
"status.success": "Sucesso",
|
||||
"status.warning": "Aviso"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Adicionar",
|
||||
"back": "Voltar",
|
||||
"cancel": "Cancelar",
|
||||
"close": "Fechar",
|
||||
"confirm": "Confirmar",
|
||||
"delete": "Excluir",
|
||||
"edit": "Editar",
|
||||
"more": "Mais",
|
||||
"next": "Próximo",
|
||||
"ok": "OK",
|
||||
"previous": "Anterior",
|
||||
"refresh": "Atualizar",
|
||||
"remove": "Remover",
|
||||
"retry": "Tentar novamente",
|
||||
"save": "Salvar",
|
||||
"search": "Pesquisar",
|
||||
"submit": "Enviar"
|
||||
},
|
||||
"app": {
|
||||
"description": "Sua plataforma de colaboração com assistente de IA",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Erro",
|
||||
"info": "Informação",
|
||||
"loading": "Carregando",
|
||||
"success": "Sucesso",
|
||||
"warning": "Aviso"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Confirmar",
|
||||
"about.detail": "Um aplicativo de chat baseado em um grande modelo de linguagem",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Sobre",
|
||||
"confirm.cancel": "Cancelar",
|
||||
"confirm.no": "Não",
|
||||
"confirm.title": "Confirmar",
|
||||
"confirm.yes": "Sim",
|
||||
"error.button": "Confirmar",
|
||||
"error.detail": "Ocorreu um erro durante a operação, por favor tente novamente mais tarde",
|
||||
"error.message": "Ocorreu um erro",
|
||||
"error.title": "Erro",
|
||||
"update.downloadAndInstall": "Baixar e instalar",
|
||||
"update.downloadComplete": "Download completo",
|
||||
"update.downloadCompleteMessage": "O pacote de atualização foi baixado com sucesso, deseja instalá-lo agora?",
|
||||
"update.installLater": "Instalar depois",
|
||||
"update.installNow": "Instalar agora",
|
||||
"update.later": "Lembrar mais tarde",
|
||||
"update.newVersion": "Nova versão disponível",
|
||||
"update.newVersionAvailable": "Nova versão encontrada: {{version}}",
|
||||
"update.skipThisVersion": "Ignorar esta versão"
|
||||
}
|
||||
"about": {
|
||||
"button": "Confirmar",
|
||||
"detail": "Um aplicativo de chat baseado em um grande modelo de linguagem",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Sobre"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Cancelar",
|
||||
"no": "Não",
|
||||
"title": "Confirmar",
|
||||
"yes": "Sim"
|
||||
},
|
||||
"error": {
|
||||
"button": "Confirmar",
|
||||
"detail": "Ocorreu um erro durante a operação, por favor tente novamente mais tarde",
|
||||
"message": "Ocorreu um erro",
|
||||
"title": "Erro"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Baixar e instalar",
|
||||
"downloadComplete": "Download completo",
|
||||
"downloadCompleteMessage": "O pacote de atualização foi baixado com sucesso, deseja instalá-lo agora?",
|
||||
"installLater": "Instalar depois",
|
||||
"installNow": "Instalar agora",
|
||||
"later": "Lembrar mais tarde",
|
||||
"newVersion": "Nova versão disponível",
|
||||
"newVersionAvailable": "Nova versão encontrada: {{version}}",
|
||||
"skipThisVersion": "Ignorar esta versão"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Verificando atualizações...",
|
||||
"dev.devPanel": "Painel do Desenvolvedor",
|
||||
"dev.devTools": "Ferramentas do Desenvolvedor",
|
||||
"dev.forceReload": "Recarregar Forçadamente",
|
||||
"dev.openStore": "Abrir arquivo de armazenamento",
|
||||
"dev.refreshMenu": "Atualizar menu",
|
||||
"dev.reload": "Recarregar",
|
||||
"dev.title": "Desenvolvimento",
|
||||
"edit.copy": "Copiar",
|
||||
"edit.cut": "Cortar",
|
||||
"edit.delete": "Excluir",
|
||||
"edit.paste": "Colar",
|
||||
"edit.redo": "Refazer",
|
||||
"edit.selectAll": "Selecionar Tudo",
|
||||
"edit.speech": "Fala",
|
||||
"edit.startSpeaking": "Começar a Ler",
|
||||
"edit.stopSpeaking": "Parar de Ler",
|
||||
"edit.title": "Edição",
|
||||
"edit.undo": "Desfazer",
|
||||
"file.preferences": "Preferências",
|
||||
"file.quit": "Sair",
|
||||
"file.title": "Arquivo",
|
||||
"help.about": "Sobre",
|
||||
"help.githubRepo": "Repositório do GitHub",
|
||||
"help.reportIssue": "Reportar Problema",
|
||||
"help.title": "Ajuda",
|
||||
"help.visitWebsite": "Visitar o Site",
|
||||
"macOS.about": "Sobre {{appName}}",
|
||||
"macOS.devTools": "Ferramentas do Desenvolvedor LobeHub",
|
||||
"macOS.hide": "Ocultar {{appName}}",
|
||||
"macOS.hideOthers": "Ocultar Outros",
|
||||
"macOS.preferences": "Configurações...",
|
||||
"macOS.services": "Serviços",
|
||||
"macOS.unhide": "Mostrar Todos",
|
||||
"tray.open": "Abrir {{appName}}",
|
||||
"tray.quit": "Sair",
|
||||
"tray.show": "Mostrar {{appName}}",
|
||||
"view.forceReload": "Recarregar Forçadamente",
|
||||
"view.reload": "Recarregar",
|
||||
"view.resetZoom": "Redefinir Zoom",
|
||||
"view.title": "Visualização",
|
||||
"view.toggleFullscreen": "Alternar Tela Cheia",
|
||||
"view.zoomIn": "Aumentar",
|
||||
"view.zoomOut": "Diminuir",
|
||||
"window.bringAllToFront": "Trazer Todas as Janelas para Frente",
|
||||
"window.close": "Fechar",
|
||||
"window.front": "Trazer Todas as Janelas para Frente",
|
||||
"window.minimize": "Minimizar",
|
||||
"window.title": "Janela",
|
||||
"window.toggleFullscreen": "Alternar Tela Cheia",
|
||||
"window.zoom": "Zoom"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Verificando atualizações..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Painel do Desenvolvedor",
|
||||
"devTools": "Ferramentas do Desenvolvedor",
|
||||
"forceReload": "Recarregar Forçadamente",
|
||||
"openStore": "Abrir arquivo de armazenamento",
|
||||
"refreshMenu": "Atualizar menu",
|
||||
"reload": "Recarregar",
|
||||
"title": "Desenvolvimento"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Copiar",
|
||||
"cut": "Cortar",
|
||||
"delete": "Excluir",
|
||||
"paste": "Colar",
|
||||
"redo": "Refazer",
|
||||
"selectAll": "Selecionar Tudo",
|
||||
"speech": "Fala",
|
||||
"startSpeaking": "Começar a Ler",
|
||||
"stopSpeaking": "Parar de Ler",
|
||||
"title": "Edição",
|
||||
"undo": "Desfazer"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Preferências",
|
||||
"quit": "Sair",
|
||||
"title": "Arquivo"
|
||||
},
|
||||
"help": {
|
||||
"about": "Sobre",
|
||||
"githubRepo": "Repositório do GitHub",
|
||||
"reportIssue": "Reportar Problema",
|
||||
"title": "Ajuda",
|
||||
"visitWebsite": "Visitar o Site"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "Sobre {{appName}}",
|
||||
"devTools": "Ferramentas do Desenvolvedor LobeHub",
|
||||
"hide": "Ocultar {{appName}}",
|
||||
"hideOthers": "Ocultar Outros",
|
||||
"preferences": "Configurações...",
|
||||
"services": "Serviços",
|
||||
"unhide": "Mostrar Todos"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Abrir {{appName}}",
|
||||
"quit": "Sair",
|
||||
"show": "Mostrar {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Recarregar Forçadamente",
|
||||
"reload": "Recarregar",
|
||||
"resetZoom": "Redefinir Zoom",
|
||||
"title": "Visualização",
|
||||
"toggleFullscreen": "Alternar Tela Cheia",
|
||||
"zoomIn": "Aumentar",
|
||||
"zoomOut": "Diminuir"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Trazer Todas as Janelas para Frente",
|
||||
"close": "Fechar",
|
||||
"front": "Trazer Todas as Janelas para Frente",
|
||||
"minimize": "Minimizar",
|
||||
"title": "Janela",
|
||||
"toggleFullscreen": "Alternar Tela Cheia",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Добавить",
|
||||
"actions.back": "Назад",
|
||||
"actions.cancel": "Отмена",
|
||||
"actions.close": "Закрыть",
|
||||
"actions.confirm": "Подтвердить",
|
||||
"actions.delete": "Удалить",
|
||||
"actions.edit": "Редактировать",
|
||||
"actions.more": "Больше",
|
||||
"actions.next": "Далее",
|
||||
"actions.ok": "ОК",
|
||||
"actions.previous": "Назад",
|
||||
"actions.refresh": "Обновить",
|
||||
"actions.remove": "Удалить",
|
||||
"actions.retry": "Повторить",
|
||||
"actions.save": "Сохранить",
|
||||
"actions.search": "Поиск",
|
||||
"actions.submit": "Отправить",
|
||||
"app.description": "Ваша платформа для совместной работы с ИИ",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Ошибка",
|
||||
"status.info": "Информация",
|
||||
"status.loading": "Загрузка",
|
||||
"status.success": "Успех",
|
||||
"status.warning": "Предупреждение"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Добавить",
|
||||
"back": "Назад",
|
||||
"cancel": "Отмена",
|
||||
"close": "Закрыть",
|
||||
"confirm": "Подтвердить",
|
||||
"delete": "Удалить",
|
||||
"edit": "Редактировать",
|
||||
"more": "Больше",
|
||||
"next": "Далее",
|
||||
"ok": "ОК",
|
||||
"previous": "Назад",
|
||||
"refresh": "Обновить",
|
||||
"remove": "Удалить",
|
||||
"retry": "Повторить",
|
||||
"save": "Сохранить",
|
||||
"search": "Поиск",
|
||||
"submit": "Отправить"
|
||||
},
|
||||
"app": {
|
||||
"description": "Ваша платформа для совместной работы с ИИ",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Ошибка",
|
||||
"info": "Информация",
|
||||
"loading": "Загрузка",
|
||||
"success": "Успех",
|
||||
"warning": "Предупреждение"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Подтвердить",
|
||||
"about.detail": "Приложение для чата на основе большой языковой модели",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "О приложении",
|
||||
"confirm.cancel": "Отмена",
|
||||
"confirm.no": "Нет",
|
||||
"confirm.title": "Подтверждение",
|
||||
"confirm.yes": "Да",
|
||||
"error.button": "Подтвердить",
|
||||
"error.detail": "Произошла ошибка во время операции, пожалуйста, попробуйте позже",
|
||||
"error.message": "Произошла ошибка",
|
||||
"error.title": "Ошибка",
|
||||
"update.downloadAndInstall": "Скачать и установить",
|
||||
"update.downloadComplete": "Скачивание завершено",
|
||||
"update.downloadCompleteMessage": "Обновление загружено, хотите установить сейчас?",
|
||||
"update.installLater": "Установить позже",
|
||||
"update.installNow": "Установить сейчас",
|
||||
"update.later": "Напомнить позже",
|
||||
"update.newVersion": "Обнаружена новая версия",
|
||||
"update.newVersionAvailable": "Обнаружена новая версия: {{version}}",
|
||||
"update.skipThisVersion": "Пропустить эту версию"
|
||||
}
|
||||
"about": {
|
||||
"button": "Подтвердить",
|
||||
"detail": "Приложение для чата на основе большой языковой модели",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "О приложении"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Отмена",
|
||||
"no": "Нет",
|
||||
"title": "Подтверждение",
|
||||
"yes": "Да"
|
||||
},
|
||||
"error": {
|
||||
"button": "Подтвердить",
|
||||
"detail": "Произошла ошибка во время операции, пожалуйста, попробуйте позже",
|
||||
"message": "Произошла ошибка",
|
||||
"title": "Ошибка"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Скачать и установить",
|
||||
"downloadComplete": "Скачивание завершено",
|
||||
"downloadCompleteMessage": "Обновление загружено, хотите установить сейчас?",
|
||||
"installLater": "Установить позже",
|
||||
"installNow": "Установить сейчас",
|
||||
"later": "Напомнить позже",
|
||||
"newVersion": "Обнаружена новая версия",
|
||||
"newVersionAvailable": "Обнаружена новая версия: {{version}}",
|
||||
"skipThisVersion": "Пропустить эту версию"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Проверка обновлений...",
|
||||
"dev.devPanel": "Панель разработчика",
|
||||
"dev.devTools": "Инструменты разработчика",
|
||||
"dev.forceReload": "Принудительная перезагрузка",
|
||||
"dev.openStore": "Открыть файл хранилища",
|
||||
"dev.refreshMenu": "Обновить меню",
|
||||
"dev.reload": "Перезагрузить",
|
||||
"dev.title": "Разработка",
|
||||
"edit.copy": "Копировать",
|
||||
"edit.cut": "Вырезать",
|
||||
"edit.delete": "Удалить",
|
||||
"edit.paste": "Вставить",
|
||||
"edit.redo": "Повторить",
|
||||
"edit.selectAll": "Выбрать все",
|
||||
"edit.speech": "Речь",
|
||||
"edit.startSpeaking": "Начать чтение",
|
||||
"edit.stopSpeaking": "Остановить чтение",
|
||||
"edit.title": "Редактирование",
|
||||
"edit.undo": "Отменить",
|
||||
"file.preferences": "Настройки",
|
||||
"file.quit": "Выйти",
|
||||
"file.title": "Файл",
|
||||
"help.about": "О программе",
|
||||
"help.githubRepo": "Репозиторий GitHub",
|
||||
"help.reportIssue": "Сообщить о проблеме",
|
||||
"help.title": "Помощь",
|
||||
"help.visitWebsite": "Посетить сайт",
|
||||
"macOS.about": "О {{appName}}",
|
||||
"macOS.devTools": "Инструменты разработчика LobeHub",
|
||||
"macOS.hide": "Скрыть {{appName}}",
|
||||
"macOS.hideOthers": "Скрыть другие",
|
||||
"macOS.preferences": "Настройки...",
|
||||
"macOS.services": "Сервисы",
|
||||
"macOS.unhide": "Показать все",
|
||||
"tray.open": "Открыть {{appName}}",
|
||||
"tray.quit": "Выйти",
|
||||
"tray.show": "Показать {{appName}}",
|
||||
"view.forceReload": "Принудительная перезагрузка",
|
||||
"view.reload": "Перезагрузить",
|
||||
"view.resetZoom": "Сбросить масштаб",
|
||||
"view.title": "Вид",
|
||||
"view.toggleFullscreen": "Переключить полноэкранный режим",
|
||||
"view.zoomIn": "Увеличить",
|
||||
"view.zoomOut": "Уменьшить",
|
||||
"window.bringAllToFront": "Вывести все окна на передний план",
|
||||
"window.close": "Закрыть",
|
||||
"window.front": "Вывести все окна на передний план",
|
||||
"window.minimize": "Свернуть",
|
||||
"window.title": "Окно",
|
||||
"window.toggleFullscreen": "Переключить полноэкранный режим",
|
||||
"window.zoom": "Масштаб"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Проверка обновлений..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Панель разработчика",
|
||||
"devTools": "Инструменты разработчика",
|
||||
"forceReload": "Принудительная перезагрузка",
|
||||
"openStore": "Открыть файл хранилища",
|
||||
"refreshMenu": "Обновить меню",
|
||||
"reload": "Перезагрузить",
|
||||
"title": "Разработка"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Копировать",
|
||||
"cut": "Вырезать",
|
||||
"delete": "Удалить",
|
||||
"paste": "Вставить",
|
||||
"redo": "Повторить",
|
||||
"selectAll": "Выбрать все",
|
||||
"speech": "Речь",
|
||||
"startSpeaking": "Начать чтение",
|
||||
"stopSpeaking": "Остановить чтение",
|
||||
"title": "Редактирование",
|
||||
"undo": "Отменить"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Настройки",
|
||||
"quit": "Выйти",
|
||||
"title": "Файл"
|
||||
},
|
||||
"help": {
|
||||
"about": "О программе",
|
||||
"githubRepo": "Репозиторий GitHub",
|
||||
"reportIssue": "Сообщить о проблеме",
|
||||
"title": "Помощь",
|
||||
"visitWebsite": "Посетить сайт"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "О {{appName}}",
|
||||
"devTools": "Инструменты разработчика LobeHub",
|
||||
"hide": "Скрыть {{appName}}",
|
||||
"hideOthers": "Скрыть другие",
|
||||
"preferences": "Настройки...",
|
||||
"services": "Сервисы",
|
||||
"unhide": "Показать все"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Открыть {{appName}}",
|
||||
"quit": "Выйти",
|
||||
"show": "Показать {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Принудительная перезагрузка",
|
||||
"reload": "Перезагрузить",
|
||||
"resetZoom": "Сбросить масштаб",
|
||||
"title": "Вид",
|
||||
"toggleFullscreen": "Переключить полноэкранный режим",
|
||||
"zoomIn": "Увеличить",
|
||||
"zoomOut": "Уменьшить"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Вывести все окна на передний план",
|
||||
"close": "Закрыть",
|
||||
"front": "Вывести все окна на передний план",
|
||||
"minimize": "Свернуть",
|
||||
"title": "Окно",
|
||||
"toggleFullscreen": "Переключить полноэкранный режим",
|
||||
"zoom": "Масштаб"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Ekle",
|
||||
"actions.back": "Geri",
|
||||
"actions.cancel": "İptal",
|
||||
"actions.close": "Kapat",
|
||||
"actions.confirm": "Onayla",
|
||||
"actions.delete": "Sil",
|
||||
"actions.edit": "Düzenle",
|
||||
"actions.more": "Daha Fazla",
|
||||
"actions.next": "Sonraki",
|
||||
"actions.ok": "Tamam",
|
||||
"actions.previous": "Önceki",
|
||||
"actions.refresh": "Yenile",
|
||||
"actions.remove": "Kaldır",
|
||||
"actions.retry": "Yeniden Dene",
|
||||
"actions.save": "Kaydet",
|
||||
"actions.search": "Ara",
|
||||
"actions.submit": "Gönder",
|
||||
"app.description": "AI asistanınız için işbirliği platformu",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Hata",
|
||||
"status.info": "Bilgi",
|
||||
"status.loading": "Yükleniyor",
|
||||
"status.success": "Başarılı",
|
||||
"status.warning": "Uyarı"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Ekle",
|
||||
"back": "Geri",
|
||||
"cancel": "İptal",
|
||||
"close": "Kapat",
|
||||
"confirm": "Onayla",
|
||||
"delete": "Sil",
|
||||
"edit": "Düzenle",
|
||||
"more": "Daha Fazla",
|
||||
"next": "Sonraki",
|
||||
"ok": "Tamam",
|
||||
"previous": "Önceki",
|
||||
"refresh": "Yenile",
|
||||
"remove": "Kaldır",
|
||||
"retry": "Yeniden Dene",
|
||||
"save": "Kaydet",
|
||||
"search": "Ara",
|
||||
"submit": "Gönder"
|
||||
},
|
||||
"app": {
|
||||
"description": "AI asistanınız için işbirliği platformu",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Hata",
|
||||
"info": "Bilgi",
|
||||
"loading": "Yükleniyor",
|
||||
"success": "Başarılı",
|
||||
"warning": "Uyarı"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Tamam",
|
||||
"about.detail": "Büyük dil modeli tabanlı bir sohbet uygulaması",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Hakkında",
|
||||
"confirm.cancel": "İptal",
|
||||
"confirm.no": "Hayır",
|
||||
"confirm.title": "Onay",
|
||||
"confirm.yes": "Evet",
|
||||
"error.button": "Tamam",
|
||||
"error.detail": "İşlem sırasında bir hata oluştu, lütfen daha sonra tekrar deneyin",
|
||||
"error.message": "Hata oluştu",
|
||||
"error.title": "Hata",
|
||||
"update.downloadAndInstall": "İndir ve Yükle",
|
||||
"update.downloadComplete": "İndirme tamamlandı",
|
||||
"update.downloadCompleteMessage": "Güncelleme paketi indirildi, hemen yüklemek ister misiniz?",
|
||||
"update.installLater": "Sonra yükle",
|
||||
"update.installNow": "Şimdi yükle",
|
||||
"update.later": "Sonra hatırlat",
|
||||
"update.newVersion": "Yeni sürüm bulundu",
|
||||
"update.newVersionAvailable": "Yeni sürüm bulundu: {{version}}",
|
||||
"update.skipThisVersion": "Bu sürümü atla"
|
||||
}
|
||||
"about": {
|
||||
"button": "Tamam",
|
||||
"detail": "Büyük dil modeli tabanlı bir sohbet uygulaması",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Hakkında"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "İptal",
|
||||
"no": "Hayır",
|
||||
"title": "Onay",
|
||||
"yes": "Evet"
|
||||
},
|
||||
"error": {
|
||||
"button": "Tamam",
|
||||
"detail": "İşlem sırasında bir hata oluştu, lütfen daha sonra tekrar deneyin",
|
||||
"message": "Hata oluştu",
|
||||
"title": "Hata"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "İndir ve Yükle",
|
||||
"downloadComplete": "İndirme tamamlandı",
|
||||
"downloadCompleteMessage": "Güncelleme paketi indirildi, hemen yüklemek ister misiniz?",
|
||||
"installLater": "Sonra yükle",
|
||||
"installNow": "Şimdi yükle",
|
||||
"later": "Sonra hatırlat",
|
||||
"newVersion": "Yeni sürüm bulundu",
|
||||
"newVersionAvailable": "Yeni sürüm bulundu: {{version}}",
|
||||
"skipThisVersion": "Bu sürümü atla"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Güncellemeleri kontrol et...",
|
||||
"dev.devPanel": "Geliştirici Paneli",
|
||||
"dev.devTools": "Geliştirici Araçları",
|
||||
"dev.forceReload": "Zorla Yenile",
|
||||
"dev.openStore": "Depolama dosyasını aç",
|
||||
"dev.refreshMenu": "Menüyü yenile",
|
||||
"dev.reload": "Yenile",
|
||||
"dev.title": "Geliştir",
|
||||
"edit.copy": "Kopyala",
|
||||
"edit.cut": "Kes",
|
||||
"edit.delete": "Sil",
|
||||
"edit.paste": "Yapıştır",
|
||||
"edit.redo": "Yinele",
|
||||
"edit.selectAll": "Tümünü Seç",
|
||||
"edit.speech": "Ses",
|
||||
"edit.startSpeaking": "Okumaya Başla",
|
||||
"edit.stopSpeaking": "Okumayı Durdur",
|
||||
"edit.title": "Düzenle",
|
||||
"edit.undo": "Geri Al",
|
||||
"file.preferences": "Tercihler",
|
||||
"file.quit": "Çık",
|
||||
"file.title": "Dosya",
|
||||
"help.about": "Hakkında",
|
||||
"help.githubRepo": "GitHub Deposu",
|
||||
"help.reportIssue": "Sorun Bildir",
|
||||
"help.title": "Yardım",
|
||||
"help.visitWebsite": "Resmi Web Sitesini Ziyaret Et",
|
||||
"macOS.about": "{{appName}} Hakkında",
|
||||
"macOS.devTools": "LobeHub Geliştirici Araçları",
|
||||
"macOS.hide": "{{appName}}'i Gizle",
|
||||
"macOS.hideOthers": "Diğerlerini Gizle",
|
||||
"macOS.preferences": "Tercihler...",
|
||||
"macOS.services": "Hizmetler",
|
||||
"macOS.unhide": "Hepsini Göster",
|
||||
"tray.open": "{{appName}}'i Aç",
|
||||
"tray.quit": "Çık",
|
||||
"tray.show": "{{appName}}'i Göster",
|
||||
"view.forceReload": "Zorla Yenile",
|
||||
"view.reload": "Yenile",
|
||||
"view.resetZoom": "Yakınlaştırmayı Sıfırla",
|
||||
"view.title": "Görünüm",
|
||||
"view.toggleFullscreen": "Tam Ekrana Geç",
|
||||
"view.zoomIn": "Büyüt",
|
||||
"view.zoomOut": "Küçült",
|
||||
"window.bringAllToFront": "Tüm Pencereleri Öne Getir",
|
||||
"window.close": "Kapat",
|
||||
"window.front": "Tüm Pencereleri Öne Getir",
|
||||
"window.minimize": "Küçült",
|
||||
"window.title": "Pencere",
|
||||
"window.toggleFullscreen": "Tam Ekrana Geç",
|
||||
"window.zoom": "Yakınlaştır"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Güncellemeleri kontrol et..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Geliştirici Paneli",
|
||||
"devTools": "Geliştirici Araçları",
|
||||
"forceReload": "Zorla Yenile",
|
||||
"openStore": "Depolama dosyasını aç",
|
||||
"refreshMenu": "Menüyü yenile",
|
||||
"reload": "Yenile",
|
||||
"title": "Geliştir"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Kopyala",
|
||||
"cut": "Kes",
|
||||
"delete": "Sil",
|
||||
"paste": "Yapıştır",
|
||||
"redo": "Yinele",
|
||||
"selectAll": "Tümünü Seç",
|
||||
"speech": "Ses",
|
||||
"startSpeaking": "Okumaya Başla",
|
||||
"stopSpeaking": "Okumayı Durdur",
|
||||
"title": "Düzenle",
|
||||
"undo": "Geri Al"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Tercihler",
|
||||
"quit": "Çık",
|
||||
"title": "Dosya"
|
||||
},
|
||||
"help": {
|
||||
"about": "Hakkında",
|
||||
"githubRepo": "GitHub Deposu",
|
||||
"reportIssue": "Sorun Bildir",
|
||||
"title": "Yardım",
|
||||
"visitWebsite": "Resmi Web Sitesini Ziyaret Et"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "{{appName}} Hakkında",
|
||||
"devTools": "LobeHub Geliştirici Araçları",
|
||||
"hide": "{{appName}}'i Gizle",
|
||||
"hideOthers": "Diğerlerini Gizle",
|
||||
"preferences": "Tercihler...",
|
||||
"services": "Hizmetler",
|
||||
"unhide": "Hepsini Göster"
|
||||
},
|
||||
"tray": {
|
||||
"open": "{{appName}}'i Aç",
|
||||
"quit": "Çık",
|
||||
"show": "{{appName}}'i Göster"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Zorla Yenile",
|
||||
"reload": "Yenile",
|
||||
"resetZoom": "Yakınlaştırmayı Sıfırla",
|
||||
"title": "Görünüm",
|
||||
"toggleFullscreen": "Tam Ekrana Geç",
|
||||
"zoomIn": "Büyüt",
|
||||
"zoomOut": "Küçült"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Tüm Pencereleri Öne Getir",
|
||||
"close": "Kapat",
|
||||
"front": "Tüm Pencereleri Öne Getir",
|
||||
"minimize": "Küçült",
|
||||
"title": "Pencere",
|
||||
"toggleFullscreen": "Tam Ekrana Geç",
|
||||
"zoom": "Yakınlaştır"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "Thêm",
|
||||
"actions.back": "Quay lại",
|
||||
"actions.cancel": "Hủy",
|
||||
"actions.close": "Đóng",
|
||||
"actions.confirm": "Xác nhận",
|
||||
"actions.delete": "Xóa",
|
||||
"actions.edit": "Chỉnh sửa",
|
||||
"actions.more": "Thêm nữa",
|
||||
"actions.next": "Tiếp theo",
|
||||
"actions.ok": "Đồng ý",
|
||||
"actions.previous": "Quay lại",
|
||||
"actions.refresh": "Tải lại",
|
||||
"actions.remove": "Gỡ bỏ",
|
||||
"actions.retry": "Thử lại",
|
||||
"actions.save": "Lưu",
|
||||
"actions.search": "Tìm kiếm",
|
||||
"actions.submit": "Gửi",
|
||||
"app.description": "Nền tảng hợp tác trợ lý AI của bạn",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "Lỗi",
|
||||
"status.info": "Thông tin",
|
||||
"status.loading": "Đang tải",
|
||||
"status.success": "Thành công",
|
||||
"status.warning": "Cảnh báo"
|
||||
}
|
||||
"actions": {
|
||||
"add": "Thêm",
|
||||
"back": "Quay lại",
|
||||
"cancel": "Hủy",
|
||||
"close": "Đóng",
|
||||
"confirm": "Xác nhận",
|
||||
"delete": "Xóa",
|
||||
"edit": "Chỉnh sửa",
|
||||
"more": "Thêm nữa",
|
||||
"next": "Tiếp theo",
|
||||
"ok": "Đồng ý",
|
||||
"previous": "Quay lại",
|
||||
"refresh": "Tải lại",
|
||||
"remove": "Gỡ bỏ",
|
||||
"retry": "Thử lại",
|
||||
"save": "Lưu",
|
||||
"search": "Tìm kiếm",
|
||||
"submit": "Gửi"
|
||||
},
|
||||
"app": {
|
||||
"description": "Nền tảng hợp tác trợ lý AI của bạn",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "Lỗi",
|
||||
"info": "Thông tin",
|
||||
"loading": "Đang tải",
|
||||
"success": "Thành công",
|
||||
"warning": "Cảnh báo"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,31 @@
|
||||
{
|
||||
"about.button": "Xác nhận",
|
||||
"about.detail": "Một ứng dụng trò chuyện dựa trên mô hình ngôn ngữ lớn",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "Về",
|
||||
"confirm.cancel": "Hủy",
|
||||
"confirm.no": "Không",
|
||||
"confirm.title": "Xác nhận",
|
||||
"confirm.yes": "Có",
|
||||
"error.button": "Xác nhận",
|
||||
"error.detail": "Đã xảy ra lỗi trong quá trình thực hiện, vui lòng thử lại sau",
|
||||
"error.message": "Đã xảy ra lỗi",
|
||||
"error.title": "Lỗi",
|
||||
"update.downloadAndInstall": "Tải xuống và cài đặt",
|
||||
"update.downloadComplete": "Tải xuống hoàn tất",
|
||||
"update.downloadCompleteMessage": "Gói cập nhật đã tải xuống hoàn tất, có muốn cài đặt ngay không?",
|
||||
"update.installLater": "Cài đặt sau",
|
||||
"update.installNow": "Cài đặt ngay",
|
||||
"update.later": "Nhắc nhở sau",
|
||||
"update.newVersion": "Phát hiện phiên bản mới",
|
||||
"update.newVersionAvailable": "Phát hiện phiên bản mới: {{version}}",
|
||||
"update.skipThisVersion": "Bỏ qua phiên bản này"
|
||||
}
|
||||
"about": {
|
||||
"button": "Xác nhận",
|
||||
"detail": "Một ứng dụng trò chuyện dựa trên mô hình ngôn ngữ lớn",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "Về"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Hủy",
|
||||
"no": "Không",
|
||||
"title": "Xác nhận",
|
||||
"yes": "Có"
|
||||
},
|
||||
"error": {
|
||||
"button": "Xác nhận",
|
||||
"detail": "Đã xảy ra lỗi trong quá trình thực hiện, vui lòng thử lại sau",
|
||||
"message": "Đã xảy ra lỗi",
|
||||
"title": "Lỗi"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "Tải xuống và cài đặt",
|
||||
"downloadComplete": "Tải xuống hoàn tất",
|
||||
"downloadCompleteMessage": "Gói cập nhật đã tải xuống hoàn tất, có muốn cài đặt ngay không?",
|
||||
"installLater": "Cài đặt sau",
|
||||
"installNow": "Cài đặt ngay",
|
||||
"later": "Nhắc nhở sau",
|
||||
"newVersion": "Phát hiện phiên bản mới",
|
||||
"newVersionAvailable": "Phát hiện phiên bản mới: {{version}}",
|
||||
"skipThisVersion": "Bỏ qua phiên bản này"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,53 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "Kiểm tra cập nhật...",
|
||||
"dev.devPanel": "Bảng điều khiển nhà phát triển",
|
||||
"dev.devTools": "Công cụ phát triển",
|
||||
"dev.forceReload": "Tải lại cưỡng bức",
|
||||
"dev.openStore": "Mở tệp lưu trữ",
|
||||
"dev.refreshMenu": "Làm mới menu",
|
||||
"dev.reload": "Tải lại",
|
||||
"dev.title": "Phát triển",
|
||||
"edit.copy": "Sao chép",
|
||||
"edit.cut": "Cắt",
|
||||
"edit.delete": "Xóa",
|
||||
"edit.paste": "Dán",
|
||||
"edit.redo": "Làm lại",
|
||||
"edit.selectAll": "Chọn tất cả",
|
||||
"edit.speech": "Giọng nói",
|
||||
"edit.startSpeaking": "Bắt đầu đọc",
|
||||
"edit.stopSpeaking": "Dừng đọc",
|
||||
"edit.title": "Chỉnh sửa",
|
||||
"edit.undo": "Hoàn tác",
|
||||
"file.preferences": "Tùy chọn",
|
||||
"file.quit": "Thoát",
|
||||
"file.title": "Tập tin",
|
||||
"help.about": "Về",
|
||||
"help.githubRepo": "Kho lưu trữ GitHub",
|
||||
"help.reportIssue": "Báo cáo sự cố",
|
||||
"help.title": "Trợ giúp",
|
||||
"help.visitWebsite": "Truy cập trang web",
|
||||
"macOS.about": "Về {{appName}}",
|
||||
"macOS.devTools": "Công cụ phát triển LobeHub",
|
||||
"macOS.hide": "Ẩn {{appName}}",
|
||||
"macOS.hideOthers": "Ẩn khác",
|
||||
"macOS.preferences": "Cài đặt ưu tiên...",
|
||||
"macOS.services": "Dịch vụ",
|
||||
"macOS.unhide": "Hiện tất cả",
|
||||
"tray.open": "Mở {{appName}}",
|
||||
"tray.quit": "Thoát",
|
||||
"tray.show": "Hiện {{appName}}",
|
||||
"view.forceReload": "Tải lại cưỡng bức",
|
||||
"view.reload": "Tải lại",
|
||||
"view.resetZoom": "Đặt lại thu phóng",
|
||||
"view.title": "Xem",
|
||||
"view.toggleFullscreen": "Chuyển đổi toàn màn hình",
|
||||
"view.zoomIn": "Phóng to",
|
||||
"view.zoomOut": "Thu nhỏ",
|
||||
"window.bringAllToFront": "Đưa tất cả cửa sổ lên trước",
|
||||
"window.close": "Đóng",
|
||||
"window.front": "Đưa tất cả cửa sổ lên trước",
|
||||
"window.minimize": "Thu nhỏ",
|
||||
"window.title": "Cửa sổ",
|
||||
"window.toggleFullscreen": "Chuyển đổi toàn màn hình",
|
||||
"window.zoom": "Thu phóng"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "Kiểm tra cập nhật..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "Bảng điều khiển nhà phát triển",
|
||||
"devTools": "Công cụ phát triển",
|
||||
"forceReload": "Tải lại cưỡng bức",
|
||||
"openStore": "Mở tệp lưu trữ",
|
||||
"refreshMenu": "Làm mới menu",
|
||||
"reload": "Tải lại",
|
||||
"title": "Phát triển"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "Sao chép",
|
||||
"cut": "Cắt",
|
||||
"delete": "Xóa",
|
||||
"paste": "Dán",
|
||||
"redo": "Làm lại",
|
||||
"selectAll": "Chọn tất cả",
|
||||
"speech": "Giọng nói",
|
||||
"startSpeaking": "Bắt đầu đọc",
|
||||
"stopSpeaking": "Dừng đọc",
|
||||
"title": "Chỉnh sửa",
|
||||
"undo": "Hoàn tác"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "Tùy chọn",
|
||||
"quit": "Thoát",
|
||||
"title": "Tập tin"
|
||||
},
|
||||
"help": {
|
||||
"about": "Về",
|
||||
"githubRepo": "Kho lưu trữ GitHub",
|
||||
"reportIssue": "Báo cáo sự cố",
|
||||
"title": "Trợ giúp",
|
||||
"visitWebsite": "Truy cập trang web"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "Về {{appName}}",
|
||||
"devTools": "Công cụ phát triển LobeHub",
|
||||
"hide": "Ẩn {{appName}}",
|
||||
"hideOthers": "Ẩn khác",
|
||||
"preferences": "Cài đặt ưu tiên...",
|
||||
"services": "Dịch vụ",
|
||||
"unhide": "Hiện tất cả"
|
||||
},
|
||||
"tray": {
|
||||
"open": "Mở {{appName}}",
|
||||
"quit": "Thoát",
|
||||
"show": "Hiện {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "Tải lại cưỡng bức",
|
||||
"reload": "Tải lại",
|
||||
"resetZoom": "Đặt lại thu phóng",
|
||||
"title": "Xem",
|
||||
"toggleFullscreen": "Chuyển đổi toàn màn hình",
|
||||
"zoomIn": "Phóng to",
|
||||
"zoomOut": "Thu nhỏ"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "Đưa tất cả cửa sổ lên trước",
|
||||
"close": "Đóng",
|
||||
"front": "Đưa tất cả cửa sổ lên trước",
|
||||
"minimize": "Thu nhỏ",
|
||||
"title": "Cửa sổ",
|
||||
"toggleFullscreen": "Chuyển đổi toàn màn hình",
|
||||
"zoom": "Thu phóng"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,92 +1,32 @@
|
||||
{
|
||||
"actions.add": "添加",
|
||||
"actions.back": "返回",
|
||||
"actions.cancel": "取消",
|
||||
"actions.close": "关闭",
|
||||
"actions.confirm": "确认",
|
||||
"actions.delete": "删除",
|
||||
"actions.edit": "编辑",
|
||||
"actions.more": "更多",
|
||||
"actions.next": "下一步",
|
||||
"actions.ok": "确定",
|
||||
"actions.previous": "上一步",
|
||||
"actions.refresh": "刷新",
|
||||
"actions.remove": "移除",
|
||||
"actions.retry": "重试",
|
||||
"actions.save": "保存",
|
||||
"actions.search": "搜索",
|
||||
"actions.submit": "提交",
|
||||
"app.description": "你的 AI 助手协作平台",
|
||||
"app.name": "LobeHub",
|
||||
"notification.finishChatGeneration": "AI 消息已生成完毕",
|
||||
"proxy.auth": "需要认证",
|
||||
"proxy.authDesc": "如果代理服务器需要用户名和密码",
|
||||
"proxy.authSettings": "认证设置",
|
||||
"proxy.basicSettings": "代理设置",
|
||||
"proxy.basicSettingsDesc": "配置代理服务器的连接参数",
|
||||
"proxy.bypass": "不使用代理的地址",
|
||||
"proxy.connectionTest": "连接测试",
|
||||
"proxy.enable": "启用代理",
|
||||
"proxy.enableDesc": "开启后将通过代理服务器访问网络",
|
||||
"proxy.password": "密码",
|
||||
"proxy.password_placeholder": "请输入密码",
|
||||
"proxy.port": "端口",
|
||||
"proxy.resetButton": "重置",
|
||||
"proxy.saveButton": "保存",
|
||||
"proxy.saveFailed": "保存失败:{{error}}",
|
||||
"proxy.saveSuccess": "代理设置保存成功",
|
||||
"proxy.server": "服务器地址",
|
||||
"proxy.testButton": "测试连接",
|
||||
"proxy.testDescription": "使用当前代理配置测试连接,验证配置是否正常工作",
|
||||
"proxy.testFailed": "连接失败",
|
||||
"proxy.testSuccessWithTime": "测试连接成功,耗时 {{time}} ms",
|
||||
"proxy.testUrl": "测试地址",
|
||||
"proxy.testUrlPlaceholder": "请输入要测试的 URL",
|
||||
"proxy.testing": "正在测试连接…",
|
||||
"proxy.type": "代理类型",
|
||||
"proxy.unsavedChanges": "你有未保存的更改",
|
||||
"proxy.username": "用户名",
|
||||
"proxy.username_placeholder": "请输入用户名",
|
||||
"proxy.validation.passwordRequired": "启用认证时密码为必填项",
|
||||
"proxy.validation.portInvalid": "端口必须是 1 到 65535 之间的数字",
|
||||
"proxy.validation.portRequired": "启用代理时端口为必填项",
|
||||
"proxy.validation.serverInvalid": "请输入有效的服务器地址(IP 或域名)",
|
||||
"proxy.validation.serverRequired": "启用代理时服务器地址为必填项",
|
||||
"proxy.validation.typeRequired": "启用代理时代理类型为必填项",
|
||||
"proxy.validation.usernameRequired": "启用认证时用户名为必填项",
|
||||
"remoteServer.authError": "授权失败: {{error}}",
|
||||
"remoteServer.authPending": "请在浏览器中完成授权",
|
||||
"remoteServer.configDesc": "连接到远程 LobeHub 服务器,启用数据同步",
|
||||
"remoteServer.configError": "配置出错",
|
||||
"remoteServer.configTitle": "配置云同步",
|
||||
"remoteServer.connect": "连接并授权",
|
||||
"remoteServer.connected": "已连接",
|
||||
"remoteServer.disconnect": "断开连接",
|
||||
"remoteServer.disconnectError": "断开连接失败",
|
||||
"remoteServer.disconnected": "未连接",
|
||||
"remoteServer.fetchError": "获取配置失败",
|
||||
"remoteServer.invalidUrl": "请输入有效的URL地址",
|
||||
"remoteServer.serverUrl": "服务器地址",
|
||||
"remoteServer.statusConnected": "已连接",
|
||||
"remoteServer.statusDisconnected": "未连接",
|
||||
"remoteServer.urlRequired": "请输入服务器地址",
|
||||
"status.error": "错误",
|
||||
"status.info": "信息",
|
||||
"status.loading": "加载中",
|
||||
"status.success": "成功",
|
||||
"status.warning": "警告",
|
||||
"sync.continue": "继续",
|
||||
"sync.inCloud": "当前使用云端同步",
|
||||
"sync.inLocalStorage": "当前使用本地存储",
|
||||
"sync.isIniting": "正在初始化…",
|
||||
"sync.lobehubCloud.description": "官方提供的云版本",
|
||||
"sync.lobehubCloud.title": "LobeHub Cloud",
|
||||
"sync.local.description": "使用本地数据库,完全离线可用",
|
||||
"sync.local.title": "本地数据库",
|
||||
"sync.mode.cloudSync": "云端同步",
|
||||
"sync.mode.localStorage": "本地存储",
|
||||
"sync.mode.title": "选择你的连接模式",
|
||||
"sync.mode.useSelfHosted": "使用自托管实例?",
|
||||
"sync.selfHosted.description": "自行部署的社区版本",
|
||||
"sync.selfHosted.title": "自托管实例"
|
||||
}
|
||||
"actions": {
|
||||
"add": "添加",
|
||||
"back": "返回",
|
||||
"cancel": "取消",
|
||||
"close": "关闭",
|
||||
"confirm": "确认",
|
||||
"delete": "删除",
|
||||
"edit": "编辑",
|
||||
"more": "更多",
|
||||
"next": "下一步",
|
||||
"ok": "确定",
|
||||
"previous": "上一步",
|
||||
"refresh": "刷新",
|
||||
"remove": "移除",
|
||||
"retry": "重试",
|
||||
"save": "保存",
|
||||
"search": "搜索",
|
||||
"submit": "提交"
|
||||
},
|
||||
"app": {
|
||||
"description": "你的 AI 助手协作平台",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "错误",
|
||||
"info": "信息",
|
||||
"loading": "加载中",
|
||||
"success": "成功",
|
||||
"warning": "警告"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,44 +1,31 @@
|
||||
{
|
||||
"about.button": "确定",
|
||||
"about.detail": "一个基于大语言模型的聊天应用",
|
||||
"about.message": "{{appName}} {{appVersion}}",
|
||||
"about.title": "关于",
|
||||
"confirm.cancel": "取消",
|
||||
"confirm.no": "取消",
|
||||
"confirm.title": "请确认",
|
||||
"confirm.yes": "继续",
|
||||
"error.button": "确定",
|
||||
"error.detail": "操作未完成。你可以重试,或稍后再试。",
|
||||
"error.message": "发生错误",
|
||||
"error.title": "错误",
|
||||
"update.checkingUpdate": "检查新版本",
|
||||
"update.checkingUpdateDesc": "正在获取版本信息…",
|
||||
"update.downloadAndInstall": "下载并安装",
|
||||
"update.downloadComplete": "下载完成",
|
||||
"update.downloadCompleteMessage": "已下载更新。现在安装吗?",
|
||||
"update.downloadNewVersion": "下载新版本",
|
||||
"update.downloadingUpdate": "正在下载更新",
|
||||
"update.downloadingUpdateDesc": "更新正在下载中,请稍候…",
|
||||
"update.installLater": "稍后安装",
|
||||
"update.installNow": "立即安装",
|
||||
"update.isLatestVersion": "当前已是最新版本",
|
||||
"update.isLatestVersionDesc": "当前版本({{version}})已是最新。",
|
||||
"update.later": "稍后提醒",
|
||||
"update.newVersion": "发现新版本",
|
||||
"update.newVersionAvailable": "发现新版本:{{version}}",
|
||||
"update.newVersionAvailableDesc": "发现新版本 {{version}},是否立即下载?",
|
||||
"update.restartAndInstall": "安装更新并重启",
|
||||
"update.skipThisVersion": "跳过此版本",
|
||||
"update.updateError": "更新错误",
|
||||
"update.updateReady": "有新版本可用",
|
||||
"update.updateReadyDesc": "新版本 {{version}} 已下载完成,重启应用后即可完成安装。",
|
||||
"update.upgradeNow": "立即更新",
|
||||
"update.willInstallLater": "更新将在下次启动时安装",
|
||||
"waitingOAuth.cancel": "取消",
|
||||
"waitingOAuth.description": "浏览器已打开授权页面,请在浏览器中完成授权",
|
||||
"waitingOAuth.error": "授权失败: {{error}}",
|
||||
"waitingOAuth.errorTitle": "授权连接失败",
|
||||
"waitingOAuth.helpText": "如果浏览器没有自动打开,请点击取消后重新尝试",
|
||||
"waitingOAuth.retry": "重试",
|
||||
"waitingOAuth.title": "等待授权连接"
|
||||
}
|
||||
"about": {
|
||||
"button": "确定",
|
||||
"detail": "一个基于大语言模型的聊天应用",
|
||||
"message": "{{appName}} {{appVersion}}",
|
||||
"title": "关于"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "取消",
|
||||
"no": "否",
|
||||
"title": "确认",
|
||||
"yes": "是"
|
||||
},
|
||||
"error": {
|
||||
"button": "确定",
|
||||
"detail": "操作过程中发生错误,请稍后重试",
|
||||
"message": "发生错误",
|
||||
"title": "错误"
|
||||
},
|
||||
"update": {
|
||||
"downloadAndInstall": "下载并安装",
|
||||
"downloadComplete": "下载完成",
|
||||
"downloadCompleteMessage": "更新包已下载完成,是否立即安装?",
|
||||
"installLater": "稍后安装",
|
||||
"installNow": "立即安装",
|
||||
"later": "稍后提醒",
|
||||
"newVersion": "发现新版本",
|
||||
"newVersionAvailable": "发现新版本: {{version}}",
|
||||
"skipThisVersion": "跳过此版本"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,62 +1,71 @@
|
||||
{
|
||||
"common.checkUpdates": "检查更新…",
|
||||
"dev.devPanel": "开发者面板",
|
||||
"dev.devTools": "开发者工具",
|
||||
"dev.forceReload": "强制重新加载",
|
||||
"dev.openSettingsFile": "打开 Settings 配置文件",
|
||||
"dev.openStore": "打开本地数据目录",
|
||||
"dev.openUpdaterCacheDir": "更新缓存目录",
|
||||
"dev.openUserDataDir": "用户配置目录",
|
||||
"dev.refreshMenu": "刷新菜单",
|
||||
"dev.reload": "重新加载",
|
||||
"dev.simulateAutoDownload": "模拟启动后台自动下载更新(3s 下完)",
|
||||
"dev.simulateDownloadComplete": "模拟下载完成",
|
||||
"dev.simulateDownloadProgress": "模拟下载进度",
|
||||
"dev.title": "开发",
|
||||
"dev.updaterSimulation": "自动更新测试模拟",
|
||||
"edit.copy": "复制",
|
||||
"edit.cut": "剪切",
|
||||
"edit.delete": "删除",
|
||||
"edit.paste": "粘贴",
|
||||
"edit.redo": "重做",
|
||||
"edit.selectAll": "全选",
|
||||
"edit.speech": "语音",
|
||||
"edit.startSpeaking": "开始朗读",
|
||||
"edit.stopSpeaking": "停止朗读",
|
||||
"edit.title": "编辑",
|
||||
"edit.undo": "撤销",
|
||||
"file.preferences": "设置…",
|
||||
"file.quit": "退出",
|
||||
"file.title": "文件",
|
||||
"help.about": "关于",
|
||||
"help.githubRepo": "GitHub 仓库",
|
||||
"help.openConfigDir": "配置目录",
|
||||
"help.openLogsDir": "打开日志目录",
|
||||
"help.reportIssue": "反馈问题",
|
||||
"help.title": "帮助",
|
||||
"help.visitWebsite": "打开官网",
|
||||
"macOS.about": "关于 {{appName}}",
|
||||
"macOS.devTools": "LobeHub 开发者工具",
|
||||
"macOS.hide": "隐藏 {{appName}}",
|
||||
"macOS.hideOthers": "隐藏其他",
|
||||
"macOS.preferences": "偏好设置…",
|
||||
"macOS.services": "服务",
|
||||
"macOS.unhide": "全部显示",
|
||||
"tray.open": "打开 {{appName}}",
|
||||
"tray.quit": "退出",
|
||||
"tray.show": "显示 {{appName}}",
|
||||
"view.forceReload": "强制重新加载",
|
||||
"view.reload": "重新加载",
|
||||
"view.resetZoom": "重置缩放",
|
||||
"view.title": "视图",
|
||||
"view.toggleFullscreen": "切换全屏",
|
||||
"view.zoomIn": "放大",
|
||||
"view.zoomOut": "缩小",
|
||||
"window.bringAllToFront": "前置所有窗口",
|
||||
"window.close": "关闭",
|
||||
"window.front": "前置所有窗口",
|
||||
"window.minimize": "最小化",
|
||||
"window.title": "窗口",
|
||||
"window.toggleFullscreen": "切换全屏",
|
||||
"window.zoom": "缩放"
|
||||
}
|
||||
"common": {
|
||||
"checkUpdates": "检查更新..."
|
||||
},
|
||||
"dev": {
|
||||
"devPanel": "开发者面板",
|
||||
"devTools": "开发者工具",
|
||||
"forceReload": "强制重新加载",
|
||||
"openStore": "打开存储文件",
|
||||
"refreshMenu": "刷新菜单",
|
||||
"reload": "重新加载",
|
||||
"title": "开发"
|
||||
},
|
||||
"edit": {
|
||||
"copy": "复制",
|
||||
"cut": "剪切",
|
||||
"delete": "删除",
|
||||
"paste": "粘贴",
|
||||
"redo": "重做",
|
||||
"selectAll": "全选",
|
||||
"speech": "语音",
|
||||
"startSpeaking": "开始朗读",
|
||||
"stopSpeaking": "停止朗读",
|
||||
"title": "编辑",
|
||||
"undo": "撤销"
|
||||
},
|
||||
"file": {
|
||||
"preferences": "首选项",
|
||||
"quit": "退出",
|
||||
"title": "文件"
|
||||
},
|
||||
"help": {
|
||||
"about": "关于",
|
||||
"githubRepo": "GitHub 仓库",
|
||||
"reportIssue": "报告问题",
|
||||
"title": "帮助",
|
||||
"visitWebsite": "访问官网"
|
||||
},
|
||||
"macOS": {
|
||||
"about": "关于 {{appName}}",
|
||||
"devTools": "LobeHub 开发者工具",
|
||||
"hide": "隐藏 {{appName}}",
|
||||
"hideOthers": "隐藏其他",
|
||||
"preferences": "偏好设置...",
|
||||
"services": "服务",
|
||||
"unhide": "全部显示"
|
||||
},
|
||||
"tray": {
|
||||
"open": "打开 {{appName}}",
|
||||
"quit": "退出",
|
||||
"show": "显示 {{appName}}"
|
||||
},
|
||||
"view": {
|
||||
"forceReload": "强制重新加载",
|
||||
"reload": "重新加载",
|
||||
"resetZoom": "重置缩放",
|
||||
"title": "视图",
|
||||
"toggleFullscreen": "切换全屏",
|
||||
"zoomIn": "放大",
|
||||
"zoomOut": "缩小"
|
||||
},
|
||||
"window": {
|
||||
"bringAllToFront": "前置所有窗口",
|
||||
"close": "关闭",
|
||||
"front": "前置所有窗口",
|
||||
"minimize": "最小化",
|
||||
"title": "窗口",
|
||||
"toggleFullscreen": "切换全屏",
|
||||
"zoom": "缩放"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,32 @@
|
||||
{
|
||||
"actions.add": "新增",
|
||||
"actions.back": "返回",
|
||||
"actions.cancel": "取消",
|
||||
"actions.close": "關閉",
|
||||
"actions.confirm": "確認",
|
||||
"actions.delete": "刪除",
|
||||
"actions.edit": "編輯",
|
||||
"actions.more": "更多",
|
||||
"actions.next": "下一步",
|
||||
"actions.ok": "確定",
|
||||
"actions.previous": "上一步",
|
||||
"actions.refresh": "刷新",
|
||||
"actions.remove": "移除",
|
||||
"actions.retry": "重試",
|
||||
"actions.save": "儲存",
|
||||
"actions.search": "搜尋",
|
||||
"actions.submit": "提交",
|
||||
"app.description": "你的 AI 助手協作平台",
|
||||
"app.name": "LobeHub",
|
||||
"status.error": "錯誤",
|
||||
"status.info": "資訊",
|
||||
"status.loading": "載入中",
|
||||
"status.success": "成功",
|
||||
"status.warning": "警告"
|
||||
}
|
||||
"actions": {
|
||||
"add": "新增",
|
||||
"back": "返回",
|
||||
"cancel": "取消",
|
||||
"close": "關閉",
|
||||
"confirm": "確認",
|
||||
"delete": "刪除",
|
||||
"edit": "編輯",
|
||||
"more": "更多",
|
||||
"next": "下一步",
|
||||
"ok": "確定",
|
||||
"previous": "上一步",
|
||||
"refresh": "刷新",
|
||||
"remove": "移除",
|
||||
"retry": "重試",
|
||||
"save": "儲存",
|
||||
"search": "搜尋",
|
||||
"submit": "提交"
|
||||
},
|
||||
"app": {
|
||||
"description": "你的 AI 助手協作平台",
|
||||
"name": "LobeHub"
|
||||
},
|
||||
"status": {
|
||||
"error": "錯誤",
|
||||
"info": "資訊",
|
||||
"loading": "載入中",
|
||||
"success": "成功",
|
||||
"warning": "警告"
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user