mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-18 05:18:31 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 88308675a3 |
@@ -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 需要用于数值计算或传给第三方库时
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
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,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)
|
||||
|
||||
@@ -62,9 +62,13 @@ jobs:
|
||||
|
||||
- name: Install deps
|
||||
run: bun i
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
|
||||
- name: Lint
|
||||
run: bun run lint
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=6144
|
||||
|
||||
version:
|
||||
name: Determine version
|
||||
|
||||
@@ -39,12 +39,12 @@ jobs:
|
||||
- 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 +80,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
|
||||
|
||||
@@ -143,7 +143,7 @@ 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
|
||||
@@ -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
|
||||
+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",
|
||||
|
||||
-550
@@ -2,556 +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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+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
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ module.exports = defineConfig({
|
||||
'ar',
|
||||
'bg-BG',
|
||||
'zh-TW',
|
||||
'en',
|
||||
'en-US',
|
||||
'ru-RU',
|
||||
'ja-JP',
|
||||
'ko-KR',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,116 @@
|
||||
{
|
||||
"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"
|
||||
},
|
||||
"notification": {
|
||||
"finishChatGeneration": "AI 消息已生成完毕"
|
||||
},
|
||||
"proxy": {
|
||||
"auth": "需要认证",
|
||||
"authDesc": "如果代理服务器需要用户名和密码",
|
||||
"authSettings": "认证设置",
|
||||
"basicSettings": "代理设置",
|
||||
"basicSettingsDesc": "配置代理服务器的连接参数",
|
||||
"bypass": "不使用代理的地址",
|
||||
"connectionTest": "连接测试",
|
||||
"enable": "启用代理",
|
||||
"enableDesc": "开启后将通过代理服务器访问网络",
|
||||
"password": "密码",
|
||||
"password_placeholder": "请输入密码",
|
||||
"port": "端口",
|
||||
"resetButton": "重置",
|
||||
"saveButton": "保存",
|
||||
"saveFailed": "保存失败:{{error}}",
|
||||
"saveSuccess": "代理设置保存成功",
|
||||
"server": "服务器地址",
|
||||
"testButton": "测试连接",
|
||||
"testDescription": "使用当前代理配置测试连接,验证配置是否正常工作",
|
||||
"testFailed": "连接失败",
|
||||
"testSuccessWithTime": "测试连接成功,耗时 {{time}} ms",
|
||||
"testUrl": "测试地址",
|
||||
"testUrlPlaceholder": "请输入要测试的 URL",
|
||||
"testing": "正在测试连接…",
|
||||
"type": "代理类型",
|
||||
"unsavedChanges": "你有未保存的更改",
|
||||
"username": "用户名",
|
||||
"username_placeholder": "请输入用户名",
|
||||
"validation": {
|
||||
"passwordRequired": "启用认证时密码为必填项",
|
||||
"portInvalid": "端口必须是 1 到 65535 之间的数字",
|
||||
"portRequired": "启用代理时端口为必填项",
|
||||
"serverInvalid": "请输入有效的服务器地址(IP 或域名)",
|
||||
"serverRequired": "启用代理时服务器地址为必填项",
|
||||
"typeRequired": "启用代理时代理类型为必填项",
|
||||
"usernameRequired": "启用认证时用户名为必填项"
|
||||
}
|
||||
},
|
||||
"remoteServer": {
|
||||
"authError": "授权失败: {{error}}",
|
||||
"authPending": "请在浏览器中完成授权",
|
||||
"configDesc": "连接到远程 LobeHub 服务器,启用数据同步",
|
||||
"configError": "配置出错",
|
||||
"configTitle": "配置云同步",
|
||||
"connect": "连接并授权",
|
||||
"connected": "已连接",
|
||||
"disconnect": "断开连接",
|
||||
"disconnectError": "断开连接失败",
|
||||
"disconnected": "未连接",
|
||||
"fetchError": "获取配置失败",
|
||||
"invalidUrl": "请输入有效的URL地址",
|
||||
"serverUrl": "服务器地址",
|
||||
"statusConnected": "已连接",
|
||||
"statusDisconnected": "未连接",
|
||||
"urlRequired": "请输入服务器地址"
|
||||
},
|
||||
"status": {
|
||||
"error": "错误",
|
||||
"info": "信息",
|
||||
"loading": "加载中",
|
||||
"success": "成功",
|
||||
"warning": "警告"
|
||||
},
|
||||
"sync": {
|
||||
"continue": "继续",
|
||||
"inCloud": "当前使用云端同步",
|
||||
"inLocalStorage": "当前使用本地存储",
|
||||
"isIniting": "正在初始化…",
|
||||
"lobehubCloud": {
|
||||
"description": "官方提供的云版本",
|
||||
"title": "LobeHub Cloud"
|
||||
},
|
||||
"local": {
|
||||
"description": "使用本地数据库,完全离线可用",
|
||||
"title": "本地数据库"
|
||||
},
|
||||
"mode": {
|
||||
"cloudSync": "云端同步",
|
||||
"localStorage": "本地存储",
|
||||
"title": "选择你的连接模式",
|
||||
"useSelfHosted": "使用自托管实例?"
|
||||
},
|
||||
"selfHosted": {
|
||||
"description": "自行部署的社区版本",
|
||||
"title": "自托管实例"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,44 +1,54 @@
|
||||
{
|
||||
"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": {
|
||||
"checkingUpdate": "检查新版本",
|
||||
"checkingUpdateDesc": "正在获取版本信息…",
|
||||
"downloadAndInstall": "下载并安装",
|
||||
"downloadComplete": "下载完成",
|
||||
"downloadCompleteMessage": "更新包已下载完成,是否立即安装?",
|
||||
"downloadNewVersion": "下载新版本",
|
||||
"downloadingUpdate": "正在下载更新",
|
||||
"downloadingUpdateDesc": "更新正在下载中,请稍候…",
|
||||
"installLater": "稍后安装",
|
||||
"installNow": "立即安装",
|
||||
"isLatestVersion": "当前已是最新版本",
|
||||
"isLatestVersionDesc": "非常棒,使用的版本 {{version}} 已是最前沿的版本。",
|
||||
"later": "稍后提醒",
|
||||
"newVersion": "发现新版本",
|
||||
"newVersionAvailable": "发现新版本: {{version}}",
|
||||
"newVersionAvailableDesc": "发现新版本 {{version}},是否立即下载?",
|
||||
"restartAndInstall": "安装更新并重启",
|
||||
"skipThisVersion": "跳过此版本",
|
||||
"updateError": "更新错误",
|
||||
"updateReady": "有新版本可用",
|
||||
"updateReadyDesc": "新版本 {{version}} 已下载完成,重启应用后即可完成安装。",
|
||||
"upgradeNow": "立即更新",
|
||||
"willInstallLater": "更新将在下次启动时安装"
|
||||
},
|
||||
"waitingOAuth": {
|
||||
"cancel": "取消",
|
||||
"description": "浏览器已打开授权页面,请在浏览器中完成授权",
|
||||
"error": "授权失败: {{error}}",
|
||||
"errorTitle": "授权连接失败",
|
||||
"helpText": "如果浏览器没有自动打开,请点击取消后重新尝试",
|
||||
"retry": "重试",
|
||||
"title": "等待授权连接"
|
||||
}
|
||||
}
|
||||
@@ -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": "警告"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,18 +1,18 @@
|
||||
import type { BrowserWindowOpts } from './core/browser/Browser';
|
||||
|
||||
export const BrowsersIdentifiers = {
|
||||
app: 'app',
|
||||
chat: 'chat',
|
||||
devtools: 'devtools',
|
||||
};
|
||||
|
||||
export const appBrowsers = {
|
||||
app: {
|
||||
chat: {
|
||||
autoHideMenuBar: true,
|
||||
height: 800,
|
||||
identifier: 'app',
|
||||
identifier: 'chat',
|
||||
keepAlive: true,
|
||||
minWidth: 400,
|
||||
path: '/',
|
||||
path: '/agent',
|
||||
showOnInit: true,
|
||||
titleBarStyle: 'hidden',
|
||||
vibrancy: 'under-window',
|
||||
@@ -25,7 +25,7 @@ export const appBrowsers = {
|
||||
identifier: 'devtools',
|
||||
maximizable: false,
|
||||
minWidth: 400,
|
||||
parentIdentifier: 'app',
|
||||
parentIdentifier: 'chat',
|
||||
path: '/desktop/devtools',
|
||||
titleBarStyle: 'hiddenInset',
|
||||
vibrancy: 'under-window',
|
||||
@@ -76,7 +76,7 @@ export const windowTemplates = {
|
||||
height: 600,
|
||||
keepAlive: false, // Multi-instance windows don't need to stay alive
|
||||
minWidth: 400,
|
||||
parentIdentifier: 'app',
|
||||
parentIdentifier: 'chat',
|
||||
titleBarStyle: 'hidden',
|
||||
vibrancy: 'under-window',
|
||||
width: 900,
|
||||
|
||||
@@ -138,7 +138,7 @@ export default class McpInstallController extends ControllerModule {
|
||||
|
||||
// 通过应用实例广播到前端
|
||||
if (this.app?.browserManager) {
|
||||
this.app.browserManager.broadcastToWindow('app', 'mcpInstallRequest', installRequest);
|
||||
this.app.browserManager.broadcastToWindow('chat', 'mcpInstallRequest', installRequest);
|
||||
logger.debug(`🔧 [McpInstall] Install request broadcasted successfully`);
|
||||
return true;
|
||||
} else {
|
||||
|
||||
@@ -96,8 +96,6 @@ export default class RemoteServerConfigCtr extends ControllerModule {
|
||||
const merged = this.normalizeConfig({ ...prev, ...config });
|
||||
storeManager.set('dataSyncConfig', merged);
|
||||
|
||||
this.broadcastRemoteServerConfigUpdated();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -115,16 +113,9 @@ export default class RemoteServerConfigCtr extends ControllerModule {
|
||||
// Clear tokens (if any)
|
||||
await this.clearTokens();
|
||||
|
||||
this.broadcastRemoteServerConfigUpdated();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private broadcastRemoteServerConfigUpdated() {
|
||||
logger.debug('Broadcasting remoteServerConfigUpdated event to all windows');
|
||||
this.app.browserManager.broadcastToAllWindows('remoteServerConfigUpdated', undefined);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypted tokens
|
||||
* Stored in memory for quick access, loaded from persistent storage on init.
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
import { ElectronAppState, ThemeMode } from '@lobechat/electron-client-ipc';
|
||||
import { app, nativeTheme, shell, systemPreferences } from 'electron';
|
||||
import { macOS } from 'electron-is';
|
||||
import { spawn } from 'node:child_process';
|
||||
import path from 'node:path';
|
||||
import process from 'node:process';
|
||||
|
||||
import { createLogger } from '@/utils/logger';
|
||||
|
||||
import { ControllerModule, IpcMethod } from './index';
|
||||
import fullDiskAccessAutoAddScript from './scripts/full-disk-access.applescript?raw';
|
||||
|
||||
const logger = createLogger('controllers:SystemCtr');
|
||||
|
||||
@@ -79,114 +76,17 @@ export default class SystemController extends ControllerModule {
|
||||
}
|
||||
|
||||
@IpcMethod()
|
||||
async requestScreenAccess(): Promise<boolean> {
|
||||
if (!macOS()) return true;
|
||||
|
||||
// IMPORTANT:
|
||||
// On macOS, the app may NOT appear in "Screen Recording" list until it actually
|
||||
// requests the permission once (TCC needs to register this app).
|
||||
// So we try to proactively request it first, then open System Settings for manual toggle.
|
||||
// 1) Best-effort: try Electron runtime API if available (not typed in Electron 38).
|
||||
try {
|
||||
const status = systemPreferences.getMediaAccessStatus('screen');
|
||||
if (status !== 'granted') {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
||||
await (systemPreferences as any).askForMediaAccess?.('screen');
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn('Failed to request screen recording access via systemPreferences', error);
|
||||
}
|
||||
|
||||
// 2) Reliable trigger: run a one-shot getDisplayMedia in renderer to register TCC entry.
|
||||
// This will show the OS capture picker; once the user selects/cancels, we stop tracks immediately.
|
||||
try {
|
||||
const status = systemPreferences.getMediaAccessStatus('screen');
|
||||
if (status !== 'granted') {
|
||||
const mainWindow = this.app.browserManager.getMainWindow()?.browserWindow;
|
||||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||||
const script = `
|
||||
(() => {
|
||||
const stop = (stream) => {
|
||||
try { stream.getTracks().forEach((t) => t.stop()); } catch {}
|
||||
};
|
||||
return navigator.mediaDevices.getDisplayMedia({ video: true, audio: false })
|
||||
.then((stream) => { stop(stream); return true; })
|
||||
.catch(() => false);
|
||||
})()
|
||||
`.trim();
|
||||
|
||||
await mainWindow.webContents.executeJavaScript(script, true);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn('Failed to request screen recording access via getDisplayMedia', error);
|
||||
}
|
||||
|
||||
await shell.openExternal(
|
||||
async requestScreenAccess(): Promise<void> {
|
||||
if (!macOS()) return;
|
||||
shell.openExternal(
|
||||
'x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture',
|
||||
);
|
||||
|
||||
return systemPreferences.getMediaAccessStatus('screen') === 'granted';
|
||||
}
|
||||
|
||||
@IpcMethod()
|
||||
openFullDiskAccessSettings(payload?: { autoAdd?: boolean }) {
|
||||
openFullDiskAccessSettings() {
|
||||
if (!macOS()) return;
|
||||
const { autoAdd = false } = payload || {};
|
||||
|
||||
// NOTE:
|
||||
// - Full Disk Access cannot be requested programmatically like microphone/screen.
|
||||
// - On macOS 13+ (Ventura), System Preferences is replaced by System Settings,
|
||||
// and deep links may differ. We try multiple known schemes for compatibility.
|
||||
const candidates = [
|
||||
// macOS 13+ (System Settings)
|
||||
'com.apple.settings:Privacy&path=FullDiskAccess',
|
||||
// Older macOS (System Preferences)
|
||||
'x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles',
|
||||
];
|
||||
if (autoAdd) this.tryAutoAddFullDiskAccess();
|
||||
|
||||
(async () => {
|
||||
for (const url of candidates) {
|
||||
try {
|
||||
await shell.openExternal(url);
|
||||
return;
|
||||
} catch (error) {
|
||||
logger.warn(`Failed to open Full Disk Access settings via ${url}`, error);
|
||||
}
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
/**
|
||||
* Best-effort UI automation to add this app into Full Disk Access list.
|
||||
*
|
||||
* Limitations:
|
||||
* - This uses AppleScript UI scripting (System Events) and may require the user to grant
|
||||
* additional "Automation" permission (to control System Settings).
|
||||
* - UI structure differs across macOS versions/languages; we fall back silently.
|
||||
*/
|
||||
private tryAutoAddFullDiskAccess() {
|
||||
if (!macOS()) return;
|
||||
|
||||
const exePath = app.getPath('exe');
|
||||
// /Applications/App.app/Contents/MacOS/App -> /Applications/App.app
|
||||
const appBundlePath = path.resolve(path.dirname(exePath), '..', '..');
|
||||
|
||||
// Keep the script minimal and resilient; failure should not break onboarding flow.
|
||||
const script = fullDiskAccessAutoAddScript.trim();
|
||||
|
||||
try {
|
||||
const child = spawn('osascript', ['-e', script, appBundlePath], { env: process.env });
|
||||
child.on('error', (error) => {
|
||||
logger.warn('Full Disk Access auto-add (osascript) failed to start', error);
|
||||
});
|
||||
child.on('exit', (code) => {
|
||||
logger.debug('Full Disk Access auto-add (osascript) exited', { code });
|
||||
});
|
||||
} catch (error) {
|
||||
logger.warn('Full Disk Access auto-add failed', error);
|
||||
}
|
||||
shell.openExternal('x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles');
|
||||
}
|
||||
|
||||
@IpcMethod()
|
||||
|
||||
@@ -84,7 +84,7 @@ describe('McpInstallController', () => {
|
||||
|
||||
expect(result).toBe(true);
|
||||
expect(mockBrowserManager.broadcastToWindow).toHaveBeenCalledWith(
|
||||
'app',
|
||||
'chat',
|
||||
'mcpInstallRequest',
|
||||
{
|
||||
marketId: 'lobehub',
|
||||
@@ -143,7 +143,7 @@ describe('McpInstallController', () => {
|
||||
|
||||
expect(result).toBe(true);
|
||||
expect(mockBrowserManager.broadcastToWindow).toHaveBeenCalledWith(
|
||||
'app',
|
||||
'chat',
|
||||
'mcpInstallRequest',
|
||||
{
|
||||
marketId: 'third-party',
|
||||
@@ -162,7 +162,7 @@ describe('McpInstallController', () => {
|
||||
|
||||
expect(result).toBe(true);
|
||||
expect(mockBrowserManager.broadcastToWindow).toHaveBeenCalledWith(
|
||||
'app',
|
||||
'chat',
|
||||
'mcpInstallRequest',
|
||||
{
|
||||
marketId: 'third-party',
|
||||
@@ -235,7 +235,7 @@ describe('McpInstallController', () => {
|
||||
|
||||
expect(result).toBe(true);
|
||||
expect(mockBrowserManager.broadcastToWindow).toHaveBeenCalledWith(
|
||||
'app',
|
||||
'chat',
|
||||
'mcpInstallRequest',
|
||||
expect.objectContaining({
|
||||
schema: schemaWithOptionalFields,
|
||||
|
||||
@@ -43,12 +43,7 @@ const mockStoreManager = {
|
||||
set: vi.fn(),
|
||||
};
|
||||
|
||||
const mockBrowserManager = {
|
||||
broadcastToAllWindows: vi.fn(),
|
||||
};
|
||||
|
||||
const mockApp = {
|
||||
browserManager: mockBrowserManager,
|
||||
storeManager: mockStoreManager,
|
||||
} as unknown as App;
|
||||
|
||||
|
||||
@@ -44,22 +44,6 @@ vi.mock('@/utils/logger', () => ({
|
||||
}),
|
||||
}));
|
||||
|
||||
const { spawnMock } = vi.hoisted(() => ({
|
||||
spawnMock: vi.fn(() => {
|
||||
const handlers = new Map<string, (...args: any[]) => void>();
|
||||
return {
|
||||
on: vi.fn((event: string, cb: (...args: any[]) => void) => {
|
||||
handlers.set(event, cb);
|
||||
return undefined;
|
||||
}),
|
||||
} as any;
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock('node:child_process', () => ({
|
||||
spawn: (...args: any[]) => spawnMock.call(null, ...args),
|
||||
}));
|
||||
|
||||
// Mock electron
|
||||
vi.mock('electron', () => ({
|
||||
app: {
|
||||
@@ -77,8 +61,6 @@ vi.mock('electron', () => ({
|
||||
openExternal: vi.fn().mockResolvedValue(undefined),
|
||||
},
|
||||
systemPreferences: {
|
||||
askForMediaAccess: vi.fn(async () => true),
|
||||
getMediaAccessStatus: vi.fn(() => 'not-determined'),
|
||||
isTrustedAccessibilityClient: vi.fn(() => true),
|
||||
},
|
||||
}));
|
||||
@@ -91,14 +73,6 @@ vi.mock('electron-is', () => ({
|
||||
// Mock browserManager
|
||||
const mockBrowserManager = {
|
||||
broadcastToAllWindows: vi.fn(),
|
||||
getMainWindow: vi.fn(() => ({
|
||||
browserWindow: {
|
||||
isDestroyed: vi.fn(() => false),
|
||||
webContents: {
|
||||
executeJavaScript: vi.fn(async () => true),
|
||||
},
|
||||
},
|
||||
})),
|
||||
handleAppThemeChange: vi.fn(),
|
||||
};
|
||||
|
||||
@@ -189,68 +163,6 @@ describe('SystemController', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('screen recording', () => {
|
||||
it('should request screen recording access and open System Settings on macOS', async () => {
|
||||
const { shell, systemPreferences } = await import('electron');
|
||||
|
||||
const result = await invokeIpc('system.requestScreenAccess');
|
||||
|
||||
expect(systemPreferences.getMediaAccessStatus).toHaveBeenCalledWith('screen');
|
||||
expect(systemPreferences.askForMediaAccess).toHaveBeenCalledWith('screen');
|
||||
expect(mockBrowserManager.getMainWindow).toHaveBeenCalled();
|
||||
expect(shell.openExternal).toHaveBeenCalledWith(
|
||||
'x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture',
|
||||
);
|
||||
expect(typeof result).toBe('boolean');
|
||||
});
|
||||
|
||||
it('should return true on non-macOS and not open settings', async () => {
|
||||
const { macOS } = await import('electron-is');
|
||||
const { shell, systemPreferences } = await import('electron');
|
||||
vi.mocked(macOS).mockReturnValue(false);
|
||||
|
||||
const result = await invokeIpc('system.requestScreenAccess');
|
||||
|
||||
expect(result).toBe(true);
|
||||
expect(systemPreferences.askForMediaAccess).not.toHaveBeenCalled();
|
||||
expect(shell.openExternal).not.toHaveBeenCalled();
|
||||
|
||||
// Reset
|
||||
vi.mocked(macOS).mockReturnValue(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('full disk access', () => {
|
||||
it('should try to open Full Disk Access settings with fallbacks', async () => {
|
||||
const { shell } = await import('electron');
|
||||
vi.mocked(shell.openExternal)
|
||||
.mockRejectedValueOnce(new Error('fail first'))
|
||||
.mockResolvedValueOnce(undefined);
|
||||
|
||||
await invokeIpc('system.openFullDiskAccessSettings');
|
||||
|
||||
expect(shell.openExternal).toHaveBeenCalledWith(
|
||||
'com.apple.settings:Privacy&path=FullDiskAccess',
|
||||
);
|
||||
expect(shell.openExternal).toHaveBeenCalledWith(
|
||||
'x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles',
|
||||
);
|
||||
});
|
||||
|
||||
it('should spawn osascript when autoAdd is enabled', async () => {
|
||||
const { shell } = await import('electron');
|
||||
vi.mocked(shell.openExternal).mockResolvedValueOnce(undefined);
|
||||
|
||||
await invokeIpc('system.openFullDiskAccessSettings', { autoAdd: true });
|
||||
|
||||
expect(spawnMock).toHaveBeenCalledWith(
|
||||
'osascript',
|
||||
expect.arrayContaining(['-e', expect.any(String), expect.any(String)]),
|
||||
expect.objectContaining({ env: expect.any(Object) }),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('openExternalLink', () => {
|
||||
it('should open external link', async () => {
|
||||
const { shell } = await import('electron');
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
on run argv
|
||||
set appBundlePath to item 1 of argv
|
||||
|
||||
set settingsBundleIds to {"com.apple.SystemSettings", "com.apple.systempreferences"}
|
||||
|
||||
-- Bring System Settings/Preferences to front (Ventura+ / older). If it doesn't exist, ignore.
|
||||
repeat with bundleId in settingsBundleIds
|
||||
try
|
||||
tell application id bundleId to activate
|
||||
exit repeat
|
||||
end try
|
||||
end repeat
|
||||
|
||||
tell application "System Events"
|
||||
set settingsProcess to missing value
|
||||
repeat 30 times
|
||||
repeat with bundleId in settingsBundleIds
|
||||
try
|
||||
if exists (first process whose bundle identifier is bundleId) then
|
||||
set settingsProcess to first process whose bundle identifier is bundleId
|
||||
exit repeat
|
||||
end if
|
||||
end try
|
||||
end repeat
|
||||
|
||||
if settingsProcess is not missing value then exit repeat
|
||||
delay 0.2
|
||||
end repeat
|
||||
|
||||
if settingsProcess is missing value then return "no-settings-process"
|
||||
|
||||
tell settingsProcess
|
||||
set frontmost to true
|
||||
|
||||
repeat 30 times
|
||||
if exists window 1 then exit repeat
|
||||
delay 0.2
|
||||
end repeat
|
||||
if not (exists window 1) then return "no-window"
|
||||
|
||||
-- Best-effort: find an "add" button in the front window and click it.
|
||||
set clickedAdd to false
|
||||
repeat 30 times
|
||||
try
|
||||
repeat with b in (buttons of window 1)
|
||||
set bDesc to ""
|
||||
set bName to ""
|
||||
set bTitle to ""
|
||||
try set bDesc to description of b end try
|
||||
try set bName to name of b end try
|
||||
try set bTitle to title of b end try
|
||||
|
||||
if (bDesc is "Add") or (bTitle is "Add") or (bName is "+") or (bTitle is "+") then
|
||||
click b
|
||||
set clickedAdd to true
|
||||
exit repeat
|
||||
end if
|
||||
end repeat
|
||||
end try
|
||||
|
||||
if clickedAdd is true then exit repeat
|
||||
delay 0.2
|
||||
end repeat
|
||||
|
||||
if clickedAdd is false then return "no-add-button"
|
||||
|
||||
-- Wait for open panel / sheet
|
||||
repeat 30 times
|
||||
if exists sheet 1 of window 1 then exit repeat
|
||||
delay 0.2
|
||||
end repeat
|
||||
if not (exists sheet 1 of window 1) then return "no-sheet"
|
||||
|
||||
-- Open "Go to the folder" and input the app bundle path, then confirm.
|
||||
keystroke "G" using {command down, shift down}
|
||||
delay 0.3
|
||||
keystroke appBundlePath
|
||||
key code 36
|
||||
delay 0.6
|
||||
-- Confirm "Open" in the panel (Enter usually triggers default)
|
||||
key code 36
|
||||
return "ok"
|
||||
end tell
|
||||
end tell
|
||||
end run
|
||||
@@ -5,7 +5,6 @@ import { createLogger } from '@/utils/logger';
|
||||
|
||||
import {
|
||||
AppBrowsersIdentifiers,
|
||||
BrowsersIdentifiers,
|
||||
WindowTemplateIdentifiers,
|
||||
appBrowsers,
|
||||
windowTemplates,
|
||||
@@ -30,7 +29,7 @@ export class BrowserManager {
|
||||
}
|
||||
|
||||
getMainWindow() {
|
||||
return this.retrieveByIdentifier(BrowsersIdentifiers.app);
|
||||
return this.retrieveByIdentifier('chat');
|
||||
}
|
||||
|
||||
showMainWindow() {
|
||||
|
||||
@@ -33,10 +33,10 @@ const { MockBrowser, mockAppBrowsers, mockWindowTemplates } = vi.hoisted(() => {
|
||||
return {
|
||||
MockBrowser,
|
||||
mockAppBrowsers: {
|
||||
app: {
|
||||
identifier: 'app',
|
||||
chat: {
|
||||
identifier: 'chat',
|
||||
keepAlive: true,
|
||||
path: '/app',
|
||||
path: '/chat',
|
||||
},
|
||||
settings: {
|
||||
identifier: 'settings',
|
||||
@@ -61,10 +61,6 @@ vi.mock('../Browser', () => ({
|
||||
|
||||
// Mock appBrowsers config
|
||||
vi.mock('../../../appBrowsers', () => ({
|
||||
BrowsersIdentifiers: {
|
||||
app: 'app',
|
||||
devtools: 'devtools',
|
||||
},
|
||||
appBrowsers: mockAppBrowsers,
|
||||
windowTemplates: mockWindowTemplates,
|
||||
}));
|
||||
@@ -106,10 +102,10 @@ describe('BrowserManager', () => {
|
||||
});
|
||||
|
||||
describe('getMainWindow', () => {
|
||||
it('should return app window', () => {
|
||||
it('should return chat window', () => {
|
||||
const mainWindow = manager.getMainWindow();
|
||||
|
||||
expect(mainWindow.identifier).toBe('app');
|
||||
expect(mainWindow.identifier).toBe('chat');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -117,27 +113,27 @@ describe('BrowserManager', () => {
|
||||
it('should show the main window', () => {
|
||||
manager.showMainWindow();
|
||||
|
||||
const appBrowser = manager.browsers.get('app');
|
||||
expect(appBrowser?.show).toHaveBeenCalled();
|
||||
const chatBrowser = manager.browsers.get('chat');
|
||||
expect(chatBrowser?.show).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('retrieveByIdentifier', () => {
|
||||
it('should return existing browser', () => {
|
||||
// First call creates the browser
|
||||
const browser1 = manager.retrieveByIdentifier('app');
|
||||
const browser1 = manager.retrieveByIdentifier('chat');
|
||||
// Second call should return same instance
|
||||
const browser2 = manager.retrieveByIdentifier('app');
|
||||
const browser2 = manager.retrieveByIdentifier('chat');
|
||||
|
||||
expect(browser1).toBe(browser2);
|
||||
expect(MockBrowser).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('should create static browser when not exists', () => {
|
||||
const browser = manager.retrieveByIdentifier('app');
|
||||
const browser = manager.retrieveByIdentifier('chat');
|
||||
|
||||
expect(MockBrowser).toHaveBeenCalledWith(mockAppBrowsers.app, mockApp);
|
||||
expect(browser.identifier).toBe('app');
|
||||
expect(MockBrowser).toHaveBeenCalledWith(mockAppBrowsers.chat, mockApp);
|
||||
expect(browser.identifier).toBe('chat');
|
||||
});
|
||||
|
||||
it('should throw error for non-static browser that does not exist', () => {
|
||||
@@ -192,13 +188,13 @@ describe('BrowserManager', () => {
|
||||
it('should return windows matching template prefix', () => {
|
||||
manager.createMultiInstanceWindow('popup' as any, '/path1', 'popup_1');
|
||||
manager.createMultiInstanceWindow('popup' as any, '/path2', 'popup_2');
|
||||
manager.retrieveByIdentifier('app'); // This should not be included
|
||||
manager.retrieveByIdentifier('chat'); // This should not be included
|
||||
|
||||
const popupWindows = manager.getWindowsByTemplate('popup');
|
||||
|
||||
expect(popupWindows).toContain('popup_1');
|
||||
expect(popupWindows).toContain('popup_2');
|
||||
expect(popupWindows).not.toContain('app');
|
||||
expect(popupWindows).not.toContain('chat');
|
||||
});
|
||||
|
||||
it('should return empty array when no matching windows', () => {
|
||||
@@ -232,23 +228,23 @@ describe('BrowserManager', () => {
|
||||
it('should initialize keepAlive browsers', () => {
|
||||
manager.initializeBrowsers();
|
||||
|
||||
// app has keepAlive: true, settings has keepAlive: false
|
||||
expect(manager.browsers.has('app')).toBe(true);
|
||||
// chat has keepAlive: true, settings has keepAlive: false
|
||||
expect(manager.browsers.has('chat')).toBe(true);
|
||||
expect(manager.browsers.has('settings')).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('broadcastToAllWindows', () => {
|
||||
it('should broadcast to all browsers', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
manager.retrieveByIdentifier('settings');
|
||||
|
||||
manager.broadcastToAllWindows('updateAvailable' as any, { version: '1.0.0' } as any);
|
||||
|
||||
const appBrowser = manager.browsers.get('app');
|
||||
const chatBrowser = manager.browsers.get('chat');
|
||||
const settingsBrowser = manager.browsers.get('settings');
|
||||
|
||||
expect(appBrowser?.broadcast).toHaveBeenCalledWith('updateAvailable', { version: '1.0.0' });
|
||||
expect(chatBrowser?.broadcast).toHaveBeenCalledWith('updateAvailable', { version: '1.0.0' });
|
||||
expect(settingsBrowser?.broadcast).toHaveBeenCalledWith('updateAvailable', {
|
||||
version: '1.0.0',
|
||||
});
|
||||
@@ -257,15 +253,15 @@ describe('BrowserManager', () => {
|
||||
|
||||
describe('broadcastToWindow', () => {
|
||||
it('should broadcast to specific window', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
manager.retrieveByIdentifier('settings');
|
||||
|
||||
const appBrowser = manager.browsers.get('app');
|
||||
const chatBrowser = manager.browsers.get('chat');
|
||||
const settingsBrowser = manager.browsers.get('settings');
|
||||
|
||||
manager.broadcastToWindow('app', 'updateAvailable' as any, { version: '1.0.0' } as any);
|
||||
manager.broadcastToWindow('chat', 'updateAvailable' as any, { version: '1.0.0' } as any);
|
||||
|
||||
expect(appBrowser?.broadcast).toHaveBeenCalledWith('updateAvailable', { version: '1.0.0' });
|
||||
expect(chatBrowser?.broadcast).toHaveBeenCalledWith('updateAvailable', { version: '1.0.0' });
|
||||
expect(settingsBrowser?.broadcast).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
@@ -278,35 +274,35 @@ describe('BrowserManager', () => {
|
||||
|
||||
describe('redirectToPage', () => {
|
||||
it('should load URL and show window', async () => {
|
||||
const browser = await manager.redirectToPage('app', 'agent');
|
||||
const browser = await manager.redirectToPage('chat', 'agent');
|
||||
|
||||
expect(browser.hide).toHaveBeenCalled();
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/app/agent');
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/chat/agent');
|
||||
expect(browser.show).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should handle subPath correctly', async () => {
|
||||
const browser = await manager.redirectToPage('app', 'settings/profile');
|
||||
const browser = await manager.redirectToPage('chat', 'settings/profile');
|
||||
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/app/settings/profile');
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/chat/settings/profile');
|
||||
});
|
||||
|
||||
it('should handle search parameters', async () => {
|
||||
const browser = await manager.redirectToPage('app', 'agent', 'id=123');
|
||||
const browser = await manager.redirectToPage('chat', 'agent', 'id=123');
|
||||
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/app/agent?id=123');
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/chat/agent?id=123');
|
||||
});
|
||||
|
||||
it('should handle search parameters starting with ?', async () => {
|
||||
const browser = await manager.redirectToPage('app', undefined, '?id=123');
|
||||
const browser = await manager.redirectToPage('chat', undefined, '?id=123');
|
||||
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/app?id=123');
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/chat?id=123');
|
||||
});
|
||||
|
||||
it('should handle no subPath', async () => {
|
||||
const browser = await manager.redirectToPage('app');
|
||||
const browser = await manager.redirectToPage('chat');
|
||||
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/app');
|
||||
expect(browser.loadUrl).toHaveBeenCalledWith('/chat');
|
||||
});
|
||||
|
||||
it('should throw error on failure', async () => {
|
||||
@@ -319,7 +315,7 @@ describe('BrowserManager', () => {
|
||||
hide: vi.fn(),
|
||||
identifier: options.identifier,
|
||||
loadUrl: vi.fn().mockRejectedValue(mockError),
|
||||
options: { path: '/app' },
|
||||
options: { path: '/chat' },
|
||||
show: vi.fn(),
|
||||
webContents: { id: 1 },
|
||||
}));
|
||||
@@ -327,18 +323,18 @@ describe('BrowserManager', () => {
|
||||
// Clear the browser cache
|
||||
manager.browsers.clear();
|
||||
|
||||
await expect(manager.redirectToPage('app', 'agent')).rejects.toThrow('Load failed');
|
||||
await expect(manager.redirectToPage('chat', 'agent')).rejects.toThrow('Load failed');
|
||||
});
|
||||
});
|
||||
|
||||
describe('window operations', () => {
|
||||
describe('closeWindow', () => {
|
||||
it('should close specified window', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
|
||||
manager.closeWindow('app');
|
||||
manager.closeWindow('chat');
|
||||
|
||||
const browser = manager.browsers.get('app');
|
||||
const browser = manager.browsers.get('chat');
|
||||
expect(browser?.close).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
@@ -349,33 +345,33 @@ describe('BrowserManager', () => {
|
||||
|
||||
describe('minimizeWindow', () => {
|
||||
it('should minimize specified window', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
|
||||
manager.minimizeWindow('app');
|
||||
manager.minimizeWindow('chat');
|
||||
|
||||
const browser = manager.browsers.get('app');
|
||||
const browser = manager.browsers.get('chat');
|
||||
expect(browser?.browserWindow.minimize).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('maximizeWindow', () => {
|
||||
it('should maximize when not maximized', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
const browser = manager.browsers.get('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
const browser = manager.browsers.get('chat');
|
||||
browser!.browserWindow.isMaximized = vi.fn().mockReturnValue(false);
|
||||
|
||||
manager.maximizeWindow('app');
|
||||
manager.maximizeWindow('chat');
|
||||
|
||||
expect(browser?.browserWindow.maximize).toHaveBeenCalled();
|
||||
expect(browser?.browserWindow.unmaximize).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should unmaximize when already maximized', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
const browser = manager.browsers.get('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
const browser = manager.browsers.get('chat');
|
||||
browser!.browserWindow.isMaximized = vi.fn().mockReturnValue(true);
|
||||
|
||||
manager.maximizeWindow('app');
|
||||
manager.maximizeWindow('chat');
|
||||
|
||||
expect(browser?.browserWindow.unmaximize).toHaveBeenCalled();
|
||||
expect(browser?.browserWindow.maximize).not.toHaveBeenCalled();
|
||||
@@ -385,12 +381,12 @@ describe('BrowserManager', () => {
|
||||
|
||||
describe('getIdentifierByWebContents', () => {
|
||||
it('should return identifier for known webContents', () => {
|
||||
const browser = manager.retrieveByIdentifier('app');
|
||||
const browser = manager.retrieveByIdentifier('chat');
|
||||
const webContents = browser.browserWindow.webContents;
|
||||
|
||||
const identifier = manager.getIdentifierByWebContents(webContents as any);
|
||||
|
||||
expect(identifier).toBe('app');
|
||||
expect(identifier).toBe('chat');
|
||||
});
|
||||
|
||||
it('should return null for unknown webContents', () => {
|
||||
@@ -404,15 +400,15 @@ describe('BrowserManager', () => {
|
||||
|
||||
describe('handleAppThemeChange', () => {
|
||||
it('should notify all browsers of theme change', () => {
|
||||
manager.retrieveByIdentifier('app');
|
||||
manager.retrieveByIdentifier('chat');
|
||||
manager.retrieveByIdentifier('settings');
|
||||
|
||||
manager.handleAppThemeChange();
|
||||
|
||||
const appBrowser = manager.browsers.get('app');
|
||||
const chatBrowser = manager.browsers.get('chat');
|
||||
const settingsBrowser = manager.browsers.get('settings');
|
||||
|
||||
expect(appBrowser?.handleAppThemeChange).toHaveBeenCalled();
|
||||
expect(chatBrowser?.handleAppThemeChange).toHaveBeenCalled();
|
||||
expect(settingsBrowser?.handleAppThemeChange).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { BrowserWindow, type Session } from 'electron';
|
||||
import type { Session } from 'electron';
|
||||
|
||||
import { isDev } from '@/const/env';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
|
||||
interface BackendProxyProtocolManagerOptions {
|
||||
@@ -31,15 +30,6 @@ export class BackendProxyProtocolManager {
|
||||
private readonly handledSessions = new WeakSet<Session>();
|
||||
private readonly logger = createLogger('core:BackendProxyProtocolManager');
|
||||
|
||||
private notifyAuthorizationRequired() {
|
||||
const allWindows = BrowserWindow.getAllWindows();
|
||||
for (const win of allWindows) {
|
||||
if (!win.isDestroyed()) {
|
||||
win.webContents.send('authorizationRequired');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registerWithRemoteBaseUrl(
|
||||
session: Session,
|
||||
options: BackendProxyProtocolManagerRemoteBaseOptions,
|
||||
@@ -95,9 +85,7 @@ export class BackendProxyProtocolManager {
|
||||
|
||||
const headers = new Headers(request.headers);
|
||||
const token = await options.getAccessToken();
|
||||
if (token) {
|
||||
headers.set('Oidc-Auth', token);
|
||||
}
|
||||
if (token) headers.set('Oidc-Auth', token);
|
||||
|
||||
// eslint-disable-next-line no-undef
|
||||
const requestInit: RequestInit & { duplex?: 'half' } = {
|
||||
@@ -138,18 +126,10 @@ export class BackendProxyProtocolManager {
|
||||
responseHeaders.set('Access-Control-Allow-Credentials', 'true');
|
||||
}
|
||||
|
||||
if (isDev) {
|
||||
responseHeaders.set('x-dev-oidc-auth', token);
|
||||
}
|
||||
|
||||
responseHeaders.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
||||
responseHeaders.set('Access-Control-Allow-Headers', '*');
|
||||
responseHeaders.set('X-Src-Url', rewrittenUrl);
|
||||
|
||||
if (!token && upstreamResponse.status === 401) {
|
||||
this.notifyAuthorizationRequired();
|
||||
}
|
||||
|
||||
return new Response(upstreamResponse.body, {
|
||||
headers: responseHeaders,
|
||||
status: upstreamResponse.status,
|
||||
|
||||
@@ -31,7 +31,7 @@ export class I18nManager {
|
||||
// Priority: parameter language > stored locale > system language
|
||||
const storedLocale = this.app.storeManager.get('locale', 'auto') as string;
|
||||
const defaultLanguage =
|
||||
lang || (storedLocale !== 'auto' ? storedLocale : app.getLocale()) || 'en';
|
||||
lang || (storedLocale !== 'auto' ? storedLocale : app.getLocale()) || 'en-US';
|
||||
|
||||
logger.info(
|
||||
`Initializing i18n, app locale: ${defaultLanguage}, stored locale: ${storedLocale}`,
|
||||
@@ -39,15 +39,15 @@ export class I18nManager {
|
||||
|
||||
await this.i18n.init({
|
||||
defaultNS: 'menu',
|
||||
fallbackLng: 'en',
|
||||
fallbackLng: 'en-US',
|
||||
// Load resources as needed
|
||||
initAsync: true,
|
||||
interpolation: {
|
||||
escapeValue: false,
|
||||
},
|
||||
|
||||
keySeparator: false,
|
||||
lng: defaultLanguage,
|
||||
|
||||
ns: ['menu', 'dialog', 'common'],
|
||||
partialBundledLanguages: true,
|
||||
});
|
||||
@@ -175,7 +175,6 @@ export class I18nManager {
|
||||
try {
|
||||
logger.debug(`Loading namespace: ${lng}/${ns}`);
|
||||
const resources = await loadResources(lng, ns);
|
||||
|
||||
this.i18n.addResourceBundle(lng, ns, resources, true, true);
|
||||
return true;
|
||||
} catch (error) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import log from 'electron-log';
|
||||
import { autoUpdater } from 'electron-updater';
|
||||
|
||||
import { isDev, isWindows } from '@/const/env';
|
||||
import { isDev } from '@/const/env';
|
||||
import { UPDATE_CHANNEL as channel, updaterConfig } from '@/modules/updater/configs';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
|
||||
@@ -144,16 +144,12 @@ export class UpdaterManager {
|
||||
// Close all windows first to ensure clean exit
|
||||
logger.info('Closing all windows before update installation...');
|
||||
const { BrowserWindow, app } = require('electron');
|
||||
// do not close windows and quit first
|
||||
// on Windows, window-all-closed -> app.quit()` can terminate the process before the timer fires
|
||||
if (!isWindows) {
|
||||
const allWindows = BrowserWindow.getAllWindows();
|
||||
allWindows.forEach((window) => {
|
||||
if (!window.isDestroyed()) {
|
||||
window.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
const allWindows = BrowserWindow.getAllWindows();
|
||||
allWindows.forEach((window) => {
|
||||
if (!window.isDestroyed()) {
|
||||
window.close();
|
||||
}
|
||||
});
|
||||
|
||||
// Release single instance lock before quitting
|
||||
// This ensures the new instance can acquire the lock
|
||||
|
||||
-7
@@ -21,13 +21,6 @@ const { mockProtocol, protocolHandlerRef } = vi.hoisted(() => {
|
||||
};
|
||||
});
|
||||
|
||||
vi.mock('electron-is', () => ({
|
||||
dev: vi.fn(() => false),
|
||||
macOS: vi.fn(() => false),
|
||||
windows: vi.fn(() => false),
|
||||
linux: vi.fn(() => true),
|
||||
}));
|
||||
|
||||
vi.mock('@/utils/logger', () => ({
|
||||
createLogger: () => ({
|
||||
debug: vi.fn(),
|
||||
|
||||
@@ -102,12 +102,11 @@ describe('I18nManager', () => {
|
||||
|
||||
expect(mockI18nextInstance.init).toHaveBeenCalledWith({
|
||||
defaultNS: 'menu',
|
||||
fallbackLng: 'en',
|
||||
fallbackLng: 'en-US',
|
||||
initAsync: true,
|
||||
interpolation: {
|
||||
escapeValue: false,
|
||||
},
|
||||
keySeparator: false,
|
||||
lng: 'en-US',
|
||||
ns: ['menu', 'dialog', 'common'],
|
||||
partialBundledLanguages: true,
|
||||
|
||||
@@ -76,7 +76,7 @@ export const getDesktopEnv = memoize(() =>
|
||||
MCP_TOOL_TIMEOUT: envNumber(60_000),
|
||||
|
||||
// cloud server url (can be overridden for selfhost/dev)
|
||||
OFFICIAL_CLOUD_SERVER: z.string().optional().default('https://app.lobehub.com'),
|
||||
OFFICIAL_CLOUD_SERVER: z.string().optional().default('https://lobechat.com'),
|
||||
},
|
||||
clientPrefix: 'PUBLIC_',
|
||||
client: {},
|
||||
|
||||
@@ -1,28 +1,34 @@
|
||||
const common = {
|
||||
'actions.add': 'Add',
|
||||
'actions.back': 'Back',
|
||||
'actions.cancel': 'Cancel',
|
||||
'actions.close': 'Close',
|
||||
'actions.confirm': 'Confirm',
|
||||
'actions.delete': 'Delete',
|
||||
'actions.edit': 'Edit',
|
||||
'actions.more': 'More',
|
||||
'actions.next': 'Next',
|
||||
'actions.ok': 'OK',
|
||||
'actions.previous': 'Previous',
|
||||
'actions.refresh': 'Refresh',
|
||||
'actions.remove': 'Remove',
|
||||
'actions.retry': 'Retry',
|
||||
'actions.save': 'Save',
|
||||
'actions.search': 'Search',
|
||||
'actions.submit': 'Submit',
|
||||
'app.description': 'For Collaborative Agents',
|
||||
'app.name': 'LobeHub',
|
||||
'status.error': 'Error',
|
||||
'status.info': 'Information',
|
||||
'status.loading': 'Loading',
|
||||
'status.success': 'Success',
|
||||
'status.warning': '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: '警告',
|
||||
},
|
||||
};
|
||||
|
||||
export default common;
|
||||
export default common;
|
||||
|
||||
@@ -1,25 +1,33 @@
|
||||
const dialog = {
|
||||
'about.button': 'OK',
|
||||
'about.detail': 'An LLM-powered chat app',
|
||||
'about.message': '{{appName}} {{appVersion}}',
|
||||
'about.title': 'About',
|
||||
'confirm.cancel': 'Cancel',
|
||||
'confirm.no': 'Cancel',
|
||||
'confirm.title': 'Please confirm',
|
||||
'confirm.yes': 'Continue',
|
||||
'error.button': 'OK',
|
||||
'error.detail': 'Couldn\'t complete the action. Retry or try again later.',
|
||||
'error.message': 'An error occurred',
|
||||
'error.title': 'Error',
|
||||
'update.downloadAndInstall': 'Download and Install',
|
||||
'update.downloadComplete': 'Download Complete',
|
||||
'update.downloadCompleteMessage': 'Update downloaded. Install now?',
|
||||
'update.installLater': 'Install Later',
|
||||
'update.installNow': 'Install Now',
|
||||
'update.later': 'Remind Me Later',
|
||||
'update.newVersion': 'New Version Found',
|
||||
'update.newVersionAvailable': 'New version: {{version}}',
|
||||
'update.skipThisVersion': 'Skip This Version',
|
||||
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: '跳过此版本',
|
||||
},
|
||||
};
|
||||
|
||||
export default dialog;
|
||||
export default dialog;
|
||||
|
||||
@@ -1,64 +1,73 @@
|
||||
const menu = {
|
||||
'common.checkUpdates': 'Check for updates...',
|
||||
'dev.devPanel': 'Developer Panel',
|
||||
'dev.devTools': 'Developer Tools',
|
||||
'dev.forceReload': 'Force Reload',
|
||||
'dev.openSettingsFile': 'Open Settings File',
|
||||
'dev.openStore': 'Open Data Folder',
|
||||
'dev.openUpdaterCacheDir': 'Open Updater Cache',
|
||||
'dev.openUserDataDir': 'Open User Data',
|
||||
'dev.refreshMenu': 'Refresh Menu',
|
||||
'dev.reload': 'Reload',
|
||||
'dev.simulateAutoDownload': 'Simulate Auto Download (3s)',
|
||||
'dev.simulateDownloadComplete': 'Simulate Download Complete',
|
||||
'dev.simulateDownloadProgress': 'Simulate Download Progress',
|
||||
'dev.title': 'Development',
|
||||
'dev.updaterSimulation': 'Updater Simulation',
|
||||
'edit.copy': 'Copy',
|
||||
'edit.cut': 'Cut',
|
||||
'edit.delete': 'Delete',
|
||||
'edit.paste': 'Paste',
|
||||
'edit.redo': 'Redo',
|
||||
'edit.selectAll': 'Select All',
|
||||
'edit.speech': 'Speech',
|
||||
'edit.startSpeaking': 'Start Speaking',
|
||||
'edit.stopSpeaking': 'Stop Speaking',
|
||||
'edit.title': 'Edit',
|
||||
'edit.undo': 'Undo',
|
||||
'file.preferences': 'Preferences',
|
||||
'file.quit': 'Quit',
|
||||
'file.title': 'File',
|
||||
'help.about': 'About',
|
||||
'help.githubRepo': 'GitHub Repository',
|
||||
'help.openConfigDir': 'Open Config Directory',
|
||||
'help.openLogsDir': 'Open Logs Directory',
|
||||
'help.reportIssue': 'Send Feedback',
|
||||
'help.title': 'Help',
|
||||
'help.visitWebsite': 'Open Website',
|
||||
'macOS.about': 'About {{appName}}',
|
||||
'macOS.devTools': 'LobeHub Developer Tools',
|
||||
'macOS.hide': 'Hide {{appName}}',
|
||||
'macOS.hideOthers': 'Hide Others',
|
||||
'macOS.preferences': 'Preferences...',
|
||||
'macOS.services': 'Services',
|
||||
'macOS.unhide': 'Show All',
|
||||
'tray.open': 'Open {{appName}}',
|
||||
'tray.quit': 'Quit',
|
||||
'tray.show': 'Show {{appName}}',
|
||||
'view.forceReload': 'Force Reload',
|
||||
'view.reload': 'Reload',
|
||||
'view.resetZoom': 'Reset Zoom',
|
||||
'view.title': 'View',
|
||||
'view.toggleFullscreen': 'Toggle Fullscreen',
|
||||
'view.zoomIn': 'Zoom In',
|
||||
'view.zoomOut': 'Zoom Out',
|
||||
'window.bringAllToFront': 'Bring All Windows to Front',
|
||||
'window.close': 'Close',
|
||||
'window.front': 'Bring All Windows to Front',
|
||||
'window.minimize': 'Minimize',
|
||||
'window.title': 'Window',
|
||||
'window.toggleFullscreen': 'Toggle Fullscreen',
|
||||
'window.zoom': '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: '缩放',
|
||||
},
|
||||
};
|
||||
|
||||
export default menu;
|
||||
export default menu;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { isDev } from '@/const/env';
|
||||
|
||||
/**
|
||||
* 规范化语言代码
|
||||
*/
|
||||
@@ -9,9 +11,10 @@ export const normalizeLocale = (locale: string) => {
|
||||
* 按需加载翻译资源
|
||||
*/
|
||||
export const loadResources = async (lng: string, ns: string) => {
|
||||
// All en-* locales fallback to 'en' and use default TypeScript files
|
||||
if (lng === 'en' || lng.startsWith('en-')) {
|
||||
// 开发环境下,直接使用中文源文件
|
||||
if (isDev && lng === 'zh-CN') {
|
||||
try {
|
||||
// 使用 require 加载模块,这在 Electron 中更可靠
|
||||
const { default: content } = await import(`@/locales/default/${ns}.ts`);
|
||||
|
||||
return content;
|
||||
@@ -21,10 +24,10 @@ export const loadResources = async (lng: string, ns: string) => {
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const { default: content } = await import(`@/../../resources/locales/${lng}/${ns}.json`);
|
||||
// 生产环境使用编译后的 JSON 文件
|
||||
|
||||
return content;
|
||||
try {
|
||||
return await import(`@/../../resources/locales/${lng}/${ns}.json`);
|
||||
} catch (error) {
|
||||
console.error(`无法加载翻译文件: ${lng} - ${ns}`, error);
|
||||
return {};
|
||||
|
||||
@@ -62,7 +62,7 @@ export class LinuxMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
click: () => {
|
||||
this.app.updaterManager.checkForUpdates({ manual: true });
|
||||
},
|
||||
label: t('common.checkUpdates'),
|
||||
label: t('common.checkUpdates') || '检查更新',
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
|
||||
@@ -2,7 +2,6 @@ import { Menu, app, shell } from 'electron';
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import type { App } from '@/core/App';
|
||||
import menuTranslations from '@/locales/default/menu';
|
||||
|
||||
import { MacOSMenu } from './macOS';
|
||||
|
||||
@@ -35,16 +34,53 @@ vi.mock('@/const/env', () => ({
|
||||
// Mock App instance
|
||||
const createMockApp = () => {
|
||||
const mockT = vi.fn((key: string, params?: any) => {
|
||||
let translation = menuTranslations[key as keyof typeof menuTranslations] || key;
|
||||
if (params && typeof translation === 'string') {
|
||||
Object.keys(params).forEach((paramKey) => {
|
||||
translation = translation.replace(
|
||||
new RegExp(`{{${paramKey}}}`, 'g'),
|
||||
params[paramKey] as string,
|
||||
);
|
||||
});
|
||||
}
|
||||
return translation;
|
||||
const translations: Record<string, string> = {
|
||||
'macOS.about': `About ${params?.appName || 'App'}`,
|
||||
'common.checkUpdates': 'Check for Updates',
|
||||
'macOS.preferences': 'Preferences',
|
||||
'macOS.services': 'Services',
|
||||
'macOS.hide': `Hide ${params?.appName || 'App'}`,
|
||||
'macOS.hideOthers': 'Hide Others',
|
||||
'macOS.unhide': 'Show All',
|
||||
'file.quit': 'Quit',
|
||||
'file.title': 'File',
|
||||
'file.preferences': 'Preferences',
|
||||
'window.close': 'Close Window',
|
||||
'window.title': 'Window',
|
||||
'window.minimize': 'Minimize',
|
||||
'edit.title': 'Edit',
|
||||
'edit.undo': 'Undo',
|
||||
'edit.redo': 'Redo',
|
||||
'edit.cut': 'Cut',
|
||||
'edit.copy': 'Copy',
|
||||
'edit.paste': 'Paste',
|
||||
'edit.selectAll': 'Select All',
|
||||
'edit.speech': 'Speech',
|
||||
'edit.startSpeaking': 'Start Speaking',
|
||||
'edit.stopSpeaking': 'Stop Speaking',
|
||||
'edit.delete': 'Delete',
|
||||
'view.title': 'View',
|
||||
'view.reload': 'Reload',
|
||||
'view.forceReload': 'Force Reload',
|
||||
'view.resetZoom': 'Actual Size',
|
||||
'view.zoomIn': 'Zoom In',
|
||||
'view.zoomOut': 'Zoom Out',
|
||||
'view.toggleFullscreen': 'Toggle Full Screen',
|
||||
'help.title': 'Help',
|
||||
'help.visitWebsite': 'Visit Website',
|
||||
'help.githubRepo': 'GitHub Repository',
|
||||
'help.reportIssue': 'Report Issue',
|
||||
'help.about': 'About',
|
||||
'dev.title': 'Developer',
|
||||
'dev.devPanel': 'Dev Panel',
|
||||
'dev.refreshMenu': 'Refresh Menu',
|
||||
'dev.devTools': 'Developer Tools',
|
||||
'dev.reload': 'Reload',
|
||||
'dev.forceReload': 'Force Reload',
|
||||
'tray.show': `Show ${params?.appName || 'App'}`,
|
||||
'tray.quit': 'Quit',
|
||||
};
|
||||
return translations[key] || key;
|
||||
});
|
||||
|
||||
return {
|
||||
@@ -97,20 +133,20 @@ describe('MacOSMenu', () => {
|
||||
});
|
||||
|
||||
it('should include developer menu when showDevItems is true', () => {
|
||||
macOSMenu.buildAndSetAppMenu({ showDevItems: true });
|
||||
const menu = macOSMenu.buildAndSetAppMenu({ showDevItems: true });
|
||||
|
||||
expect(Menu.buildFromTemplate).toHaveBeenCalled();
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const devMenu = template.find((item: any) => item.label === 'Development');
|
||||
const devMenu = template.find((item: any) => item.label === 'Developer');
|
||||
expect(devMenu).toBeDefined();
|
||||
});
|
||||
|
||||
it('should not include developer menu when showDevItems is false', () => {
|
||||
macOSMenu.buildAndSetAppMenu({ showDevItems: false });
|
||||
const menu = macOSMenu.buildAndSetAppMenu({ showDevItems: false });
|
||||
|
||||
expect(Menu.buildFromTemplate).toHaveBeenCalled();
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const devMenu = template.find((item: any) => item.label === 'Development');
|
||||
const devMenu = template.find((item: any) => item.label === 'Developer');
|
||||
expect(devMenu).toBeUndefined();
|
||||
});
|
||||
|
||||
@@ -193,7 +229,7 @@ describe('MacOSMenu', () => {
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const appMenu = template[0];
|
||||
const checkUpdatesItem = appMenu.submenu.find(
|
||||
(item: any) => item.label === 'Check for updates...',
|
||||
(item: any) => item.label === 'Check for Updates',
|
||||
);
|
||||
|
||||
expect(checkUpdatesItem).toBeDefined();
|
||||
@@ -206,7 +242,7 @@ describe('MacOSMenu', () => {
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const appMenu = template[0];
|
||||
const preferencesItem = appMenu.submenu.find((item: any) => item.label === 'Preferences...');
|
||||
const preferencesItem = appMenu.submenu.find((item: any) => item.label === 'Preferences');
|
||||
|
||||
expect(preferencesItem).toBeDefined();
|
||||
await preferencesItem.click();
|
||||
@@ -218,7 +254,7 @@ describe('MacOSMenu', () => {
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const helpMenu = template.find((item: any) => item.label === 'Help');
|
||||
const visitWebsiteItem = helpMenu.submenu.find((item: any) => item.label === 'Open Website');
|
||||
const visitWebsiteItem = helpMenu.submenu.find((item: any) => item.label === 'Visit Website');
|
||||
|
||||
expect(visitWebsiteItem).toBeDefined();
|
||||
await visitWebsiteItem.click();
|
||||
@@ -242,7 +278,7 @@ describe('MacOSMenu', () => {
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const helpMenu = template.find((item: any) => item.label === 'Help');
|
||||
const logsItem = helpMenu.submenu.find((item: any) => item.label === 'Open Logs Directory');
|
||||
const logsItem = helpMenu.submenu.find((item: any) => item.label === '打开日志目录');
|
||||
|
||||
expect(logsItem).toBeDefined();
|
||||
logsItem.click();
|
||||
@@ -268,7 +304,7 @@ describe('MacOSMenu', () => {
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const appMenu = template[0];
|
||||
const preferencesItem = appMenu.submenu.find((item: any) => item.label === 'Preferences...');
|
||||
const preferencesItem = appMenu.submenu.find((item: any) => item.label === 'Preferences');
|
||||
|
||||
expect(preferencesItem.accelerator).toBe('Command+,');
|
||||
});
|
||||
@@ -299,8 +335,8 @@ describe('MacOSMenu', () => {
|
||||
macOSMenu.buildAndSetAppMenu({ showDevItems: true });
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const devMenu = template.find((item: any) => item.label === 'Development');
|
||||
const devPanelItem = devMenu.submenu.find((item: any) => item.label === 'Developer Panel');
|
||||
const devMenu = template.find((item: any) => item.label === 'Developer');
|
||||
const devPanelItem = devMenu.submenu.find((item: any) => item.label === 'Dev Panel');
|
||||
|
||||
expect(devPanelItem).toBeDefined();
|
||||
});
|
||||
@@ -309,8 +345,8 @@ describe('MacOSMenu', () => {
|
||||
macOSMenu.buildAndSetAppMenu({ showDevItems: true });
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const devMenu = template.find((item: any) => item.label === 'Development');
|
||||
const devPanelItem = devMenu.submenu.find((item: any) => item.label === 'Developer Panel');
|
||||
const devMenu = template.find((item: any) => item.label === 'Developer');
|
||||
const devPanelItem = devMenu.submenu.find((item: any) => item.label === 'Dev Panel');
|
||||
|
||||
devPanelItem.click();
|
||||
expect(mockApp.browserManager.retrieveByIdentifier).toHaveBeenCalledWith('devtools');
|
||||
@@ -320,7 +356,7 @@ describe('MacOSMenu', () => {
|
||||
macOSMenu.buildAndSetAppMenu({ showDevItems: true });
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const devMenu = template.find((item: any) => item.label === 'Development');
|
||||
const devMenu = template.find((item: any) => item.label === 'Developer');
|
||||
const refreshMenuItem = devMenu.submenu.find((item: any) => item.label === 'Refresh Menu');
|
||||
|
||||
refreshMenuItem.click();
|
||||
@@ -331,8 +367,8 @@ describe('MacOSMenu', () => {
|
||||
macOSMenu.buildAndSetAppMenu({ showDevItems: true });
|
||||
|
||||
const template = (Menu.buildFromTemplate as any).mock.calls[0][0];
|
||||
const devMenu = template.find((item: any) => item.label === 'Development');
|
||||
const updaterMenu = devMenu.submenu.find((item: any) => item.label === 'Updater Simulation');
|
||||
const devMenu = template.find((item: any) => item.label === 'Developer');
|
||||
const updaterMenu = devMenu.submenu.find((item: any) => item.label === '自动更新测试模拟');
|
||||
|
||||
expect(updaterMenu).toBeDefined();
|
||||
expect(updaterMenu.submenu).toBeInstanceOf(Array);
|
||||
|
||||
@@ -69,12 +69,8 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
label: appName,
|
||||
submenu: [
|
||||
{
|
||||
click: async () => {
|
||||
const mainWindow = this.app.browserManager.getMainWindow();
|
||||
mainWindow.show();
|
||||
mainWindow.broadcast('navigate', { path: '/settings/about' });
|
||||
},
|
||||
label: t('macOS.about', { appName }),
|
||||
role: 'about',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
@@ -202,7 +198,7 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
// Optionally show an error dialog to the user
|
||||
});
|
||||
},
|
||||
label: t('help.openLogsDir'),
|
||||
label: '打开日志目录',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
@@ -213,7 +209,7 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
// Optionally show an error dialog to the user
|
||||
});
|
||||
},
|
||||
label: t('help.openConfigDir'),
|
||||
label: '配置目录',
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -243,7 +239,7 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
console.error(`[Menu] Error opening path ${userDataPath}:`, err);
|
||||
});
|
||||
},
|
||||
label: t('dev.openUserDataDir'),
|
||||
label: '用户配置目录',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
@@ -255,35 +251,35 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
console.error(`[Menu] Error opening path ${updaterCachePath}:`, err);
|
||||
});
|
||||
},
|
||||
label: t('dev.openUpdaterCacheDir'),
|
||||
label: '更新缓存目录',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this.app.storeManager.openInEditor();
|
||||
},
|
||||
label: t('dev.openSettingsFile'),
|
||||
label: '打开 Settings 配置文件',
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: t('dev.updaterSimulation'),
|
||||
label: '自动更新测试模拟',
|
||||
submenu: [
|
||||
{
|
||||
click: () => {
|
||||
this.app.updaterManager.simulateUpdateAvailable();
|
||||
},
|
||||
label: t('dev.simulateAutoDownload'),
|
||||
label: '模拟启动后台自动下载更新(3s 下完)',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this.app.updaterManager.simulateDownloadProgress();
|
||||
},
|
||||
label: t('dev.simulateDownloadProgress'),
|
||||
label: '模拟下载进度',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this.app.updaterManager.simulateUpdateDownloaded();
|
||||
},
|
||||
label: t('dev.simulateDownloadComplete'),
|
||||
label: '模拟下载完成',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -61,7 +61,7 @@ export class WindowsMenu extends BaseMenuPlatform implements IMenuPlatform {
|
||||
click: () => {
|
||||
this.app.updaterManager.checkForUpdates({ manual: true });
|
||||
},
|
||||
label: t('common.checkUpdates'),
|
||||
label: t('common.checkUpdates') || '检查更新',
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
|
||||
@@ -1,100 +1,4 @@
|
||||
[
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Update i18n."]
|
||||
},
|
||||
"date": "2026-01-02",
|
||||
"version": "2.0.0-next.190"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Migrate to new DropdownMenuV2 and showContextMenu API."]
|
||||
},
|
||||
"date": "2026-01-01",
|
||||
"version": "2.0.0-next.189"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Improve tools UI and fix Google schema compatibility."]
|
||||
},
|
||||
"date": "2026-01-01",
|
||||
"version": "2.0.0-next.188"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Add Gemini 3 Flash & Doubao Seed 1.8 models."]
|
||||
},
|
||||
"date": "2026-01-01",
|
||||
"version": "2.0.0-next.187"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Refactor oidc env to auth env."]
|
||||
},
|
||||
"date": "2026-01-01",
|
||||
"version": "2.0.0-next.186"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Update i18n."]
|
||||
},
|
||||
"date": "2026-01-01",
|
||||
"version": "2.0.0-next.185"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": ["Improve loading and local-system render."]
|
||||
},
|
||||
"date": "2026-01-01",
|
||||
"version": "2.0.0-next.184"
|
||||
},
|
||||
{
|
||||
"children": {},
|
||||
"date": "2025-12-31",
|
||||
"version": "2.0.0-next.183"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"features": ["Brand new 2.0 ui for next."]
|
||||
},
|
||||
"date": "2025-12-31",
|
||||
"version": "2.0.0-next.182"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"improvements": [
|
||||
"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."
|
||||
],
|
||||
"features": [
|
||||
"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."
|
||||
],
|
||||
"fixes": [
|
||||
"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…."
|
||||
]
|
||||
},
|
||||
"date": "2025-12-31",
|
||||
"version": "2.0.0-next.181"
|
||||
},
|
||||
{
|
||||
"children": {},
|
||||
"date": "2025-12-26",
|
||||
"version": "2.0.0-next.180"
|
||||
},
|
||||
{
|
||||
"children": {},
|
||||
"date": "2025-12-25",
|
||||
"version": "2.0.0-next.179"
|
||||
},
|
||||
{
|
||||
"children": {},
|
||||
"date": "2025-12-24",
|
||||
"version": "2.0.0-next.178"
|
||||
},
|
||||
{
|
||||
"children": {},
|
||||
"date": "2025-12-24",
|
||||
"version": "2.0.0-next.177"
|
||||
},
|
||||
{
|
||||
"children": {
|
||||
"features": ["Mobile native better auth support."]
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
## chore(i18n): Adjust Latin language locales for terminology consistency
|
||||
|
||||
This comprehensive update ensures all Latin language locales (de-DE, fr-FR, es-ES, it-IT, pt-BR, nl-NL, pl-PL) follow the microcopy style guide's terminology requirements.
|
||||
|
||||
### Changes Made
|
||||
|
||||
**Total: 557 changes across 7 Latin locales**
|
||||
|
||||
#### Primary Terminology Updates
|
||||
1. **"Plugin" → "Skill"**
|
||||
- Fixed terminology inconsistency across all Latin languages
|
||||
- UI elements now consistently use "Skill" instead of localized equivalents
|
||||
- Includes both singular and plural forms: `plugin/Skill`, `plugins/Skills`
|
||||
|
||||
2. **"LobeChat" → "LobeHub"**
|
||||
- Updated brand name references to current branding
|
||||
|
||||
3. **"Agent" Terminology Consistency**
|
||||
- French: Fixed inconsistent "Assistant" → "Agent" usage in UI elements
|
||||
- Ensured consistent terminology across all languages
|
||||
|
||||
#### Per-Locale Breakdown
|
||||
- **de-DE (German)**: 267 changes
|
||||
- **fr-FR (French)**: 94 changes (including 7 Agent→Assistant fixes)
|
||||
- **es-ES (Spanish)**: 39 changes
|
||||
- **it-IT (Italian)**: 59 changes (including 18 plugin→skill fixes)
|
||||
- **pt-BR (Portuguese)**: 58 changes
|
||||
- **nl-NL (Dutch)**: 62 changes
|
||||
- **pl-PL (Polish)**: 28 changes
|
||||
|
||||
#### Files Modified
|
||||
- All 37 locale JSON files for each language (259 total files)
|
||||
- Includes: auth.json, chat.json, common.json, discover.json, plugin.json, setting.json, etc.
|
||||
|
||||
#### Key Improvements
|
||||
1. **Fixed Terminology**: Following microcopy guide's fixed terminology rules
|
||||
2. **Brand Consistency**: Changed all brand references to "LobeHub"
|
||||
3. **Natural Localization**: Maintained natural language patterns while ensuring consistency
|
||||
4. **User Experience**: Improved consistency across all Latin language interfaces
|
||||
|
||||
### Scripts Created
|
||||
Two utility scripts for future locale maintenance:
|
||||
- `scripts/adjust-latin-locales.py` - For common.json specific adjustments
|
||||
- `scripts/adjust-latin-locales-full.py` - For comprehensive adjustments across all files
|
||||
|
||||
### Review Notes
|
||||
- All changes maintain backward compatibility
|
||||
- No breaking changes to functionality
|
||||
- JSON files validated and remain syntactically correct
|
||||
- Changes reviewed against English base for consistency
|
||||
@@ -44,14 +44,12 @@ Before connecting the desktop to your self-hosted instance, ensure that your sel
|
||||
|
||||
#### OIDC Environment Variable Configuration
|
||||
|
||||
You need to add the following two environment variables, `ENABLE_OIDC` and `JWKS_KEY`, to your self-hosted instance. You can click the button below to generate them with one click:
|
||||
You need to add the following two environment variables, `ENABLE_OIDC` and `OIDC_JWKS_KEY`, to your self-hosted instance. You can click the button below to generate them with one click:
|
||||
|
||||
<OIDCJWKs />
|
||||
|
||||
Add the generated JWK key to your environment variables.
|
||||
|
||||
<Callout>If you have already configured `OIDC_JWKS_KEY`, no changes are needed. The system will automatically fall back to `OIDC_JWKS_KEY` for backward compatibility.</Callout>
|
||||
|
||||
If you are deploying LobeChat using one-click deployment methods (such as Vercel, Railway, etc.), you need to:
|
||||
|
||||
1. Add the above environment variables to the environment variable configuration of your deployment platform.
|
||||
@@ -73,8 +71,8 @@ If you are deploying LobeChat using one-click deployment methods (such as Vercel
|
||||
|
||||
**Solution:**
|
||||
|
||||
- Confirm that you have correctly set the `ENABLE_OIDC=1` and `JWKS_KEY` environment variables.
|
||||
- Ensure that `JWKS_KEY` is in valid JSON format without extra single quotes.
|
||||
- Confirm that you have correctly set the `ENABLE_OIDC=1` and `OIDC_JWKS_KEY` environment variables.
|
||||
- Ensure that `OIDC_JWKS_KEY` is in valid JSON format without extra single quotes.
|
||||
- Check your server logs for specific error messages.
|
||||
|
||||
If you are using Nginx as a reverse proxy, the issue may be due to oversized request headers. You can try adding the following settings to your Nginx configuration:
|
||||
|
||||
@@ -42,14 +42,12 @@ LobeChat 桌面端可以与您自托管的 LobeChat 实例连接,以便您可
|
||||
|
||||
#### OIDC 环境变量配置
|
||||
|
||||
您需要在自托管实例中添加以下`ENABLE_OIDC` 和 `JWKS_KEY` 这两个环境变量,你可以点击下方按钮一键生成:
|
||||
您需要在自托管实例中添加以下`ENABLE_OIDC` 和 `OIDC_JWKS_KEY` 这两个环境变量,你可以点击下方按钮一键生成:
|
||||
|
||||
<OIDCJWKs />
|
||||
|
||||
将生成的 JWK 密钥添加到您的环境变量中。
|
||||
|
||||
<Callout>如果您之前已配置 `OIDC_JWKS_KEY`,无需修改。系统会自动回退使用 `OIDC_JWKS_KEY`(向后兼容)。</Callout>
|
||||
|
||||
如果您使用一键部署方式(如 Vercel、Railway 等平台)部署 LobeChat,您需要:
|
||||
|
||||
1. 将上述环境变量添加到部署平台的环境变量配置中
|
||||
@@ -71,8 +69,8 @@ LobeChat 桌面端可以与您自托管的 LobeChat 实例连接,以便您可
|
||||
|
||||
**解决方案:**
|
||||
|
||||
- 确认您已经正确设置了 `ENABLE_OIDC=1` 和 `JWKS_KEY` 环境变量
|
||||
- 确保 `JWKS_KEY` 是有效的 JSON 格式,没有额外的单引号
|
||||
- 确认您已经正确设置了 `ENABLE_OIDC=1` 和 `OIDC_JWKS_KEY` 环境变量
|
||||
- 确保 `OIDC_JWKS_KEY` 是有效的 JSON 格式,没有额外的单引号
|
||||
- 检查您的服务端日志,查看具体错误信息
|
||||
|
||||
如果您使用 Nginx 作为反向代理,可能是请求头太大导致的问题。可以尝试在 Nginx 配置中添加以下设置:
|
||||
|
||||
@@ -55,14 +55,6 @@ LobeChat provides a complete authentication service capability when deployed. Th
|
||||
- Default: `-`
|
||||
- Example: `google,github,microsoft,cognito`
|
||||
|
||||
#### `JWKS_KEY`
|
||||
|
||||
- Type: Required
|
||||
- Description: Generic JWKS (JSON Web Key Set) key for signing and verifying JWTs. Used for internal service authentication and other cryptographic operations. Must be a JWKS JSON string containing an RS256 RSA key pair. Falls back to `OIDC_JWKS_KEY` if not set (for backward compatibility).
|
||||
- Default: `-`
|
||||
|
||||
<OIDCJWKs />
|
||||
|
||||
### Email Service (SMTP)
|
||||
|
||||
These settings are required for email verification and password reset features.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user