@lobehub/chat 1.102.2 → 1.102.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/Dockerfile.pglite +2 -0
  3. package/apps/desktop/README.md +322 -36
  4. package/apps/desktop/README.zh-CN.md +353 -0
  5. package/apps/desktop/package.json +1 -0
  6. package/apps/desktop/resources/tray-dark.png +0 -0
  7. package/apps/desktop/resources/tray-light.png +0 -0
  8. package/apps/desktop/resources/tray.png +0 -0
  9. package/apps/desktop/src/main/const/env.ts +25 -0
  10. package/apps/desktop/src/main/core/TrayManager.ts +7 -1
  11. package/changelog/v1.json +18 -0
  12. package/locales/ar/subscription.json +24 -0
  13. package/locales/bg-BG/subscription.json +24 -0
  14. package/locales/de-DE/subscription.json +24 -0
  15. package/locales/en-US/subscription.json +24 -0
  16. package/locales/es-ES/subscription.json +24 -0
  17. package/locales/fa-IR/subscription.json +24 -0
  18. package/locales/fr-FR/subscription.json +24 -0
  19. package/locales/it-IT/subscription.json +24 -0
  20. package/locales/ja-JP/subscription.json +24 -0
  21. package/locales/ko-KR/subscription.json +24 -0
  22. package/locales/nl-NL/subscription.json +24 -0
  23. package/locales/pl-PL/subscription.json +24 -0
  24. package/locales/pt-BR/subscription.json +24 -0
  25. package/locales/ru-RU/subscription.json +24 -0
  26. package/locales/tr-TR/subscription.json +24 -0
  27. package/locales/vi-VN/subscription.json +24 -0
  28. package/locales/zh-CN/subscription.json +24 -0
  29. package/locales/zh-TW/subscription.json +24 -0
  30. package/package.json +1 -1
  31. package/packages/electron-client-ipc/README.md +55 -30
  32. package/packages/electron-client-ipc/README.zh-CN.md +73 -0
  33. package/packages/electron-server-ipc/README.md +42 -20
  34. package/packages/electron-server-ipc/README.zh-CN.md +76 -0
  35. package/packages/file-loaders/README.md +77 -51
  36. package/packages/file-loaders/README.zh-CN.md +89 -0
  37. package/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/HeaderAction.tsx +11 -8
  38. package/src/app/[variants]/(main)/chat/(workspace)/features/SettingButton.tsx +11 -8
  39. package/src/app/[variants]/(main)/chat/(workspace)/features/ShareButton/index.tsx +3 -0
  40. package/src/app/[variants]/(main)/chat/@session/_layout/Desktop/SessionHeader.tsx +3 -0
  41. package/src/features/PlanIcon/index.tsx +126 -0
  42. package/src/features/User/PlanTag.tsx +33 -25
  43. package/src/libs/model-runtime/ModelRuntime.ts +0 -8
  44. package/src/locales/default/index.ts +2 -0
  45. package/src/locales/default/subscription.ts +24 -0
  46. package/src/server/routers/async/caller.ts +0 -6
  47. package/src/types/subscription.ts +7 -0
  48. package/apps/desktop/resources/tray-icon.png +0 -0
@@ -0,0 +1,353 @@
1
+ # 🤯 LobeHub 桌面应用程序
2
+
3
+ LobeHub Desktop 是 [LobeChat](https://github.com/lobehub/lobe-chat) 的跨平台桌面应用程序,使用 Electron 构建,提供了更加原生的桌面体验和功能。
4
+
5
+ ## ✨ 功能特点
6
+
7
+ - **🌍 跨平台支持**:支持 macOS (Intel/Apple Silicon)、Windows 和 Linux 系统
8
+ - **🔄 自动更新**:内置更新机制,确保您始终使用最新版本
9
+ - **🌐 多语言支持**:完整的 i18n 支持,包含 18+ 种语言的懒加载
10
+ - **🎨 原生集成**:与操作系统深度集成,提供原生菜单、快捷键和通知
11
+ - **🔒 安全可靠**:macOS 公证认证,加密令牌存储,安全的 OAuth 流程
12
+ - **📦 多渠道发布**:提供稳定版、测试版和每日构建版本
13
+ - **⚡ 高级窗口管理**:多窗口架构,支持主题同步
14
+ - **🔗 远程服务器同步**:与远程 LobeChat 实例的安全数据同步
15
+ - **🎯 开发者工具**:内置开发面板和全面的调试工具
16
+
17
+ ## 🚀 开发环境设置
18
+
19
+ ### 前提条件
20
+
21
+ - **Node.js** 22+
22
+ - **pnpm** 10+
23
+ - **Electron** 兼容的开发环境
24
+
25
+ ### 快速开始
26
+
27
+ ```bash
28
+ # 安装依赖
29
+ pnpm install-isolated
30
+
31
+ # 启动开发服务器
32
+ pnpm electron:dev
33
+
34
+ # 类型检查
35
+ pnpm typecheck
36
+
37
+ # 运行测试
38
+ pnpm test
39
+ ```
40
+
41
+ ### 环境变量配置
42
+
43
+ 复制 `.env.desktop` 到 `.env` 并根据需要配置:
44
+
45
+ ```bash
46
+ cp .env.desktop .env
47
+ ```
48
+
49
+ > \[!WARNING]
50
+ > 在进行更改之前请备份您的 `.env` 文件,避免丢失配置。
51
+
52
+ ### 构建命令
53
+
54
+ | 命令 | 描述 |
55
+ | ------------------ | ---------------------------------- |
56
+ | `pnpm build` | 构建所有平台 |
57
+ | `pnpm build:mac` | 构建 macOS (Intel + Apple Silicon) |
58
+ | `pnpm build:win` | 构建 Windows |
59
+ | `pnpm build:linux` | 构建 Linux |
60
+ | `pnpm build-local` | 本地开发构建 |
61
+
62
+ ### 开发工作流
63
+
64
+ ```bash
65
+ # 1. 开发
66
+ pnpm electron:dev # 启动热重载开发服务器
67
+
68
+ # 2. 代码质量
69
+ pnpm lint # ESLint 检查
70
+ pnpm format # Prettier 格式化
71
+ pnpm typecheck # TypeScript 验证
72
+
73
+ # 3. 测试
74
+ pnpm test # 运行 Vitest 测试
75
+
76
+ # 4. 构建和打包
77
+ pnpm build # 生产构建
78
+ pnpm build-local # 本地测试构建
79
+ ```
80
+
81
+ ## 🎯 发布渠道
82
+
83
+ | 渠道 | 描述 | 稳定性 | 自动更新 |
84
+ | ------------------------ | ---------------------- | ------ | -------- |
85
+ | **稳定版** | 经过充分测试的正式版本 | 🟢 高 | ✅ 是 |
86
+ | **测试版 (Beta)** | 包含新功能的预发布版本 | 🟡 中 | ✅ 是 |
87
+ | **每日构建版 (Nightly)** | 包含最新更改的每日构建 | 🟠 低 | ✅ 是 |
88
+
89
+ ## 🛠 技术栈
90
+
91
+ ### 核心框架
92
+
93
+ - **Electron** `37.1.0` - 跨平台桌面框架
94
+ - **Node.js** `22+` - 后端运行时
95
+ - **TypeScript** `5.7+` - 类型安全开发
96
+ - **Vite** `6.2+` - 构建工具
97
+
98
+ ### 架构和模式
99
+
100
+ - **依赖注入** - 基于装饰器注册的 IoC 容器
101
+ - **事件驱动架构** - 进程间 IPC 通信
102
+ - **模块联邦** - 动态控制器和服务加载
103
+ - **观察者模式** - 状态管理和 UI 同步
104
+
105
+ ### 开发工具
106
+
107
+ - **Vitest** - 单元测试框架
108
+ - **ESLint** - 代码检查
109
+ - **Prettier** - 代码格式化
110
+ - **electron-builder** - 应用程序打包
111
+ - **electron-updater** - 自动更新机制
112
+
113
+ ### 安全和存储
114
+
115
+ - **Electron Safe Storage** - 加密令牌存储
116
+ - **OAuth 2.0 + PKCE** - 安全认证流程
117
+ - **electron-store** - 持久化配置
118
+ - **自定义协议处理器** - 安全回调处理
119
+
120
+ ## 🏗 架构设计
121
+
122
+ 桌面应用程序采用了复杂的依赖注入和事件驱动架构:
123
+
124
+ ### 📁 核心结构
125
+
126
+ ```
127
+ src/main/core/
128
+ ├── App.ts # 🎯 主应用程序协调器
129
+ ├── IoCContainer.ts # 🔌 依赖注入容器
130
+ ├── window/ # 🪟 窗口管理模块
131
+ │ ├── WindowThemeManager.ts # 🎨 主题同步
132
+ │ ├── WindowPositionManager.ts # 📐 位置持久化
133
+ │ ├── WindowErrorHandler.ts # ⚠️ 错误边界
134
+ │ └── WindowConfigBuilder.ts # ⚙️ 配置构建器
135
+ ├── browser/ # 🌐 浏览器管理模块
136
+ │ ├── Browser.ts # 🪟 单个窗口实例
137
+ │ └── BrowserManager.ts # 👥 多窗口协调器
138
+ ├── ui/ # 🎨 UI 系统模块
139
+ │ ├── Tray.ts # 📍 系统托盘集成
140
+ │ ├── TrayManager.ts # 🔧 托盘管理
141
+ │ ├── MenuManager.ts # 📋 原生菜单系统
142
+ │ └── ShortcutManager.ts # ⌨️ 全局快捷键
143
+ └── infrastructure/ # 🔧 基础设施服务
144
+ ├── StoreManager.ts # 💾 配置存储
145
+ ├── I18nManager.ts # 🌍 国际化
146
+ ├── UpdaterManager.ts # 📦 自动更新系统
147
+ └── StaticFileServerManager.ts # 🗂️ 本地文件服务
148
+ ```
149
+
150
+ ### 🔄 应用程序生命周期
151
+
152
+ `App.ts` 类通过几个关键阶段协调整个应用程序的生命周期:
153
+
154
+ #### 1. 🚀 初始化阶段
155
+
156
+ - **系统信息记录** - 捕获操作系统、CPU、内存和区域设置详细信息
157
+ - **存储管理器设置** - 初始化持久配置存储
158
+ - **动态模块加载** - 通过 glob 导入自动发现控制器和服务
159
+ - **IPC 事件注册** - 设置进程间通信通道
160
+
161
+ #### 2. 🏃 引导阶段
162
+
163
+ - **单实例检查** - 确保只运行一个应用程序实例
164
+ - **IPC 服务器启动** - 启动通信服务器
165
+ - **核心管理器初始化** - 按顺序初始化所有管理器:
166
+ - 🌍 国际化管理器
167
+ - 📋 原生菜单系统
168
+ - 🗂️ 本地资源服务器
169
+ - ⌨️ 全局快捷键注册
170
+ - 🪟 浏览器窗口管理
171
+ - 📍 系统托盘(仅 Windows)
172
+ - 📦 自动更新系统
173
+
174
+ ### 🔧 核心组件深度解析
175
+
176
+ #### 🌐 浏览器管理系统
177
+
178
+ - **多窗口架构** - 支持聊天、设置和开发工具窗口
179
+ - **窗口状态管理** - 处理定位、主题和生命周期
180
+ - **WebContents 映射** - WebContents 和标识符之间的双向映射
181
+ - **事件广播** - 向所有或特定窗口的集中事件分发
182
+
183
+ #### 🔌 依赖注入和事件系统
184
+
185
+ - **IoC 容器** - 基于 WeakMap 的装饰控制器方法容器
186
+ - **装饰器注册** - `@ipcClientEvent` 和 `@ipcServerEvent` 装饰器
187
+ - **自动事件映射** - 控制器加载期间注册的事件
188
+ - **服务定位器** - 类型安全的服务和控制器检索
189
+
190
+ #### 🪟 窗口管理
191
+
192
+ - **主题感知窗口** - 自动适应系统深色 / 浅色模式
193
+ - **平台特定样式** - Windows 标题栏和覆盖自定义
194
+ - **位置持久化** - 跨会话保存和恢复窗口位置
195
+ - **错误边界** - 窗口操作的集中错误处理
196
+
197
+ #### 🔧 基础设施服务
198
+
199
+ ##### 🌍 国际化管理器
200
+
201
+ - **18+ 语言支持** 懒加载和命名空间组织
202
+ - **系统集成** 与 Electron 的区域检测集成
203
+ - **动态 UI 刷新** 语言更改时的 UI 更新
204
+ - **资源管理** 高效的加载策略
205
+
206
+ ##### 📦 更新管理器
207
+
208
+ - **多渠道支持** (稳定版、测试版、每日构建)可配置间隔
209
+ - **后台下载** 进度跟踪和用户通知
210
+ - **回滚保护** 错误处理和恢复机制
211
+ - **渠道管理** 自动渠道切换
212
+
213
+ ##### 💾 存储管理器
214
+
215
+ - **类型安全存储** 使用带有 TypeScript 接口的 electron-store
216
+ - **加密机密** 通过 Electron 的安全存储 API
217
+ - **配置验证** 默认值管理
218
+ - **文件系统集成** 自动目录创建
219
+
220
+ ##### 🗂️ 静态文件服务器
221
+
222
+ - **本地 HTTP 服务器** 用于提供应用程序资源和用户文件
223
+ - **安全控制** 请求过滤和访问验证
224
+ - **文件管理** 上传、下载和删除功能
225
+ - **路径解析** 存储位置之间的智能路由
226
+
227
+ #### 🎨 UI 系统集成
228
+
229
+ - **全局快捷键** - 平台感知的键盘快捷键注册与冲突检测
230
+ - **系统托盘** - 带有上下文菜单和通知的原生集成
231
+ - **原生菜单** - 带有 i18n 的平台特定应用程序和上下文菜单
232
+ - **主题同步** - 所有 UI 组件的自动主题更新
233
+
234
+ ### 🏛 控制器和服务架构
235
+
236
+ #### 🎮 控制器模式
237
+
238
+ - **IPC 事件处理** - 通过基于装饰器的注册处理来自渲染器的事件
239
+ - **生命周期钩子** - 初始化阶段的 `beforeAppReady` 和 `afterAppReady`
240
+ - **类型安全通信** - 所有 IPC 事件和响应的强类型
241
+ - **错误边界** - 具有适当传播的全面错误处理
242
+
243
+ #### 🔧 服务模式
244
+
245
+ - **业务逻辑封装** - 关注点的清晰分离
246
+ - **依赖管理** - 通过 IoC 容器管理
247
+ - **跨控制器共享** - 通过服务定位器模式访问的服务
248
+ - **资源管理** - 适当的初始化和清理
249
+
250
+ ### 🔗 进程间通信
251
+
252
+ #### 📡 IPC 系统功能
253
+
254
+ - **双向通信** - Main↔Renderer 和 Main↔Next.js 服务器
255
+ - **类型安全事件** - 所有事件参数的 TypeScript 接口
256
+ - **上下文感知** - 事件包含用于窗口特定操作的发送者上下文
257
+ - **错误传播** - 具有适当状态码的集中错误处理
258
+
259
+ #### 🛡️ 安全功能
260
+
261
+ - **OAuth 2.0 + PKCE** - 具有状态参数验证的安全认证
262
+ - **加密令牌存储** - 在可用时使用 Electron 的安全存储 API
263
+ - **自定义协议处理器** - OAuth 流程的安全回调处理
264
+ - **请求过滤** - 网络请求和外部链接的安全控制
265
+
266
+ ## 🧪 测试
267
+
268
+ ### 测试结构
269
+
270
+ ```bash
271
+ apps/desktop/src/main/controllers/__tests__/ # 控制器单元测试
272
+ tests/ # 集成测试
273
+ ```
274
+
275
+ ### 运行测试
276
+
277
+ ```bash
278
+ pnpm test # 运行所有测试
279
+ pnpm test:watch # 监视模式
280
+ pnpm typecheck # 类型验证
281
+ ```
282
+
283
+ ### 测试覆盖
284
+
285
+ - **控制器测试** - IPC 事件处理验证
286
+ - **服务测试** - 业务逻辑验证
287
+ - **集成测试** - 端到端工作流测试
288
+ - **类型测试** - TypeScript 接口验证
289
+
290
+ ## 🔒 安全功能
291
+
292
+ ### 认证和授权
293
+
294
+ - **OAuth 2.0 流程** 使用 PKCE 进行安全令牌交换
295
+ - **状态参数验证** 防止 CSRF 攻击
296
+ - **加密令牌存储** 使用平台原生安全存储
297
+ - **自动令牌刷新** 在失败时回退到重新认证
298
+
299
+ ### 应用程序安全
300
+
301
+ - **代码签名** - macOS 公证认证以增强安全性
302
+ - **沙盒** - 对系统资源的受控访问
303
+ - **CSP 控制** - 内容安全策略管理
304
+ - **请求过滤** - 外部请求的安全控制
305
+
306
+ ### 数据保护
307
+
308
+ - **加密配置** - 敏感数据静态加密
309
+ - **安全 IPC** - 类型安全的通信通道
310
+ - **路径验证** - 安全的文件系统访问控制
311
+ - **网络安全** - HTTPS 强制和代理支持
312
+
313
+ ## 🤝 参与贡献
314
+
315
+ 桌面应用程序开发涉及复杂的跨平台考虑和原生集成。我们欢迎社区贡献来改进功能、性能和用户体验。您可以通过以下方式参与改进:
316
+
317
+ ### 如何贡献
318
+
319
+ 1. **平台支持**:增强跨平台兼容性和原生集成
320
+ 2. **性能优化**:改进应用程序启动时间、内存使用和响应性
321
+ 3. **功能开发**:添加新的桌面特定功能和能力
322
+ 4. **错误修复**:修复平台特定问题和边缘情况
323
+ 5. **安全改进**:增强安全措施和认证流程
324
+ 6. **UI/UX 增强**:改进桌面用户界面和体验
325
+
326
+ ### 贡献流程
327
+
328
+ 1. Fork [LobeChat 仓库](https://github.com/lobehub/lobe-chat)
329
+ 2. 按照我们的设置指南建立桌面开发环境
330
+ 3. 对桌面应用程序进行修改
331
+ 4. 提交 Pull Request 并描述:
332
+
333
+ - 平台兼容性测试结果
334
+ - 性能影响分析
335
+ - 安全考虑
336
+ - 用户体验改进
337
+ - 破坏性更改(如有)
338
+
339
+ ### 开发领域
340
+
341
+ - **核心架构**:依赖注入、事件系统和生命周期管理
342
+ - **窗口管理**:多窗口支持、主题同步和状态持久化
343
+ - **IPC 通信**:主进程和渲染进程之间的类型安全进程间通信
344
+ - **平台集成**:原生菜单、快捷键、通知和系统托盘
345
+ - **安全功能**:OAuth 流程、令牌加密和安全存储
346
+ - **自动更新系统**:多渠道更新和回滚机制
347
+
348
+ ## 📚 其他资源
349
+
350
+ - **开发指南**:[`Development.md`](./Development.md) - 全面的开发文档
351
+ - **架构文档**:[`/docs`](../../docs/) - 详细的技术规范
352
+ - **贡献指南**:[`CONTRIBUTING.md`](../../CONTRIBUTING.md) - 贡献指导
353
+ - **问题和支持**:[GitHub Issues](https://github.com/lobehub/lobe-chat/issues)
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "lobehub-desktop-dev",
3
3
  "version": "0.0.0",
4
+ "private": true,
4
5
  "description": "LobeHub Desktop Application",
5
6
  "homepage": "https://lobehub.com",
6
7
  "repository": {
Binary file
@@ -1,3 +1,28 @@
1
+ import os from 'node:os';
2
+
1
3
  export const isDev = process.env.NODE_ENV === 'development';
2
4
 
3
5
  export const OFFICIAL_CLOUD_SERVER = process.env.OFFICIAL_CLOUD_SERVER || 'https://lobechat.com';
6
+
7
+ export const isMac = process.platform === 'darwin';
8
+ export const isWindows = process.platform === 'win32';
9
+ export const isLinux = process.platform === 'linux';
10
+
11
+ function getIsWindows11() {
12
+ if (!isWindows) return false;
13
+ // 获取操作系统版本(如 "10.0.22621")
14
+ const release = os.release();
15
+ const parts = release.split('.');
16
+
17
+ // 主版本和次版本
18
+ const majorVersion = parseInt(parts[0], 10);
19
+ const minorVersion = parseInt(parts[1], 10);
20
+
21
+ // 构建号是第三部分
22
+ const buildNumber = parseInt(parts[2], 10);
23
+
24
+ // Windows 11 的构建号从 22000 开始
25
+ return majorVersion === 10 && minorVersion === 0 && buildNumber >= 22_000;
26
+ }
27
+
28
+ export const isWindows11 = getIsWindows11();
@@ -1,6 +1,8 @@
1
1
  import { MainBroadcastEventKey, MainBroadcastParams } from '@lobechat/electron-client-ipc';
2
+ import { nativeTheme } from 'electron';
2
3
 
3
4
  import { name } from '@/../../package.json';
5
+ import { isMac } from '@/const/env';
4
6
  import { createLogger } from '@/utils/logger';
5
7
 
6
8
  import type { App } from './App';
@@ -54,7 +56,11 @@ export default class TrayManager {
54
56
  initializeMainTray() {
55
57
  logger.debug('初始化主托盘');
56
58
  return this.retrieveOrInitialize({
57
- iconPath: 'tray-icon.png',
59
+ iconPath: isMac
60
+ ? nativeTheme.shouldUseDarkColors
61
+ ? 'tray-dark.png'
62
+ : 'tray-light.png'
63
+ : 'tray.png',
58
64
  identifier: 'main', // 使用应用图标,需要确保资源目录中有此文件
59
65
  tooltip: name, // 可以使用 app.getName() 或本地化字符串
60
66
  });
package/changelog/v1.json CHANGED
@@ -1,4 +1,22 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Update tray icon."
6
+ ]
7
+ },
8
+ "date": "2025-07-22",
9
+ "version": "1.102.4"
10
+ },
11
+ {
12
+ "children": {
13
+ "fixes": [
14
+ "Remove debug logging from ModelRuntime and async caller."
15
+ ]
16
+ },
17
+ "date": "2025-07-22",
18
+ "version": "1.102.3"
19
+ },
2
20
  {
3
21
  "children": {
4
22
  "improvements": [
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "النسخة التجارية"
6
+ },
7
+ "free": {
8
+ "title": "النسخة المجانية"
9
+ },
10
+ "hobby": {
11
+ "title": "نسخة الخدمة الذاتية"
12
+ },
13
+ "premium": {
14
+ "title": "النسخة المتقدمة"
15
+ },
16
+ "starter": {
17
+ "title": "النسخة الأساسية"
18
+ },
19
+ "ultimate": {
20
+ "title": "النسخة الاحترافية"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "Корпоративна версия"
6
+ },
7
+ "free": {
8
+ "title": "Безплатна версия"
9
+ },
10
+ "hobby": {
11
+ "title": "Самостоятелен вариант"
12
+ },
13
+ "premium": {
14
+ "title": "Напреднал"
15
+ },
16
+ "starter": {
17
+ "title": "Основна версия"
18
+ },
19
+ "ultimate": {
20
+ "title": "Професионален"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "Unternehmensversion"
6
+ },
7
+ "free": {
8
+ "title": "Kostenlose Version"
9
+ },
10
+ "hobby": {
11
+ "title": "Selbstbedienungs-Version"
12
+ },
13
+ "premium": {
14
+ "title": "Premium"
15
+ },
16
+ "starter": {
17
+ "title": "Grundversion"
18
+ },
19
+ "ultimate": {
20
+ "title": "Ultimate"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "Enterprise"
6
+ },
7
+ "free": {
8
+ "title": "Free"
9
+ },
10
+ "hobby": {
11
+ "title": "Hobby"
12
+ },
13
+ "premium": {
14
+ "title": "Premium"
15
+ },
16
+ "starter": {
17
+ "title": "Starter"
18
+ },
19
+ "ultimate": {
20
+ "title": "Ultimate"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "Versión empresarial"
6
+ },
7
+ "free": {
8
+ "title": "Versión gratuita"
9
+ },
10
+ "hobby": {
11
+ "title": "Versión de autoservicio"
12
+ },
13
+ "premium": {
14
+ "title": "Premium"
15
+ },
16
+ "starter": {
17
+ "title": "Versión básica"
18
+ },
19
+ "ultimate": {
20
+ "title": "Ultimate"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "نسخه سازمانی"
6
+ },
7
+ "free": {
8
+ "title": "نسخه رایگان"
9
+ },
10
+ "hobby": {
11
+ "title": "نسخه خودکار"
12
+ },
13
+ "premium": {
14
+ "title": "نسخه پیشرفته"
15
+ },
16
+ "starter": {
17
+ "title": "نسخه پایه"
18
+ },
19
+ "ultimate": {
20
+ "title": "نسخه حرفه‌ای"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "Version entreprise"
6
+ },
7
+ "free": {
8
+ "title": "Version gratuite"
9
+ },
10
+ "hobby": {
11
+ "title": "Version autonome"
12
+ },
13
+ "premium": {
14
+ "title": "Premium"
15
+ },
16
+ "starter": {
17
+ "title": "Version de base"
18
+ },
19
+ "ultimate": {
20
+ "title": "Ultimate"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "Versione enterprise"
6
+ },
7
+ "free": {
8
+ "title": "Versione gratuita"
9
+ },
10
+ "hobby": {
11
+ "title": "Versione autonoma"
12
+ },
13
+ "premium": {
14
+ "title": "Premium"
15
+ },
16
+ "starter": {
17
+ "title": "Versione base"
18
+ },
19
+ "ultimate": {
20
+ "title": "Ultimate"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "エンタープライズ版"
6
+ },
7
+ "free": {
8
+ "title": "無料版"
9
+ },
10
+ "hobby": {
11
+ "title": "セルフサービス版"
12
+ },
13
+ "premium": {
14
+ "title": "アドバンス版"
15
+ },
16
+ "starter": {
17
+ "title": "基本版"
18
+ },
19
+ "ultimate": {
20
+ "title": "プロ版"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "plans": {
3
+ "plan": {
4
+ "enterprise": {
5
+ "title": "기업용"
6
+ },
7
+ "free": {
8
+ "title": "무료 버전"
9
+ },
10
+ "hobby": {
11
+ "title": "셀프 서비스 버전"
12
+ },
13
+ "premium": {
14
+ "title": "프리미엄"
15
+ },
16
+ "starter": {
17
+ "title": "스타터 버전"
18
+ },
19
+ "ultimate": {
20
+ "title": "얼티메이트"
21
+ }
22
+ }
23
+ }
24
+ }