Compare commits
361 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ab508705b1 | |||
| 22da6d4e6b | |||
| f3f64be9c7 | |||
| e8ddfc7397 | |||
| ed03bebc6b | |||
| 2086f742ef | |||
| 8642d3dfdb | |||
| de72121617 | |||
| 1f81dd074b | |||
| a6bc59c911 | |||
| 7d4cc1851c | |||
| 58e8dfb02b | |||
| 72fb1b489e | |||
| 13511b4d50 | |||
| 7a38488976 | |||
| 5f1a03b593 | |||
| 5f0079500b | |||
| 5c7e62b2a2 | |||
| c7e86704af | |||
| f5ae77d3d8 | |||
| f9f3636659 | |||
| ed8fe88f98 | |||
| 54814e15e4 | |||
| 7177ecfc4f | |||
| da23c0fb99 | |||
| 6525dd689b | |||
| 14dca36f35 | |||
| c372183019 | |||
| 09654b9039 | |||
| e87d4595f0 | |||
| e99f47f5ef | |||
| 8fb965fcf9 | |||
| 0ce691f6ca | |||
| 64d6f47fc0 | |||
| f1b0eb771b | |||
| 197c67d4c6 | |||
| 43dd8d2f0b | |||
| 3acf3fea36 | |||
| 69e2d0ff8e | |||
| b62a4e7f35 | |||
| 96452809c0 | |||
| 7d023da072 | |||
| 9e8a1bd956 | |||
| 2b6c6d70ae | |||
| 4e03b47a2c | |||
| 1507de6d4c | |||
| 0546dd3f37 | |||
| 3c0601bdce | |||
| dcd6190c38 | |||
| 593f388db3 | |||
| e6db53a5b7 | |||
| 0902d55c50 | |||
| ec03e49383 | |||
| a4b6520348 | |||
| dd8e4124f8 | |||
| 0ed75c134e | |||
| 720c58f351 | |||
| 1b87a5ac95 | |||
| 059f4cef02 | |||
| ec69abc51d | |||
| 236b61de20 | |||
| 16888531b0 | |||
| 5664888503 | |||
| e262925384 | |||
| 0ca4b7db24 | |||
| b4de17f8ef | |||
| 93aa9a50ae | |||
| 7a4ad5d133 | |||
| 182873b9d2 | |||
| 7329aa54aa | |||
| 3472db8110 | |||
| d2f8ef804c | |||
| e40e8cdb0d | |||
| 6effba00ed | |||
| 9b292f34e8 | |||
| b201208648 | |||
| e20a5f49a8 | |||
| 2ac8db3d0a | |||
| 5baf7e0058 | |||
| 74556d1b1f | |||
| f798aec8d7 | |||
| adfae9bf0f | |||
| a241f93782 | |||
| 2c27828c3c | |||
| 34eb80faf8 | |||
| a766ad87d7 | |||
| ea6c3ea81b | |||
| 7bef57b0e8 | |||
| 92b5ef49be | |||
| 8fb01f595a | |||
| 8bac88b6d0 | |||
| 79fa8cc574 | |||
| ce314b693c | |||
| 78d10d5ff1 | |||
| e29e4187ed | |||
| a16c337fae | |||
| 73305b3922 | |||
| c5602ee74d | |||
| 571e9ef4da | |||
| 7e42a22249 | |||
| 6a18a2f7bb | |||
| b7ea3f3a1e | |||
| a44d9e1e8b | |||
| 55a7f3f4c6 | |||
| 489c73db59 | |||
| 6f7c31c6d1 | |||
| 553d29e644 | |||
| 6f46eecc2d | |||
| 33ce9175b2 | |||
| 90766129e6 | |||
| 83dd8f7bbb | |||
| 3c07c48994 | |||
| d9963fc3de | |||
| 95ecfc0f03 | |||
| e56ff6f41d | |||
| 85b3dd872f | |||
| 92eb695bf9 | |||
| 56a00f8359 | |||
| 63cc148aac | |||
| d9cb5be5b0 | |||
| c61c95b416 | |||
| 73b0c1cf20 | |||
| ee70dfccd9 | |||
| 4c1d58102a | |||
| 89c8180694 | |||
| f34d1ffb50 | |||
| 431331b38f | |||
| 702818c17b | |||
| 7184eeaee0 | |||
| 7ff34439ca | |||
| 9b8660c78f | |||
| a1e5f23327 | |||
| 434caf00c3 | |||
| 34f2c8a192 | |||
| b7f63d3598 | |||
| 6fdbc71868 | |||
| 22fd5cc32c | |||
| 17ac2dffe9 | |||
| a6c1c9e36f | |||
| a5592d205d | |||
| 629d846d45 | |||
| cf69336aa6 | |||
| 6f7d8b7968 | |||
| d3fd5c6267 | |||
| 433515691a | |||
| 4e92d3e81d | |||
| bee7e0786f | |||
| e1b3d6b818 | |||
| a552ace21e | |||
| 1f3986b72d | |||
| eac2655d34 | |||
| 61fa81ed56 | |||
| c3e9d39dfa | |||
| fa2e81110a | |||
| a0a0b780d2 | |||
| 934279ab23 | |||
| aa75df4be7 | |||
| b3daa1a59c | |||
| df1921c65e | |||
| ae89f18a07 | |||
| 5941025eb9 | |||
| 821d3b001d | |||
| d4f6737fe9 | |||
| e45fd8fcf6 | |||
| 79c74d2a0e | |||
| c9f7aa0c28 | |||
| b4931047e0 | |||
| ddfe652eb6 | |||
| 93ea3a4a90 | |||
| 6369e8bf52 | |||
| ec7f572c35 | |||
| baf6bc10b0 | |||
| b806270f21 | |||
| 370674b8cc | |||
| 2b5bec4e48 | |||
| 195cc12be1 | |||
| 34b05755a3 | |||
| ebdd442e91 | |||
| f9cd93020c | |||
| 46a56d809b | |||
| f602ecc3f6 | |||
| c3cebc30bf | |||
| ebc62a30cb | |||
| 277799e2d5 | |||
| 4703fb3703 | |||
| 9642555318 | |||
| f33b6f162a | |||
| 7d34140a91 | |||
| af1d09da83 | |||
| 13166a24b1 | |||
| 87866ac387 | |||
| 014782d0ba | |||
| 102e2c41e0 | |||
| d3b2c792f6 | |||
| cca9b04544 | |||
| 06c3f6f255 | |||
| 4652fc2c4a | |||
| 0fb69ae068 | |||
| 1ff83a7e61 | |||
| 49557e202e | |||
| 9011d4169a | |||
| e9848cce2a | |||
| 0fce82c42b | |||
| c687111769 | |||
| ce2ac7c849 | |||
| 49e180e88b | |||
| 598646818a | |||
| afc87764ab | |||
| 30921420dc | |||
| 1c0c5c0c72 | |||
| ae9ed3cd50 | |||
| d96a5792bc | |||
| 90e48ac050 | |||
| 951c57518f | |||
| 0ef8753c75 | |||
| 6506cd7d8e | |||
| aaff1cc950 | |||
| 90c0e00e82 | |||
| 3d55c0dd2d | |||
| 1ad3b438d3 | |||
| c8ff06211a | |||
| 430d7a5138 | |||
| 0239b38038 | |||
| bd49a32ccf | |||
| 109013b6e3 | |||
| 23fd49bf09 | |||
| d4b6543220 | |||
| 88b872b62f | |||
| 8d25c95dfc | |||
| bd49702901 | |||
| bb19818f21 | |||
| 645ac37cdb | |||
| 68a2e1a4fa | |||
| e19b6d5fe1 | |||
| d4d9393789 | |||
| 0f7166685e | |||
| 0880e4590f | |||
| 8e861175c7 | |||
| 627dc76fe2 | |||
| 869ca49ba1 | |||
| f7dc6be85c | |||
| 9e2e28505e | |||
| 760957514b | |||
| ef4e0f3771 | |||
| fec639349d | |||
| 335a55c44c | |||
| f6c576b314 | |||
| 3bd6361a55 | |||
| d3554a1462 | |||
| 108607c15a | |||
| c753a60cc9 | |||
| fc971d99aa | |||
| 722013022a | |||
| 7f60e62c8a | |||
| 070a991e52 | |||
| 9bd1693882 | |||
| 08dc64b671 | |||
| 48c9589a63 | |||
| 08914f4aa4 | |||
| d4e2de81dd | |||
| e78bdb504a | |||
| ecf4ce1e14 | |||
| 04b351e0f2 | |||
| ce99a7980e | |||
| e2ada4d3a2 | |||
| 6372920786 | |||
| bcbb224b58 | |||
| 142f14956a | |||
| a2755798a9 | |||
| a98751e9b9 | |||
| 4868885aac | |||
| 2af0fc88cd | |||
| 6e2a54f4fe | |||
| c026f15834 | |||
| 70ea380205 | |||
| c90b034cf3 | |||
| d77cf05f3c | |||
| 84087c24e5 | |||
| 8ba3ce9f96 | |||
| 24606b73b0 | |||
| 64a87ccc83 | |||
| f88253c32e | |||
| f79ac666ce | |||
| 3147c65d8d | |||
| 636a035fd1 | |||
| b456eef093 | |||
| 2b2caab656 | |||
| 21ad53a51b | |||
| df862e2616 | |||
| 452a2e6b5e | |||
| f7db45e392 | |||
| 02b1efa523 | |||
| 8b8e5e4abd | |||
| 822290af9c | |||
| 8c11cbb818 | |||
| ea7b7bd1de | |||
| a5e618cfcc | |||
| 8d40478b59 | |||
| 64e290b5c6 | |||
| cdf36079d5 | |||
| 8f40ae5efd | |||
| d05b39569c | |||
| 95a62e87bf | |||
| a6eaf00302 | |||
| b7c447ba38 | |||
| 5f46880d35 | |||
| 35f8a882e8 | |||
| b7cf19f302 | |||
| 9d93c95435 | |||
| 209c436d43 | |||
| dbbf134386 | |||
| d4fc611cb2 | |||
| 23d77f784e | |||
| 4605d32639 | |||
| 477dd9e8ea | |||
| e30939da9d | |||
| d7e6e2d1ce | |||
| b95ddd990e | |||
| 47a8b6eb62 | |||
| f52ef195ba | |||
| e20b7d4b97 | |||
| 5b8574a365 | |||
| e03040a12e | |||
| e57891a89a | |||
| 37da558e71 | |||
| 2770093712 | |||
| 2e3094e4c9 | |||
| 75ced15278 | |||
| ba8274351e | |||
| 632f6ace3c | |||
| a2b11d1ee4 | |||
| 2b8d08ae25 | |||
| 26e407d324 | |||
| e3b40abc30 | |||
| 772de1ebff | |||
| 486b628975 | |||
| 32afe7d855 | |||
| 6514f2be5c | |||
| cb3e5e365a | |||
| 3788958f28 | |||
| 88ed461120 | |||
| 4f084a6ba4 | |||
| a0730799e8 | |||
| 2b687eec26 | |||
| f9fe24b896 | |||
| c205df5cb6 | |||
| 1e7dcf3840 | |||
| 85a61f628a | |||
| 434f1bffa1 | |||
| 1503ac5096 | |||
| 3d1b513c45 | |||
| a2d470b9d2 | |||
| 9f017cce0d | |||
| 459ec162de | |||
| a65af38653 | |||
| 79dec7a8e7 | |||
| fb1e1ca423 | |||
| bbb7d90fc6 | |||
| 00960c7ff6 | |||
| a0d5732108 | |||
| 1ead26f82a |
@@ -93,7 +93,6 @@ robots.txt
|
||||
.husky/prepare-commit-msg
|
||||
|
||||
# Documents and media
|
||||
*.patch
|
||||
*.pdf
|
||||
|
||||
# Cloud service keys
|
||||
@@ -118,3 +117,7 @@ CLAUDE.local.md
|
||||
prd
|
||||
GEMINI.md
|
||||
e2e/reports
|
||||
|
||||
# local eas account key for android
|
||||
service-account-key.json
|
||||
|
||||
|
||||
@@ -1,2 +1,8 @@
|
||||
npm run type-check
|
||||
|
||||
# Check if there are changes in apps/mobile directory
|
||||
if git diff --cached --name-only | grep -q "^apps/mobile/"; then
|
||||
(cd apps/mobile && npm run type-check)
|
||||
fi
|
||||
|
||||
npx --no-install lint-staged
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# API Integration and Services
|
||||
|
||||
## Service Architecture
|
||||
|
||||
The app integrates with various APIs and services for chat functionality and data management.
|
||||
|
||||
### Core Services
|
||||
|
||||
#### Session Service
|
||||
- [services/session.ts](mdc:services/session.ts) - Session management API
|
||||
- [services/type.ts](mdc:services/type.ts) - Service type definitions
|
||||
- [services/mock/](mdc:services/mock) - Mock data for development
|
||||
- [services/mock/getGroupedSessions.json](mdc:services/mock/getGroupedSessions.json) - Mock session data
|
||||
|
||||
#### OpenAI Integration
|
||||
- [store/openai.ts](mdc:store/openai.ts) - OpenAI configuration store
|
||||
- Manages API keys and proxy settings
|
||||
- Persists configuration in AsyncStorage
|
||||
|
||||
### API Utilities
|
||||
|
||||
#### HTTP Utilities
|
||||
- [utils/fetchSSE.ts](mdc:utils/fetchSSE.ts) - Server-Sent Events implementation
|
||||
- [utils/trpc.ts](mdc:utils/trpc.ts) - tRPC client configuration
|
||||
- [utils/jwt.ts](mdc:utils/jwt.ts) - JWT token handling
|
||||
|
||||
#### Data Processing
|
||||
- [utils/merge.ts](mdc:utils/merge.ts) - Deep merge utility
|
||||
- [utils/componentScanner.ts](mdc:utils/componentScanner.ts) - Component scanning utilities
|
||||
|
||||
|
||||
## Chat Integration
|
||||
|
||||
### OpenAI API
|
||||
- Uses Server-Sent Events for streaming responses
|
||||
- Supports multiple models and configurations
|
||||
- Handles API key management and proxy settings
|
||||
|
||||
### Message Handling
|
||||
- Real-time message streaming
|
||||
- Error handling and retry logic
|
||||
- Message persistence in local storage
|
||||
|
||||
## Data Flow Patterns
|
||||
|
||||
### State Management Integration
|
||||
```typescript
|
||||
// Store updates trigger API calls
|
||||
const sendMessage = async (message: string) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const response = await api.sendMessage(message);
|
||||
updateChatState(response);
|
||||
} catch (error) {
|
||||
handleError(error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
- Implement proper error boundaries
|
||||
- Show user-friendly error messages
|
||||
- Retry failed requests with exponential backoff
|
||||
- Log errors for debugging
|
||||
|
||||
### Loading States
|
||||
- Show loading indicators during API calls
|
||||
- Implement skeleton screens for better UX
|
||||
- Handle partial loading states
|
||||
|
||||
## Development Patterns
|
||||
|
||||
### Mock Data
|
||||
- Use mock services during development
|
||||
- [services/mock/](mdc:services/mock) - Mock data files
|
||||
- Switch between mock and real APIs easily
|
||||
|
||||
### Environment Configuration
|
||||
- Use environment variables for API keys
|
||||
- Support different environments (dev, staging, prod)
|
||||
- Secure sensitive configuration
|
||||
|
||||
### API Versioning
|
||||
- Support multiple API versions
|
||||
- Implement graceful deprecation
|
||||
- Maintain backward compatibility
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### API Key Management
|
||||
- Never commit API keys to version control
|
||||
- Use secure storage for sensitive data
|
||||
- Implement proper key rotation
|
||||
|
||||
### Data Validation
|
||||
- Validate all API responses
|
||||
- Use TypeScript for type safety
|
||||
- Implement input sanitization
|
||||
|
||||
### Network Security
|
||||
- Use HTTPS for all API calls
|
||||
- Implement certificate pinning if needed
|
||||
- Handle network errors gracefully
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# App Structure and Routing
|
||||
|
||||
## Expo Router File Structure
|
||||
|
||||
The app uses Expo Router with file-based routing. Each directory represents a route group or screen.
|
||||
|
||||
### Main Routes
|
||||
- [src/app/index.tsx](mdc:src/app/index.tsx) - Root redirect logic (signed in → session, signed out → sign-in)
|
||||
- [src/app/_layout.tsx](mdc:src/app/_layout.tsx) - Root layout with providers ( Toast, Portal, ActionSheet)
|
||||
|
||||
### Chat Routes
|
||||
- [src/app/(chat)/_layout.tsx](mdc:src/app/(chat)/_layout.tsx) - Chat layout with bottom tabs
|
||||
- [src/app/(chat)/session/index.tsx](mdc:src/app/(chat)/session/index.tsx) - Session list screen
|
||||
- [src/app/(chat)/session/_layout.tsx](mdc:src/app/(chat)/session/_layout.tsx) - Session layout
|
||||
- [src/app/(chat)/chat/index.tsx](mdc:src/app/(chat)/chat/index.tsx) - Main chat interface
|
||||
- [src/app/(chat)/chat/_layout.tsx](mdc:src/app/(chat)/chat/_layout.tsx) - Chat layout
|
||||
- [src/app/(chat)/detail/index.tsx](mdc:src/app/(chat)/detail/index.tsx) - Chat detail view
|
||||
- [src/app/(chat)/detail/_layout.tsx](mdc:src/app/(chat)/detail/_layout.tsx) - Detail layout
|
||||
|
||||
### Settings Routes
|
||||
- [src/app/(setting)/_layout.tsx](mdc:src/app/(setting)/_layout.tsx) - Settings layout
|
||||
- [src/app/(setting)/setting/index.tsx](mdc:src/app/(setting)/setting/index.tsx) - Settings screen
|
||||
- [src/app/(setting)/setting/_layout.tsx](mdc:src/app/(setting)/setting/_layout.tsx) - Settings layout
|
||||
- [src/app/(setting)/setting/provider.tsx](mdc:src/app/(setting)/setting/provider.tsx) - Settings provider
|
||||
|
||||
### Playground Routes
|
||||
- [src/app/playground/_layout.tsx](mdc:src/app/playground/_layout.tsx) - Playground layout
|
||||
- [src/app/playground/index.tsx](mdc:src/app/playground/index.tsx) - Component playground
|
||||
- [src/app/playground/highlighter.tsx](mdc:src/app/playground/highlighter.tsx) - Code highlighting demo
|
||||
- [src/app/playground/markdown.tsx](mdc:src/app/playground/markdown.tsx) - Markdown rendering demo
|
||||
- [src/app/playground/toast.tsx](mdc:src/app/playground/toast.tsx) - Toast notifications demo
|
||||
- [src/app/playground/tooltip.tsx](mdc:src/app/playground/tooltip.tsx) - Tooltip component demo
|
||||
|
||||
## Route Groups
|
||||
- `(chat)` - Main chat functionality
|
||||
- `(setting)` - App settings and configuration
|
||||
- `playground` - Component development and testing
|
||||
|
||||
## Navigation Patterns
|
||||
- Use `Redirect` component for programmatic navigation
|
||||
- Use bottom tabs for main navigation in chat section
|
||||
@@ -0,0 +1,288 @@
|
||||
---
|
||||
description: 组件导入规范 - demos 和组件内部的导入路径规范
|
||||
globs: src/components/**/*.tsx,src/components/**/*.ts
|
||||
---
|
||||
|
||||
# 组件导入规范
|
||||
|
||||
本规范定义了 LobeChat Mobile 组件库中不同文件类型应该如何导入依赖。
|
||||
|
||||
## 规范概述
|
||||
|
||||
### 1. Demo 文件 (`demos/*.tsx`)
|
||||
|
||||
**✅ 正确做法:从 `@lobehub/ui-rn` 导入所有公开组件**
|
||||
|
||||
```tsx
|
||||
// demos/basic.tsx
|
||||
import { Button, Space, Text, useTheme } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
import { View } from 'react-native';
|
||||
|
||||
export default () => {
|
||||
const token = useTheme();
|
||||
return (
|
||||
<Space gap={16}>
|
||||
<Button>示例按钮</Button>
|
||||
<Text>示例文本</Text>
|
||||
</Space>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**❌ 错误做法:使用 `@/components` 路径**
|
||||
|
||||
```tsx
|
||||
// ❌ 不要这样做
|
||||
import Text from '@/components/Text';
|
||||
import { useTheme } from '@/components/styles';
|
||||
```
|
||||
|
||||
### 2. 组件主文件 (`ComponentName.tsx`)
|
||||
|
||||
**✅ 正确做法:使用相对路径引用其他组件**
|
||||
|
||||
```tsx
|
||||
// Card/Card.tsx
|
||||
import React from 'react';
|
||||
import Block from '../Block'; // ✅ 相对路径
|
||||
import Text from '../Text'; // ✅ 相对路径
|
||||
|
||||
import { useStyles } from './style';
|
||||
import type { CardProps } from './type';
|
||||
```
|
||||
|
||||
**❌ 错误做法:使用绝对路径 `@/components`**
|
||||
|
||||
```tsx
|
||||
// ❌ 不要这样做
|
||||
import Block from '@/components/Block';
|
||||
import Text from '@/components/Text';
|
||||
```
|
||||
|
||||
### 3. 样式文件 (`style.ts`)
|
||||
|
||||
**✅ 正确做法:使用 `@/components/styles` 导入主题工具**
|
||||
|
||||
```tsx
|
||||
// style.ts
|
||||
import { createStyles } from '@/components/styles'; // ✅ 允许
|
||||
|
||||
export const useStyles = createStyles(({ token, stylish }) => ({
|
||||
root: {
|
||||
backgroundColor: token.colorBgContainer,
|
||||
},
|
||||
}));
|
||||
```
|
||||
|
||||
### 4. 类型文件 (`type.ts`)
|
||||
|
||||
**✅ 正确做法:使用相对路径引用其他组件的类型**
|
||||
|
||||
```tsx
|
||||
// Card/type.ts
|
||||
import type { BlockProps } from '../Block'; // ✅ 相对路径
|
||||
import type { ViewProps } from 'react-native';
|
||||
|
||||
export interface CardProps extends ViewProps {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**❌ 错误做法:使用绝对路径**
|
||||
|
||||
```tsx
|
||||
// ❌ 不要这样做
|
||||
import type { BlockProps } from '@/components/Block';
|
||||
```
|
||||
|
||||
## 导入顺序规范
|
||||
|
||||
遵循以下导入顺序:
|
||||
|
||||
```tsx
|
||||
// 1. 外部库 - React 相关
|
||||
import React, { useState, useCallback } from 'react';
|
||||
import { View, Text } from 'react-native';
|
||||
|
||||
// 2. 外部库 - 第三方库
|
||||
import { Lucide } from '@lobehub/ui';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
// 3. 内部组件 (demos 使用 @lobehub/ui-rn)
|
||||
import { Button, Space, Text, useTheme } from '@lobehub/ui-rn';
|
||||
|
||||
// 4. 相对路径导入 (组件内部使用)
|
||||
import { useStyles } from './style';
|
||||
import type { ComponentProps } from './type';
|
||||
```
|
||||
|
||||
## 常见场景示例
|
||||
|
||||
### Demo 文件完整示例
|
||||
|
||||
```tsx
|
||||
// demos/basic.tsx
|
||||
import { Button, Space, Text } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
|
||||
export default () => {
|
||||
return (
|
||||
<Space gap={16}>
|
||||
<Button type="primary">主要按钮</Button>
|
||||
<Button type="default">默认按钮</Button>
|
||||
</Space>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
### 组件文件完整示例
|
||||
|
||||
```tsx
|
||||
// Alert/index.tsx
|
||||
import React, { memo } from 'react';
|
||||
import { View } from 'react-native';
|
||||
|
||||
// 相对路径引用其他组件
|
||||
import ActionIcon from '../ActionIcon';
|
||||
import Icon from '../Icon';
|
||||
import Text from '../Text';
|
||||
|
||||
// 本地文件
|
||||
import { useStyles } from './style';
|
||||
import type { AlertProps } from './type';
|
||||
|
||||
const Alert = memo<AlertProps>((props) => {
|
||||
// ...
|
||||
});
|
||||
|
||||
export default Alert;
|
||||
```
|
||||
|
||||
### 包含 Theme 的示例
|
||||
|
||||
```tsx
|
||||
// demos/advanced.tsx
|
||||
import { Button, Text, useTheme } from '@lobehub/ui-rn'; // ✅ 从 @lobehub/ui-rn 导入
|
||||
import React from 'react';
|
||||
import { View } from 'react-native';
|
||||
|
||||
export default () => {
|
||||
const token = useTheme(); // 使用主题 token
|
||||
|
||||
return (
|
||||
<View style={{ padding: token.padding }}>
|
||||
<Text>示例内容</Text>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
## 特殊情况
|
||||
|
||||
### 1. ThemeProvider 内部文件
|
||||
|
||||
ThemeProvider 模块内部可以使用绝对路径引用自己的子模块:
|
||||
|
||||
```tsx
|
||||
// ThemeProvider/getDesignToken.ts
|
||||
import { lightAlgorithm } from '@/components/styles/algorithm/light'; // ✅ 允许
|
||||
import type { AliasToken } from '@/components/styles/interface'; // ✅ 允许
|
||||
```
|
||||
|
||||
### 2. 工具函数和类型
|
||||
|
||||
非组件的工具文件可以使用 `@/components/styles`:
|
||||
|
||||
```tsx
|
||||
// theme/createStyles.ts
|
||||
import type { ThemeAppearance } from '@/components/ThemeProvider/types'; // ✅ 允许
|
||||
```
|
||||
|
||||
## 验证命令
|
||||
|
||||
使用以下命令验证导入规范:
|
||||
|
||||
```bash
|
||||
# 检查 demos 文件中的 @/components 引用(应该为 0)
|
||||
find src/components -path "*/demos/*.tsx" -exec grep -l "@/components" {} \;
|
||||
|
||||
# 检查组件间的绝对路径引用(应该很少)
|
||||
grep -r "from '@/components/[A-Z]" src/components --include="*.tsx" --exclude-dir="demos"
|
||||
```
|
||||
|
||||
## 自动修复脚本
|
||||
|
||||
如果发现违反规范的导入,可以使用以下脚本修复:
|
||||
|
||||
```javascript
|
||||
// fix-imports.js
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// 检测并修复 demos 文件
|
||||
function fixDemoImports(filePath) {
|
||||
let content = fs.readFileSync(filePath, 'utf-8');
|
||||
|
||||
// 将 @/components/ComponentName 改为从 @lobehub/ui-rn 导入
|
||||
content = content.replace(
|
||||
/import\s+(\w+)\s+from\s+['"]@\/components\/(\w+)['"]/g,
|
||||
(match, name, component) => {
|
||||
// 添加到 @lobehub/ui-rn 导入中
|
||||
return `// import ${name} from '@lobehub/ui-rn'`;
|
||||
}
|
||||
);
|
||||
|
||||
fs.writeFileSync(filePath, content);
|
||||
}
|
||||
```
|
||||
|
||||
## 常见错误和解决方案
|
||||
|
||||
### 错误 1: Demo 文件使用 `@/components`
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import Text from '@/components/Text';
|
||||
|
||||
// ✅ 修复
|
||||
import { Text } from '@lobehub/ui-rn';
|
||||
```
|
||||
|
||||
### 错误 2: 组件文件使用绝对路径引用其他组件
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import Block from '@/components/Block';
|
||||
|
||||
// ✅ 修复
|
||||
import Block from '../Block';
|
||||
```
|
||||
|
||||
### 错误 3: 重复导入
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import { Button } from '@lobehub/ui-rn';
|
||||
import Button from '../../Button';
|
||||
|
||||
// ✅ 修复 - 只保留一个
|
||||
import { Button } from '@lobehub/ui-rn'; // demos 中
|
||||
// 或
|
||||
import Button from '../../Button'; // 组件内部
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
| 文件类型 | 导入其他组件 | 导入 Theme | 示例 |
|
||||
|---------|------------|-----------|------|
|
||||
| `demos/*.tsx` | `@lobehub/ui-rn` | `@lobehub/ui-rn` | `import { Button, useTheme } from '@lobehub/ui-rn'` |
|
||||
| `ComponentName.tsx` | 相对路径 | 相对路径或 `@/components/styles` | `import Block from '../Block'` |
|
||||
| `style.ts` | - | `@/components/styles` | `import { createStyles } from '@/components/styles'` |
|
||||
| `type.ts` | 相对路径(类型) | 相对路径(类型) | `import type { BlockProps } from '../Block'` |
|
||||
|
||||
**核心原则:**
|
||||
- ✅ Demos 展示公开 API,使用 `@lobehub/ui-rn`
|
||||
- ✅ 组件内部保持模块化,使用相对路径
|
||||
- ✅ 样式文件可以使用 `@/components/styles` 获取主题工具
|
||||
- ✅ 保持导入语句的一致性和清晰性
|
||||
@@ -0,0 +1,791 @@
|
||||
---
|
||||
globs: src/components/**
|
||||
description: 组件库标准结构、样式管理和开发流程规范
|
||||
---
|
||||
|
||||
# 组件库结构规范
|
||||
|
||||
本规范定义了 LobeChat Mobile 组件库的标准结构、样式管理方式和开发流程。
|
||||
|
||||
## 组件目录结构
|
||||
|
||||
每个组件应遵循以下标准目录结构:
|
||||
|
||||
```
|
||||
src/components/ComponentName/
|
||||
├── ComponentName.tsx # 组件主文件
|
||||
├── index.ts # 导出文件
|
||||
├── index.md # 组件文档
|
||||
├── style.ts # 样式定义
|
||||
├── type.ts # TypeScript 类型定义
|
||||
└── demos/ # 示例目录
|
||||
├── index.tsx # 示例入口
|
||||
├── basic.tsx # 基础示例
|
||||
└── ... # 其他示例
|
||||
```
|
||||
|
||||
### 文件职责说明
|
||||
|
||||
#### 1. `ComponentName.tsx` - 组件主文件
|
||||
|
||||
组件的核心实现文件,命名采用 PascalCase:
|
||||
|
||||
```tsx
|
||||
import React, { memo, useMemo } from 'react';
|
||||
import { cva } from '@/components/styles';
|
||||
import { useStyles } from './style';
|
||||
import type { ComponentNameProps } from './type';
|
||||
|
||||
const ComponentName = memo<ComponentNameProps>(
|
||||
({ variant = 'default', children, style, ...rest }) => {
|
||||
const { styles } = useStyles();
|
||||
|
||||
// 使用 CVA 管理样式变体
|
||||
const variants = useMemo(
|
||||
() =>
|
||||
cva(styles.root, {
|
||||
variants: {
|
||||
variant: {
|
||||
default: styles.default,
|
||||
primary: styles.primary,
|
||||
},
|
||||
},
|
||||
compoundVariants: [
|
||||
{
|
||||
variant: 'primary',
|
||||
pressed: true,
|
||||
style: styles.primaryActive,
|
||||
},
|
||||
],
|
||||
defaultVariants: {
|
||||
variant: 'default',
|
||||
},
|
||||
}),
|
||||
[styles],
|
||||
);
|
||||
|
||||
return (
|
||||
<View
|
||||
style={({ hovered, pressed }) => [
|
||||
variants({ variant, hovered, pressed }),
|
||||
style,
|
||||
]}
|
||||
{...rest}
|
||||
>
|
||||
{children}
|
||||
</View>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
ComponentName.displayName = 'ComponentName';
|
||||
|
||||
export default ComponentName;
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- 使用 `memo` 包裹组件优化性能
|
||||
- 从 `./style` 导入 `useStyles` 钩子
|
||||
- 从 `./type` 导入类型定义
|
||||
- 使用 `cva` 管理复杂的样式变体逻辑
|
||||
- 使用 `useMemo` 缓存 CVA 配置,依赖 `styles`
|
||||
- 设置 `displayName` 便于调试
|
||||
|
||||
#### 2. `style.ts` - 样式定义文件
|
||||
|
||||
使用 `createStyles` 创建主题感知的样式:
|
||||
|
||||
```tsx
|
||||
import { createStyles } from '@/components/styles';
|
||||
|
||||
export const useStyles = createStyles(({ token, stylish }) => ({
|
||||
// 基础样式
|
||||
root: {
|
||||
borderRadius: token.borderRadius,
|
||||
position: 'relative' as const,
|
||||
},
|
||||
|
||||
// 变体样式 - 使用 stylish 预设
|
||||
default: stylish.variantFilled,
|
||||
primary: stylish.variantOutlined,
|
||||
|
||||
// 交互状态样式
|
||||
primaryActive: stylish.variantOutlinedActive,
|
||||
primaryHover: stylish.variantOutlinedHover,
|
||||
|
||||
// 附加效果
|
||||
shadow: stylish.shadow,
|
||||
glass: stylish.blur,
|
||||
}));
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- 统一使用 `createStyles` 工厂函数
|
||||
- 通过 `token` 访问主题变量(颜色、间距、圆角等)
|
||||
- 通过 `stylish` 访问预设样式(变体、阴影、模糊等)
|
||||
- 使用 `as const` 确保字面量类型
|
||||
- 样式名称应语义化,便于在 CVA 中引用
|
||||
|
||||
#### 3. `type.ts` - 类型定义文件
|
||||
|
||||
定义组件的 Props 接口:
|
||||
|
||||
```tsx
|
||||
import type { ViewProps } from 'react-native';
|
||||
|
||||
export interface ComponentNameProps extends ViewProps {
|
||||
/**
|
||||
* 样式变体
|
||||
* @default 'default'
|
||||
*/
|
||||
variant?: 'default' | 'primary' | 'secondary';
|
||||
|
||||
/**
|
||||
* 是否显示阴影
|
||||
*/
|
||||
shadow?: boolean;
|
||||
|
||||
/**
|
||||
* 是否启用玻璃效果
|
||||
*/
|
||||
glass?: boolean;
|
||||
|
||||
/**
|
||||
* 点击回调
|
||||
*/
|
||||
onPress?: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- 继承自基础组件的 Props(如 `ViewProps`, `FlexboxProps`)
|
||||
- 为每个 prop 添加 JSDoc 注释
|
||||
- 使用 `@default` 标注默认值
|
||||
- 使用字面量类型限制可选值
|
||||
|
||||
#### 4. `index.ts` - 导出文件
|
||||
|
||||
标准导出格式:
|
||||
|
||||
```tsx
|
||||
export { default } from './ComponentName';
|
||||
export type * from './type';
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- 默认导出组件本身
|
||||
- 使用 `export type *` 导出所有类型
|
||||
|
||||
#### 5. `index.md` - 组件文档
|
||||
|
||||
使用 YAML frontmatter 定义元数据:
|
||||
|
||||
```markdown
|
||||
---
|
||||
group: Layout
|
||||
title: ComponentName
|
||||
description: 组件的简短描述,说明主要功能和特点。
|
||||
---
|
||||
|
||||
## Features
|
||||
|
||||
- ✅ 功能特性 1
|
||||
- ✅ 功能特性 2
|
||||
- ✅ TypeScript 支持
|
||||
- ✅ 主题适配
|
||||
|
||||
## Basic Usage
|
||||
|
||||
\`\`\`tsx
|
||||
import { ComponentName } from '@lobehub/ui-rn';
|
||||
|
||||
<ComponentName variant="primary">
|
||||
<Text>示例内容</Text>
|
||||
</ComponentName>
|
||||
\`\`\`
|
||||
|
||||
## API
|
||||
|
||||
详细的 Props 说明...
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- `group`: 组件分类(Layout、Form、Display 等)
|
||||
- `title`: 组件名称
|
||||
- `description`: 简短描述
|
||||
- 包含功能特性、使用示例、API 文档
|
||||
|
||||
#### 6. `demos/` - 示例目录
|
||||
|
||||
demos 目录用于存放组件的交互式示例,这些示例会在 Playground 中展示。
|
||||
|
||||
**目录结构:**
|
||||
|
||||
```
|
||||
demos/
|
||||
├── index.tsx # Demo 配置入口(必需)
|
||||
├── basic.tsx # 基础用法示例(必需)
|
||||
├── variants.tsx # 变体示例
|
||||
├── sizes.tsx # 尺寸示例
|
||||
├── colors.tsx # 颜色示例
|
||||
├── states.tsx # 状态示例
|
||||
└── ... # 其他特定功能示例
|
||||
```
|
||||
|
||||
##### 6.1 `demos/index.tsx` - Demo 配置文件
|
||||
|
||||
配置文件定义了所有 demo 的元数据和加载方式:
|
||||
|
||||
```tsx
|
||||
import type { DemoConfig } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
|
||||
import BasicDemo from './basic';
|
||||
import ColorsDemo from './colors';
|
||||
import SizesDemo from './sizes';
|
||||
import VariantsDemo from './variants';
|
||||
|
||||
const demos: DemoConfig = [
|
||||
{ component: <BasicDemo />, key: 'basic', title: '基础用法' },
|
||||
{ component: <VariantsDemo />, key: 'variants', title: '不同视觉风格' },
|
||||
{ component: <SizesDemo />, key: 'sizes', title: '尺寸' },
|
||||
{ component: <ColorsDemo />, key: 'colors', title: '颜色' },
|
||||
];
|
||||
|
||||
export default demos;
|
||||
```
|
||||
|
||||
**DemoConfig 类型定义:**
|
||||
|
||||
```tsx
|
||||
interface DemoItem {
|
||||
/** Demo 组件实例 */
|
||||
component: React.ReactNode;
|
||||
/** Demo 唯一标识,使用 kebab-case */
|
||||
key: string;
|
||||
/** Demo 标题,用于在 Playground 中显示 */
|
||||
title: string;
|
||||
}
|
||||
|
||||
type DemoConfig = DemoItem[];
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- 从 `@lobehub/ui-rn` 导入 `DemoConfig` 类型
|
||||
- 导入所有 demo 组件(使用 PascalCase + Demo 后缀)
|
||||
- 配置数组按重要性排序,`basic` 应始终放在第一位
|
||||
- `key` 使用 kebab-case 命名(如 `basic`, `variants`, `disabled-state`)
|
||||
- `title` 使用中文描述,简洁明了
|
||||
- 使用默认导出导出配置数组
|
||||
|
||||
##### 6.2 Demo 文件规范
|
||||
|
||||
每个 demo 文件应遵循以下规范:
|
||||
|
||||
```tsx
|
||||
// demos/basic.tsx
|
||||
import { ComponentName, Flexbox } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
import { Text } from 'react-native';
|
||||
|
||||
export default () => {
|
||||
return (
|
||||
<Flexbox gap={16}>
|
||||
<ComponentName variant="default">
|
||||
<Text>默认示例</Text>
|
||||
</ComponentName>
|
||||
<ComponentName variant="primary">
|
||||
<Text>主要示例</Text>
|
||||
</ComponentName>
|
||||
</Flexbox>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
- 使用默认导出
|
||||
- 使用箭头函数组件
|
||||
- 不需要包裹额外的容器组件(Playground 会自动处理)
|
||||
- 使用 `Flexbox` 组件进行布局,设置合适的 `gap` 值
|
||||
- 示例应简洁明了,专注于展示单一特性或相关特性组
|
||||
|
||||
##### 6.3 Demo 文件命名规范
|
||||
|
||||
推荐的 demo 文件名及其用途:
|
||||
|
||||
| 文件名 | 用途 | 优先级 |
|
||||
|--------|------|--------|
|
||||
| `basic.tsx` | 基础用法,展示最常见的使用场景 | 必需 ⭐ |
|
||||
| `variants.tsx` | 展示所有样式变体(filled, outlined 等) | 推荐 |
|
||||
| `sizes.tsx` | 展示不同尺寸(small, medium, large) | 推荐 |
|
||||
| `colors.tsx` | 展示不同颜色主题 | 可选 |
|
||||
| `disabled.tsx` | 展示禁用状态 | 可选 |
|
||||
| `loading.tsx` | 展示加载状态 | 可选 |
|
||||
| `interactive.tsx` | 展示交互行为(点击、hover 等) | 可选 |
|
||||
| `layout.tsx` | 展示布局应用场景 | 可选 |
|
||||
| `advanced.tsx` | 展示高级用法或复杂场景 | 可选 |
|
||||
|
||||
##### 6.4 Demo 最佳实践
|
||||
|
||||
**✅ 推荐的做法:**
|
||||
|
||||
```tsx
|
||||
// 1. 清晰的分组和间距
|
||||
export default () => {
|
||||
return (
|
||||
<Flexbox gap={16}>
|
||||
<Text style={{ fontWeight: 'bold' }}>默认变体</Text>
|
||||
<Block variant="filled">
|
||||
<Text>Filled Block</Text>
|
||||
</Block>
|
||||
|
||||
<Text style={{ fontWeight: 'bold' }}>轮廓变体</Text>
|
||||
<Block variant="outlined">
|
||||
<Text>Outlined Block</Text>
|
||||
</Block>
|
||||
</Flexbox>
|
||||
);
|
||||
};
|
||||
|
||||
// 2. 使用状态展示交互
|
||||
export default () => {
|
||||
const [count, setCount] = useState(0);
|
||||
|
||||
return (
|
||||
<Button onPress={() => setCount(c => c + 1)}>
|
||||
<Text>点击次数: {count}</Text>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
|
||||
// 3. 使用 Alert 或 Toast 展示反馈
|
||||
export default () => {
|
||||
return (
|
||||
<Button onPress={() => Alert.alert('提示', '按钮被点击了')}>
|
||||
<Text>点击我</Text>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**❌ 避免的做法:**
|
||||
|
||||
```tsx
|
||||
// ❌ 不要使用外部状态管理
|
||||
import { useStore } from '@/store'; // 避免
|
||||
|
||||
// ❌ 不要使用复杂的业务逻辑
|
||||
export default () => {
|
||||
const data = fetchDataFromAPI(); // 避免
|
||||
// ...
|
||||
};
|
||||
|
||||
// ❌ 不要使用过多嵌套
|
||||
export default () => {
|
||||
return (
|
||||
<View>
|
||||
<View>
|
||||
<View>
|
||||
<View> // 过度嵌套
|
||||
<Component />
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
|
||||
// ❌ 不要在 demo 中定义复杂组件
|
||||
const ComplexComponent = () => { /* 大量代码 */ }; // 应该独立文件
|
||||
export default () => <ComplexComponent />;
|
||||
```
|
||||
|
||||
##### 6.5 常见 Demo 模板
|
||||
|
||||
**基础用法模板:**
|
||||
|
||||
```tsx
|
||||
import { ComponentName } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
|
||||
export default () => {
|
||||
return <ComponentName>基本示例</ComponentName>;
|
||||
};
|
||||
```
|
||||
|
||||
**变体展示模板:**
|
||||
|
||||
```tsx
|
||||
import { ComponentName, Flexbox } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
|
||||
export default () => {
|
||||
return (
|
||||
<Flexbox gap={16}>
|
||||
<ComponentName variant="filled">Filled</ComponentName>
|
||||
<ComponentName variant="outlined">Outlined</ComponentName>
|
||||
<ComponentName variant="borderless">Borderless</ComponentName>
|
||||
</Flexbox>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**交互示例模板:**
|
||||
|
||||
```tsx
|
||||
import { ComponentName, Flexbox } from '@lobehub/ui-rn';
|
||||
import React, { useState } from 'react';
|
||||
import { Alert, Text } from 'react-native';
|
||||
|
||||
export default () => {
|
||||
const [value, setValue] = useState('');
|
||||
|
||||
return (
|
||||
<Flexbox gap={16}>
|
||||
<ComponentName
|
||||
value={value}
|
||||
onChange={setValue}
|
||||
onPress={() => Alert.alert('提示', `当前值: ${value}`)}
|
||||
/>
|
||||
<Text>当前值: {value}</Text>
|
||||
</Flexbox>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
## CVA (Class Variance Authority) 用法
|
||||
|
||||
CVA 用于管理组件的样式变体逻辑,提供类型安全的样式组合。
|
||||
|
||||
### 基础用法
|
||||
|
||||
```tsx
|
||||
import { cva } from '@/components/styles';
|
||||
|
||||
const variants = useMemo(
|
||||
() =>
|
||||
cva(styles.root, {
|
||||
// 定义变体
|
||||
variants: {
|
||||
variant: {
|
||||
filled: styles.filled,
|
||||
outlined: styles.outlined,
|
||||
borderless: styles.borderless,
|
||||
},
|
||||
size: {
|
||||
small: styles.small,
|
||||
medium: styles.medium,
|
||||
large: styles.large,
|
||||
},
|
||||
},
|
||||
// 默认值
|
||||
defaultVariants: {
|
||||
variant: 'filled',
|
||||
size: 'medium',
|
||||
},
|
||||
}),
|
||||
[styles],
|
||||
);
|
||||
|
||||
// 使用变体
|
||||
<View style={variants({ variant: 'outlined', size: 'large' })} />
|
||||
```
|
||||
|
||||
### 复合变体 (Compound Variants)
|
||||
|
||||
处理多个变体组合时的特殊样式:
|
||||
|
||||
```tsx
|
||||
const variants = useMemo(
|
||||
() =>
|
||||
cva(styles.root, {
|
||||
variants: {
|
||||
variant: {
|
||||
filled: styles.filled,
|
||||
outlined: styles.outlined,
|
||||
},
|
||||
hovered: {
|
||||
false: null,
|
||||
true: styles.hover,
|
||||
},
|
||||
pressed: {
|
||||
false: null,
|
||||
true: styles.pressed,
|
||||
},
|
||||
},
|
||||
// 复合变体:特定组合的特殊样式
|
||||
compoundVariants: [
|
||||
{
|
||||
variant: 'outlined',
|
||||
hovered: true,
|
||||
style: styles.outlinedHover,
|
||||
},
|
||||
{
|
||||
variant: 'outlined',
|
||||
pressed: true,
|
||||
style: styles.outlinedActive,
|
||||
},
|
||||
{
|
||||
variant: 'filled',
|
||||
pressed: true,
|
||||
style: styles.filledActive,
|
||||
},
|
||||
],
|
||||
defaultVariants: {
|
||||
variant: 'filled',
|
||||
},
|
||||
}),
|
||||
[styles],
|
||||
);
|
||||
```
|
||||
|
||||
### 与交互状态结合
|
||||
|
||||
结合 React Native 的交互状态(hovered、pressed):
|
||||
|
||||
```tsx
|
||||
<Pressable
|
||||
style={({ hovered, pressed }) => [
|
||||
variants({ variant, hovered, pressed }),
|
||||
style,
|
||||
]}
|
||||
>
|
||||
{children}
|
||||
</Pressable>
|
||||
```
|
||||
|
||||
**CVA 最佳实践:**
|
||||
- 始终使用 `useMemo` 缓存 CVA 配置,避免重复创建
|
||||
- 将 `styles` 对象加入依赖数组
|
||||
- 将交互状态(hovered、pressed)作为变体处理
|
||||
- 使用 `compoundVariants` 处理组合逻辑,保持代码清晰
|
||||
- 为布尔变体提供 `false: null` 选项
|
||||
|
||||
## 开发流程
|
||||
|
||||
### 添加新组件
|
||||
|
||||
1. **创建组件目录结构**
|
||||
```bash
|
||||
mkdir -p src/components/NewComponent/demos
|
||||
```
|
||||
|
||||
2. **创建必需文件**
|
||||
|
||||
按以下顺序创建文件:
|
||||
|
||||
- `type.ts` - TypeScript 类型定义
|
||||
- `style.ts` - 样式定义
|
||||
- `NewComponent.tsx` - 组件实现
|
||||
- `index.ts` - 导出文件
|
||||
- `index.md` - 组件文档(包含 frontmatter)
|
||||
- `demos/basic.tsx` - 基础示例
|
||||
- `demos/index.tsx` - Demo 配置文件(必需)
|
||||
|
||||
3. **配置 demos/index.tsx**
|
||||
|
||||
创建 demo 配置文件,引入所有示例:
|
||||
|
||||
```tsx
|
||||
import type { DemoConfig } from '@lobehub/ui-rn';
|
||||
import React from 'react';
|
||||
|
||||
import BasicDemo from './basic';
|
||||
// 引入其他 demo...
|
||||
|
||||
const demos: DemoConfig = [
|
||||
{ component: <BasicDemo />, key: 'basic', title: '基础用法' },
|
||||
// 添加其他 demo 配置...
|
||||
];
|
||||
|
||||
export default demos;
|
||||
```
|
||||
|
||||
4. **更新组件索引**
|
||||
|
||||
在 [src/components/index.ts](mdc:src/components/index.ts) 中添加导出:
|
||||
```tsx
|
||||
export { default as NewComponent, type NewComponentProps } from './NewComponent';
|
||||
```
|
||||
|
||||
5. **生成 Playground 数据** ⚠️
|
||||
|
||||
添加或修改组件后,**必须**运行以下命令更新 Playground:
|
||||
|
||||
```bash
|
||||
pnpm run build:playground
|
||||
```
|
||||
|
||||
或使用完整命令:
|
||||
|
||||
```bash
|
||||
pnpm run workflow:playground
|
||||
```
|
||||
|
||||
这个命令会:
|
||||
- 扫描所有组件目录
|
||||
- 读取 `index.md` 中的 frontmatter 元数据
|
||||
- 生成 `app/playground/.data/index.json` 数据文件
|
||||
- 生成 `app/playground/.data/import.ts` 导入文件
|
||||
- 更新 Playground 应用的组件列表
|
||||
|
||||
**注意**:如果不运行此命令,新组件将不会出现在 Playground 中。
|
||||
|
||||
### 更新现有组件
|
||||
|
||||
1. **修改组件实现**
|
||||
- 更新 `ComponentName.tsx` 的组件逻辑
|
||||
- 更新 `style.ts` 的样式定义
|
||||
- 更新 `type.ts` 的类型定义
|
||||
|
||||
2. **更新文档和示例**
|
||||
- 更新 `index.md` 文档,确保示例代码与实际 API 一致
|
||||
- 如果添加了新功能,创建对应的 demo 文件(如 `demos/newFeature.tsx`)
|
||||
- 在 `demos/index.tsx` 中注册新的 demo
|
||||
|
||||
3. **运行 Playground 更新**
|
||||
- 如果修改了组件的 `group` 或 `title`,运行 `pnpm run build:playground`
|
||||
- 如果添加了新的 demo,也需要运行此命令
|
||||
|
||||
### 测试组件
|
||||
|
||||
在 Playground 中测试组件:
|
||||
|
||||
```bash
|
||||
# 启动开发服务器
|
||||
pnpm start
|
||||
|
||||
# 在 iOS 模拟器中运行
|
||||
pnpm ios
|
||||
|
||||
# 在 Android 模拟器中运行
|
||||
pnpm android
|
||||
```
|
||||
|
||||
导航到 Playground 页面查看和测试组件。
|
||||
|
||||
## 命名规范
|
||||
|
||||
- **组件文件**:PascalCase(如 `ActionIcon.tsx`)
|
||||
- **样式文件**:camelCase(如 `style.ts`)
|
||||
- **类型文件**:camelCase(如 `type.ts`)
|
||||
- **导出文件**:固定名称 `index.ts`
|
||||
- **文档文件**:固定名称 `index.md`
|
||||
|
||||
### Demo 命名规范
|
||||
|
||||
- **Demo 文件**:camelCase(如 `basic.tsx`, `variants.tsx`, `disabled.tsx`)
|
||||
- **Demo 配置文件**:固定名称 `demos/index.tsx`
|
||||
- **Demo 导入名称**:PascalCase + Demo 后缀(如 `BasicDemo`, `VariantsDemo`)
|
||||
- **Demo key**:kebab-case(如 `'basic'`, `'variants'`, `'disabled-state'`)
|
||||
- **Demo title**:中文描述(如 `'基础用法'`, `'不同视觉风格'`, `'禁用状态'`)
|
||||
|
||||
**示例:**
|
||||
|
||||
```tsx
|
||||
// demos/disabled-state.tsx
|
||||
export default () => { /* ... */ };
|
||||
|
||||
// demos/index.tsx
|
||||
import DisabledStateDemo from './disabled-state';
|
||||
|
||||
const demos: DemoConfig = [
|
||||
{ component: <DisabledStateDemo />, key: 'disabled-state', title: '禁用状态' },
|
||||
];
|
||||
```
|
||||
|
||||
## 样式最佳实践
|
||||
|
||||
1. **优先使用 stylish 预设**
|
||||
```tsx
|
||||
filled: stylish.variantFilled, // ✅ 推荐
|
||||
filled: { backgroundColor: token.colorBgContainer }, // ❌ 避免
|
||||
```
|
||||
|
||||
2. **保持样式的可组合性**
|
||||
```tsx
|
||||
// ✅ 好的做法:细粒度的样式定义
|
||||
root: { borderRadius: token.borderRadius },
|
||||
shadow: stylish.shadow,
|
||||
glass: stylish.blur,
|
||||
|
||||
// ❌ 避免:耦合多个效果
|
||||
rootWithShadow: { ...stylish.shadow, borderRadius: token.borderRadius },
|
||||
```
|
||||
|
||||
3. **使用语义化的样式名称**
|
||||
```tsx
|
||||
// ✅ 清晰的语义
|
||||
variantPrimary: stylish.variantFilled,
|
||||
variantPrimaryActive: stylish.variantFilledActive,
|
||||
|
||||
// ❌ 避免无意义的名称
|
||||
style1: stylish.variantFilled,
|
||||
activeStyle: stylish.variantFilledActive,
|
||||
```
|
||||
|
||||
## 相关文件参考
|
||||
|
||||
### 组件结构示例
|
||||
|
||||
- [Block 组件实现](mdc:src/components/Block/Block.tsx) - CVA 用法示例
|
||||
- [Block 样式定义](mdc:src/components/Block/style.ts) - createStyles 示例
|
||||
- [Block 类型定义](mdc:src/components/Block/type.ts) - Props 接口示例
|
||||
- [Block 文档](mdc:src/components/Block/index.md) - 组件文档示例
|
||||
|
||||
### Demo 示例
|
||||
|
||||
- [Block Demo 配置](mdc:src/components/Block/demos/index.tsx) - Demo 配置文件示例
|
||||
- [Block 基础示例](mdc:src/components/Block/demos/basic.tsx) - 基础 demo 示例
|
||||
- [Block 交互示例](mdc:src/components/Block/demos/clickable.tsx) - 交互 demo 示例
|
||||
- [ActionIcon Demo 配置](mdc:src/components/ActionIcon/demos/index.tsx) - 多 demo 配置示例
|
||||
|
||||
### 工具和类型
|
||||
|
||||
- [DemoConfig 类型定义](mdc:src/components/types.ts) - Demo 配置类型
|
||||
- [Playground 数据生成脚本](mdc:scripts/playground/index.ts) - 自动化流程
|
||||
- [组件导出索引](mdc:src/components/index.ts) - 导出规范
|
||||
|
||||
## 快速检查清单
|
||||
|
||||
在提交新组件或更新组件之前,请确认:
|
||||
|
||||
### 新组件清单
|
||||
|
||||
- [ ] 创建了组件目录 `src/components/ComponentName/`
|
||||
- [ ] 创建了 `ComponentName.tsx` 主文件
|
||||
- [ ] 创建了 `type.ts` 类型定义
|
||||
- [ ] 创建了 `style.ts` 样式定义
|
||||
- [ ] 创建了 `index.ts` 导出文件
|
||||
- [ ] 创建了 `index.md` 文档,包含正确的 frontmatter(group, title, description)
|
||||
- [ ] 创建了 `demos/basic.tsx` 基础示例
|
||||
- [ ] 创建了 `demos/index.tsx` 配置文件
|
||||
- [ ] 在 `src/components/index.ts` 中添加了导出
|
||||
- [ ] 运行了 `pnpm run build:playground`
|
||||
- [ ] 在 Playground 中测试了组件
|
||||
|
||||
### Demo 清单
|
||||
|
||||
- [ ] `demos/index.tsx` 从 `@lobehub/ui-rn` 导入了 `DemoConfig` 类型
|
||||
- [ ] 所有 demo 文件使用默认导出箭头函数组件
|
||||
- [ ] `demos/index.tsx` 中的 demo 配置使用了正确的命名:
|
||||
- `key` 使用 kebab-case
|
||||
- `title` 使用中文
|
||||
- 导入名称使用 PascalCase + Demo 后缀
|
||||
- [ ] `basic` demo 放在配置数组的第一位
|
||||
- [ ] demo 代码简洁,专注于单一功能展示
|
||||
|
||||
### 样式清单
|
||||
|
||||
- [ ] 使用 `createStyles` 创建样式
|
||||
- [ ] 优先使用 `stylish` 预设而非自定义样式
|
||||
- [ ] 从 `token` 获取主题变量
|
||||
- [ ] 如果使用 CVA,已用 `useMemo` 包裹并依赖 `styles`
|
||||
- [ ] 样式名称语义化清晰
|
||||
|
||||
### 文档清单
|
||||
|
||||
- [ ] `index.md` 包含正确的 frontmatter
|
||||
- [ ] 文档包含 Features 列表
|
||||
- [ ] 文档包含 Basic Usage 示例
|
||||
- [ ] 文档示例代码与实际 API 一致
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
description: 包含添加 debug 日志请求时
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Debug 包使用指南
|
||||
|
||||
本项目使用 [debug](mdc:https:/github.com/debug-js/debug) 包进行调试日志记录。使用此规则来确保团队成员统一调试日志格式。
|
||||
|
||||
## 基本用法
|
||||
|
||||
1. 导入 debug 包:
|
||||
|
||||
```typescript
|
||||
import debug from 'debug';
|
||||
```
|
||||
|
||||
2. 创建一个命名空间的日志记录器:
|
||||
|
||||
```typescript
|
||||
// 格式: lobe:[模块]:[子模块]
|
||||
const log = debug('lobe-[模块名]:[子模块名]');
|
||||
```
|
||||
一个文件尽量只创建一个 log 命名空间,子模块名使用文件名
|
||||
|
||||
|
||||
3. 使用日志记录器:
|
||||
|
||||
```typescript
|
||||
log('简单消息');
|
||||
log('带变量的消息: %O', object);
|
||||
log('格式化数字: %d', number);
|
||||
```
|
||||
|
||||
## 命名空间约定
|
||||
|
||||
- 桌面应用相关: `lobe-desktop:[模块]`
|
||||
- 服务端相关: `lobe-server:[模块]`
|
||||
- 客户端相关: `lobe-client:[模块]`
|
||||
- 路由相关: `lobe-[类型]-router:[模块]`
|
||||
|
||||
## 格式说明符
|
||||
|
||||
- `%O` - 对象展开(推荐用于复杂对象)
|
||||
- `%o` - 对象
|
||||
- `%s` - 字符串
|
||||
- `%d` - 数字
|
||||
|
||||
## 示例
|
||||
|
||||
查看 [market/index.ts](mdc:src/server/routers/edge/market/index.ts) 中的使用示例:
|
||||
|
||||
```typescript
|
||||
import debug from 'debug';
|
||||
|
||||
const log = debug('lobe-edge-router:market');
|
||||
|
||||
log('getAgent input: %O', input);
|
||||
```
|
||||
|
||||
## 启用调试
|
||||
|
||||
要在开发时启用调试输出,需设置环境变量:
|
||||
|
||||
### 在浏览器中
|
||||
|
||||
在控制台执行:
|
||||
```javascript
|
||||
localStorage.debug = 'lobe-*'
|
||||
```
|
||||
|
||||
### 在 Node.js 环境中
|
||||
|
||||
```bash
|
||||
DEBUG=lobe-* npm run dev
|
||||
# 或者
|
||||
DEBUG=lobe-* pnpm dev
|
||||
```
|
||||
@@ -0,0 +1,118 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Development Workflow
|
||||
|
||||
## Package Management
|
||||
|
||||
### Using pnpm
|
||||
- **Install dependencies**: `pnpm install`
|
||||
- **Add new package**: `pnpm add <package-name>`
|
||||
- **Add dev dependency**: `pnpm add -D <package-name>`
|
||||
- **Run scripts**: `pnpm <script-name>`
|
||||
|
||||
### Available Scripts
|
||||
- `pnpm start` - Start Expo development server
|
||||
- `pnpm android` - Run on Android device/emulator
|
||||
- `pnpm ios` - Run on iOS device/simulator
|
||||
- `pnpm web` - Run in web browser
|
||||
- `pnpm test` - Run Jest tests in watch mode
|
||||
- `pnpm lint` - Run ESLint
|
||||
- `pnpm i18n` - Generate translations for all languages
|
||||
|
||||
## Internationalization (i18n)
|
||||
|
||||
### Workflow
|
||||
1. **Add translations** to `i18n/default/common.ts` (Chinese source)
|
||||
2. **Use in components** with `useTranslation` hook
|
||||
3. **Generate translations** with `pnpm run i18n`
|
||||
4. **Test** with different languages
|
||||
|
||||
### Key Files
|
||||
- `i18n/default/common.ts` - Source translations (Chinese)
|
||||
- `locales/*/common.json` - Generated translations (18 languages)
|
||||
- `scripts/i18nWorkflow/` - Translation generation scripts
|
||||
|
||||
### Quick Reference
|
||||
```typescript
|
||||
import { useTranslation } from 'react-i18next';
|
||||
const { t } = useTranslation();
|
||||
<Text>{t('chat.history')}</Text>
|
||||
```
|
||||
|
||||
See [internationalization.mdc](mdc:.cursor/rules/internationalization.mdc) for detailed guidelines.
|
||||
|
||||
## Development Environment
|
||||
|
||||
### Configuration Files
|
||||
- [package.json](mdc:package.json) - Dependencies and scripts
|
||||
- [tsconfig.json](mdc:tsconfig.json) - TypeScript configuration
|
||||
- [metro.config.js](mdc:metro.config.js) - Metro bundler configuration
|
||||
- [app.config.ts](mdc:app.config.ts) - Expo app configuration (TypeScript, 类型安全)
|
||||
- [eas.json](mdc:eas.json) - EAS Build configuration
|
||||
|
||||
### Environment Setup
|
||||
- [src/polyfills.ts](mdc:src/polyfills.ts) - Polyfills for React Native
|
||||
- [global.d.ts](mdc:global.d.ts) - Global TypeScript declarations
|
||||
|
||||
## Code Organization
|
||||
|
||||
### File Naming Conventions
|
||||
- Components: PascalCase (e.g., `ChatBubble.tsx`)
|
||||
- Hooks: camelCase with `use` prefix (e.g., `useChat.ts`)
|
||||
- Utilities: camelCase (e.g., `fetchSSE.ts`)
|
||||
- Types: camelCase (e.g., `session.ts`)
|
||||
- Constants: UPPER_SNAKE_CASE (e.g., `DEFAULT_AGENT_META`)
|
||||
|
||||
### Import Patterns
|
||||
- Use absolute imports with `@/` prefix
|
||||
- Group imports: React, third-party, internal
|
||||
- Use named exports for components
|
||||
- Use default exports for main components
|
||||
|
||||
### TypeScript Guidelines
|
||||
- Enable strict mode in [tsconfig.json](mdc:tsconfig.json)
|
||||
- Define interfaces for all props and state
|
||||
- Use proper type annotations
|
||||
- Avoid `any` type - use `unknown` or proper types
|
||||
|
||||
## Testing
|
||||
|
||||
### Test Structure
|
||||
- [components/__tests__/](mdc:components/__tests__/) - Component tests
|
||||
- [components/__tests__/__snapshots__/](mdc:components/__tests__/__snapshots__/) - Jest snapshots
|
||||
- Use Jest with React Native Testing Library
|
||||
|
||||
### Testing Patterns
|
||||
- Test component rendering
|
||||
- Test user interactions
|
||||
- Test error states
|
||||
- Use snapshots for UI regression testing
|
||||
|
||||
## Code Quality
|
||||
|
||||
### Linting
|
||||
- ESLint configuration for React Native
|
||||
- Prettier for code formatting
|
||||
- TypeScript strict checking
|
||||
|
||||
### Best Practices
|
||||
- Follow existing code patterns
|
||||
- Don't change component styles without reason
|
||||
- Implement proper error boundaries
|
||||
- Use proper loading states
|
||||
- Handle edge cases gracefully
|
||||
|
||||
## Build and Deployment
|
||||
|
||||
### EAS Build
|
||||
- [eas.json](mdc:eas.json) - Build configuration
|
||||
- Support for Android and iOS builds
|
||||
- Environment-specific configurations
|
||||
|
||||
### Assets
|
||||
- [assets/](mdc:assets/) - App icons, fonts, and images
|
||||
- [assets/fonts/](mdc:assets/fonts/) - Custom fonts
|
||||
- [assets/images/](mdc:assets/images/) - App images and icons
|
||||
@@ -0,0 +1,192 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: true
|
||||
---
|
||||
# Internationalization (i18n) Guidelines
|
||||
|
||||
## Overview
|
||||
This project uses i18next for internationalization with a custom workflow that generates translations from a single source file.
|
||||
|
||||
## Architecture
|
||||
- **Source**: `i18n/default` - Contains all Chinese translations as the source
|
||||
- **Generated**: `locales/* - Auto-generated translations for 18 languages
|
||||
- **Script**: `scripts/i18nWorkflow/` - Handles translation generation
|
||||
|
||||
## Supported Languages
|
||||
18 languages: ar, bg-BG, de-DE, en-US, es-ES, fa-IR, fr-FR, it-IT, ja-JP, ko-KR, nl-NL, pl-PL, pt-BR, ru-RU, tr-TR, vi-VN, zh-CN, zh-TW
|
||||
|
||||
## Adding New Translations
|
||||
|
||||
### Step 1: Add to Source File
|
||||
Add new translation keys to suitable file in `i18n/default` like `chat.ts` and `common.ts`:
|
||||
|
||||
```typescript
|
||||
export default {
|
||||
// ... existing translations
|
||||
newSection: {
|
||||
title: '新标题',
|
||||
description: '新描述',
|
||||
actions: {
|
||||
save: '保存',
|
||||
cancel: '取消'
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### Step 2: Use in Components
|
||||
Use the `useTranslation` hook in React components:
|
||||
|
||||
```typescript
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
const { t } = useTranslation();
|
||||
|
||||
// Usage
|
||||
<Text>{t('newSection.title')}</Text>
|
||||
<Text>{t('newSection.actions.save')}</Text>
|
||||
```
|
||||
|
||||
### Step 3: Generate Translations
|
||||
Run the i18n script to generate all language translations:
|
||||
|
||||
```bash
|
||||
pnpm run i18n
|
||||
```
|
||||
|
||||
## Translation Key Naming Convention
|
||||
|
||||
use simpilifed naming keys
|
||||
|
||||
### Structure
|
||||
- Use nested objects for related translations
|
||||
- Use camelCase for keys
|
||||
- Group by feature/section
|
||||
|
||||
### Examples
|
||||
```typescript
|
||||
// Good
|
||||
settings: {
|
||||
theme: {
|
||||
title: '主题设置',
|
||||
light: '浅色模式',
|
||||
dark: '深色模式'
|
||||
}
|
||||
}
|
||||
|
||||
// Good
|
||||
chat: {
|
||||
actions: {
|
||||
copy: '复制',
|
||||
delete: '删除',
|
||||
retry: '重试'
|
||||
},
|
||||
messages: {
|
||||
copied: '已复制',
|
||||
failed: '失败'
|
||||
}
|
||||
}
|
||||
|
||||
// Avoid
|
||||
settingsThemeTitle: '主题设置',
|
||||
settingsThemeLight: '浅色模式'
|
||||
```
|
||||
|
||||
## Common Translation Keys
|
||||
|
||||
### Chat Features
|
||||
```typescript
|
||||
chat: {
|
||||
history: '对话历史',
|
||||
messageCopied: '消息已复制',
|
||||
confirmDelete: '确认删除',
|
||||
copy: '复制',
|
||||
retry: '重试',
|
||||
delete: '删除',
|
||||
send: '发送',
|
||||
stop: '停止',
|
||||
thinking: '思考中...',
|
||||
placeholder: '输入您的消息...'
|
||||
}
|
||||
```
|
||||
|
||||
### Settings Features
|
||||
```typescript
|
||||
settings: {
|
||||
title: '设置',
|
||||
theme: {
|
||||
title: '主题设置',
|
||||
light: '浅色模式',
|
||||
dark: '深色模式',
|
||||
auto: '跟随系统',
|
||||
},
|
||||
locale: {
|
||||
title: '语言设置',
|
||||
auto: {
|
||||
title: '跟随系统',
|
||||
description: '跟随系统语言设置'
|
||||
}
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Common Actions
|
||||
```typescript
|
||||
common: {
|
||||
cancel: '取消',
|
||||
confirm: '确认',
|
||||
save: '保存',
|
||||
delete: '删除',
|
||||
edit: '编辑',
|
||||
add: '添加',
|
||||
search: '搜索',
|
||||
loading: '加载中...',
|
||||
error: '错误',
|
||||
success: '成功',
|
||||
warning: '警告',
|
||||
info: '信息'
|
||||
}
|
||||
```
|
||||
|
||||
## Important Notes
|
||||
|
||||
### App Name
|
||||
- **Do NOT translate** the app name "LobeChat"
|
||||
- Keep it hardcoded in components: `<Text>LobeChat</Text>`
|
||||
- Do not add `app.name` to translation keys
|
||||
|
||||
### Code Comments
|
||||
- Chinese comments in code (like `{/* 状态栏 */}`) do not need translation
|
||||
- Only user-facing text needs internationalization
|
||||
|
||||
### Error Messages
|
||||
- Always use translation keys for error messages
|
||||
- Provide fallback messages in English
|
||||
|
||||
### Placeholders
|
||||
- Translate placeholder text in input fields
|
||||
- Use `placeholderTextColor` for styling
|
||||
|
||||
## Workflow Checklist
|
||||
|
||||
When adding new UI text:
|
||||
|
||||
1. ✅ Add translation key to `i18n/default/common.ts`
|
||||
2. ✅ Use `useTranslation` hook in component
|
||||
3. ✅ Replace hardcoded text with `t('key.path')`
|
||||
4. ✅ Run `pnpm run i18n` to generate translations
|
||||
5. ✅ Test with different languages
|
||||
6. ✅ Verify all 18 languages are generated correctly
|
||||
|
||||
## Testing
|
||||
- Switch languages in settings to verify translations
|
||||
- Check that all user-facing text is translated
|
||||
- Ensure app name remains "LobeChat" in all languages
|
||||
- Verify error messages and placeholders are translated
|
||||
|
||||
## Troubleshooting
|
||||
- If translations don't appear, run `pnpm run i18n` again
|
||||
- Check that translation keys match exactly between source and usage
|
||||
- Verify `useTranslation` hook is imported and used correctly
|
||||
- Ensure translation keys follow the nested object structure
|
||||
@@ -0,0 +1,631 @@
|
||||
---
|
||||
globs: *.ts,*.tsx
|
||||
description: 优先使用自定义组件规范 - 使用 Text、Flexbox、Center、Block 等自定义组件替代 React Native 原生组件
|
||||
---
|
||||
|
||||
# 优先使用自定义组件规范
|
||||
|
||||
本规范定义了在 LobeChat Mobile 项目中应该优先使用自定义组件而不是 React Native 原生组件的场景和原因。
|
||||
|
||||
## 核心原则
|
||||
|
||||
**✅ 优先使用自定义组件**:项目提供了一系列增强的自定义组件,它们提供了更友好的 API、更好的类型安全、主题集成以及样式变体支持。
|
||||
|
||||
**❌ 避免直接使用原生组件**:除非有特殊需求,否则应避免直接使用 `Text`、`View`、`Pressable` 等 React Native 原生组件。
|
||||
|
||||
## 组件映射关系
|
||||
|
||||
| 原生组件 | 自定义组件 | 使用场景 |
|
||||
|---------|----------|---------|
|
||||
| `Text` | `@/components/Text` | 所有文本显示场景 |
|
||||
| `View` (flex 布局) | `@/components/Flexbox` | 需要 flex 布局的容器 |
|
||||
| `View` (居中布局) | `@/components/Center` | 需要内容居中的容器 |
|
||||
| `View` (带样式) | `@/components/Block` | 需要背景、边框、阴影等样式的容器 |
|
||||
| `Pressable` | `@/components/Flexbox` 或 `@/components/Block` | 可点击的布局容器(使用 `onPress` prop) |
|
||||
|
||||
## 1. Text 组件
|
||||
|
||||
### 为什么使用 Text
|
||||
|
||||
`@/components/Text` 提供了比原生 `Text` 更丰富的功能:
|
||||
|
||||
- ✅ **语义化标题**:支持 `h1` ~ `h5` 标题级别
|
||||
- ✅ **文本样式**:`strong`、`italic`、`underline`、`delete`、`code` 等
|
||||
- ✅ **语义化类型**:`danger`、`success`、`warning`、`info`、`secondary`
|
||||
- ✅ **省略号支持**:更友好的 `ellipsis` 配置
|
||||
- ✅ **主题集成**:自动适配主题颜色和字体
|
||||
- ✅ **更好的类型提示**:完整的 TypeScript 支持
|
||||
|
||||
### 使用示例
|
||||
|
||||
```tsx
|
||||
// ❌ 避免使用原生 Text
|
||||
import { Text } from 'react-native';
|
||||
|
||||
<Text style={{ fontWeight: 'bold', color: 'red' }}>错误信息</Text>
|
||||
|
||||
// ✅ 推荐使用自定义 Text
|
||||
import Text from '@/components/Text';
|
||||
|
||||
<Text type="danger" strong>错误信息</Text>
|
||||
```
|
||||
|
||||
### 常见用法
|
||||
|
||||
```tsx
|
||||
import Text from '@/components/Text';
|
||||
|
||||
// 标题
|
||||
<Text as="h1">一级标题</Text>
|
||||
<Text as="h2">二级标题</Text>
|
||||
|
||||
// 文本样式
|
||||
<Text strong>加粗文本</Text>
|
||||
<Text italic>斜体文本</Text>
|
||||
<Text underline>下划线文本</Text>
|
||||
<Text delete>删除线文本</Text>
|
||||
<Text code>代码文本</Text>
|
||||
|
||||
// 语义化类型
|
||||
<Text type="danger">错误提示</Text>
|
||||
<Text type="success">成功提示</Text>
|
||||
<Text type="warning">警告提示</Text>
|
||||
<Text type="info">信息提示</Text>
|
||||
<Text type="secondary">次要文本</Text>
|
||||
|
||||
// 省略号
|
||||
<Text ellipsis>这是一段很长的文本会被截断...</Text>
|
||||
<Text ellipsis={{ rows: 2 }}>这是一段很长的文本,最多显示两行,超出部分会被截断...</Text>
|
||||
|
||||
// 组合使用
|
||||
<Text type="danger" strong numberOfLines={1}>重要错误信息</Text>
|
||||
```
|
||||
|
||||
## 2. Flexbox 组件
|
||||
|
||||
### 为什么使用 Flexbox
|
||||
|
||||
`@/components/Flexbox` 提供了比原生 `View` 更友好的 flex 布局配置:
|
||||
|
||||
- ✅ **简化的 API**:直观的 props 命名 (`horizontal`、`justify`、`align`、`gap`)
|
||||
- ✅ **自动处理方向**:`horizontal` prop 自动切换 `flexDirection`
|
||||
- ✅ **内置交互**:支持 `onPress`,自动切换 `Pressable`/`View`
|
||||
- ✅ **间距支持**:原生支持 `gap` prop
|
||||
- ✅ **更少的样式代码**:常用布局属性作为 props 直接配置
|
||||
|
||||
### 使用示例
|
||||
|
||||
```tsx
|
||||
// ❌ 避免使用原生 View
|
||||
import { View, Pressable } from 'react-native';
|
||||
|
||||
<View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', gap: 16 }}>
|
||||
<Text>内容 1</Text>
|
||||
<Text>内容 2</Text>
|
||||
</View>
|
||||
|
||||
// ✅ 推荐使用 Flexbox
|
||||
import Flexbox from '@/components/Flexbox';
|
||||
import Text from '@/components/Text';
|
||||
|
||||
<Flexbox horizontal justify="space-between" align="center" gap={16}>
|
||||
<Text>内容 1</Text>
|
||||
<Text>内容 2</Text>
|
||||
</Flexbox>
|
||||
```
|
||||
|
||||
### 常见用法
|
||||
|
||||
```tsx
|
||||
import Flexbox from '@/components/Flexbox';
|
||||
|
||||
// 垂直布局(默认)
|
||||
<Flexbox gap={16}>
|
||||
<Text>项目 1</Text>
|
||||
<Text>项目 2</Text>
|
||||
</Flexbox>
|
||||
|
||||
// 水平布局
|
||||
<Flexbox horizontal gap={8}>
|
||||
<Text>项目 1</Text>
|
||||
<Text>项目 2</Text>
|
||||
</Flexbox>
|
||||
|
||||
// 对齐方式
|
||||
<Flexbox justify="center" align="center">
|
||||
<Text>居中内容</Text>
|
||||
</Flexbox>
|
||||
|
||||
<Flexbox horizontal justify="space-between" align="flex-start">
|
||||
<Text>左侧</Text>
|
||||
<Text>右侧</Text>
|
||||
</Flexbox>
|
||||
|
||||
// 可点击容器
|
||||
<Flexbox
|
||||
horizontal
|
||||
gap={8}
|
||||
padding={16}
|
||||
onPress={() => console.log('clicked')}
|
||||
>
|
||||
<Icon name="home" />
|
||||
<Text>首页</Text>
|
||||
</Flexbox>
|
||||
|
||||
// 弹性布局
|
||||
<Flexbox horizontal gap={8}>
|
||||
<Flexbox flex={1}>
|
||||
<Text>占据剩余空间</Text>
|
||||
</Flexbox>
|
||||
<Text>固定宽度</Text>
|
||||
</Flexbox>
|
||||
|
||||
// 换行
|
||||
<Flexbox horizontal wrap="wrap" gap={8}>
|
||||
<Text>标签 1</Text>
|
||||
<Text>标签 2</Text>
|
||||
<Text>标签 3</Text>
|
||||
</Flexbox>
|
||||
```
|
||||
|
||||
## 3. Center 组件
|
||||
|
||||
### 为什么使用 Center
|
||||
|
||||
`@/components/Center` 是专门用于居中布局的组件:
|
||||
|
||||
- ✅ **语义化**:明确表达居中意图
|
||||
- ✅ **简化代码**:不需要手动设置 `justify` 和 `align`
|
||||
- ✅ **默认居中**:`justify="center"` 和 `align="center"` 是默认值
|
||||
- ✅ **基于 Flexbox**:继承所有 Flexbox 的功能
|
||||
|
||||
### 使用示例
|
||||
|
||||
```tsx
|
||||
// ❌ 避免使用原生 View
|
||||
import { View } from 'react-native';
|
||||
|
||||
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
|
||||
<Text>居中内容</Text>
|
||||
</View>
|
||||
|
||||
// ✅ 推荐使用 Center
|
||||
import Center from '@/components/Center';
|
||||
import Text from '@/components/Text';
|
||||
|
||||
<Center flex={1}>
|
||||
<Text>居中内容</Text>
|
||||
</Center>
|
||||
```
|
||||
|
||||
### 常见用法
|
||||
|
||||
```tsx
|
||||
import Center from '@/components/Center';
|
||||
|
||||
// 基础居中
|
||||
<Center>
|
||||
<Text>居中内容</Text>
|
||||
</Center>
|
||||
|
||||
// 占满容器并居中
|
||||
<Center flex={1}>
|
||||
<Text>垂直和水平居中</Text>
|
||||
</Center>
|
||||
|
||||
// 固定尺寸居中
|
||||
<Center width={200} height={200}>
|
||||
<Icon name="loading" />
|
||||
</Center>
|
||||
|
||||
// 水平居中(垂直方向可以自定义)
|
||||
<Center horizontal justify="flex-start" gap={8}>
|
||||
<Icon name="user" />
|
||||
<Text>用户名</Text>
|
||||
</Center>
|
||||
|
||||
// 可点击的居中容器
|
||||
<Center
|
||||
width={100}
|
||||
height={100}
|
||||
onPress={() => console.log('clicked')}
|
||||
>
|
||||
<Icon name="add" />
|
||||
<Text>添加</Text>
|
||||
</Center>
|
||||
```
|
||||
|
||||
## 4. Block 组件
|
||||
|
||||
### 为什么使用 Block
|
||||
|
||||
`@/components/Block` 是增强的样式容器组件:
|
||||
|
||||
- ✅ **样式变体**:`filled`、`outlined`、`borderless` 三种预设样式
|
||||
- ✅ **视觉效果**:内置 `shadow` 和 `glass` 效果
|
||||
- ✅ **交互状态**:自动处理 hover 和 press 状态样式
|
||||
- ✅ **主题集成**:使用 `stylish` 预设,自动适配主题
|
||||
- ✅ **CVA 管理**:类型安全的样式组合
|
||||
- ✅ **基于 Flexbox**:继承所有 Flexbox 的布局能力
|
||||
|
||||
### 使用示例
|
||||
|
||||
```tsx
|
||||
// ❌ 避免使用原生 View 或 Pressable
|
||||
import { Pressable } from 'react-native';
|
||||
|
||||
<Pressable
|
||||
style={({ pressed }) => ({
|
||||
backgroundColor: pressed ? '#f0f0f0' : '#fff',
|
||||
borderRadius: 8,
|
||||
padding: 16,
|
||||
shadowColor: '#000',
|
||||
shadowOpacity: 0.1,
|
||||
// ... 大量样式代码
|
||||
})}
|
||||
onPress={handlePress}
|
||||
>
|
||||
<Text>卡片内容</Text>
|
||||
</Pressable>
|
||||
|
||||
// ✅ 推荐使用 Block
|
||||
import Block from '@/components/Block';
|
||||
import Text from '@/components/Text';
|
||||
|
||||
<Block variant="filled" shadow onPress={handlePress}>
|
||||
<Text>卡片内容</Text>
|
||||
</Block>
|
||||
```
|
||||
|
||||
### 常见用法
|
||||
|
||||
```tsx
|
||||
import Block from '@/components/Block';
|
||||
|
||||
// 样式变体
|
||||
<Block variant="filled">
|
||||
<Text>填充背景</Text>
|
||||
</Block>
|
||||
|
||||
<Block variant="outlined">
|
||||
<Text>轮廓边框</Text>
|
||||
</Block>
|
||||
|
||||
<Block variant="borderless">
|
||||
<Text>无边框</Text>
|
||||
</Block>
|
||||
|
||||
// 视觉效果
|
||||
<Block variant="filled" shadow>
|
||||
<Text>带阴影的卡片</Text>
|
||||
</Block>
|
||||
|
||||
<Block variant="filled" glass>
|
||||
<Text>玻璃效果背景</Text>
|
||||
</Block>
|
||||
|
||||
// 可点击卡片
|
||||
<Block
|
||||
variant="outlined"
|
||||
padding={16}
|
||||
gap={8}
|
||||
onPress={() => console.log('clicked')}
|
||||
>
|
||||
<Text as="h3">卡片标题</Text>
|
||||
<Text type="secondary">卡片描述</Text>
|
||||
</Block>
|
||||
|
||||
// 组合布局和样式
|
||||
<Block variant="filled" shadow padding={24}>
|
||||
<Flexbox gap={16}>
|
||||
<Text as="h2">用户信息</Text>
|
||||
<Flexbox horizontal gap={8}>
|
||||
<Icon name="user" />
|
||||
<Text>用户名</Text>
|
||||
</Flexbox>
|
||||
</Flexbox>
|
||||
</Block>
|
||||
```
|
||||
|
||||
## 5. 组件组合使用
|
||||
|
||||
### 完整示例:用户卡片
|
||||
|
||||
```tsx
|
||||
import Block from '@/components/Block';
|
||||
import Center from '@/components/Center';
|
||||
import Flexbox from '@/components/Flexbox';
|
||||
import Text from '@/components/Text';
|
||||
|
||||
const UserCard = ({ user }) => {
|
||||
return (
|
||||
<Block variant="filled" shadow padding={16} gap={12}>
|
||||
{/* 头部:头像和名称 */}
|
||||
<Flexbox horizontal gap={12} align="center">
|
||||
<Center width={48} height={48}>
|
||||
<Avatar source={user.avatar} />
|
||||
</Center>
|
||||
<Flexbox flex={1} gap={4}>
|
||||
<Text as="h4" strong>{user.name}</Text>
|
||||
<Text type="secondary" fontSize={12}>{user.email}</Text>
|
||||
</Flexbox>
|
||||
</Flexbox>
|
||||
|
||||
{/* 统计信息 */}
|
||||
<Flexbox horizontal gap={24}>
|
||||
<Flexbox gap={4} align="center">
|
||||
<Text strong fontSize={18}>{user.posts}</Text>
|
||||
<Text type="secondary" fontSize={12}>帖子</Text>
|
||||
</Flexbox>
|
||||
<Flexbox gap={4} align="center">
|
||||
<Text strong fontSize={18}>{user.followers}</Text>
|
||||
<Text type="secondary" fontSize={12}>关注者</Text>
|
||||
</Flexbox>
|
||||
<Flexbox gap={4} align="center">
|
||||
<Text strong fontSize={18}>{user.following}</Text>
|
||||
<Text type="secondary" fontSize={12}>关注中</Text>
|
||||
</Flexbox>
|
||||
</Flexbox>
|
||||
|
||||
{/* 操作按钮 */}
|
||||
<Flexbox horizontal gap={8}>
|
||||
<Block
|
||||
flex={1}
|
||||
variant="filled"
|
||||
padding={12}
|
||||
onPress={() => console.log('follow')}
|
||||
>
|
||||
<Center>
|
||||
<Text>关注</Text>
|
||||
</Center>
|
||||
</Block>
|
||||
<Block
|
||||
flex={1}
|
||||
variant="outlined"
|
||||
padding={12}
|
||||
onPress={() => console.log('message')}
|
||||
>
|
||||
<Center>
|
||||
<Text>消息</Text>
|
||||
</Center>
|
||||
</Block>
|
||||
</Flexbox>
|
||||
</Block>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
## 6. 何时可以使用原生组件
|
||||
|
||||
以下场景可以考虑使用原生组件:
|
||||
|
||||
### 6.1 特殊需求场景
|
||||
|
||||
```tsx
|
||||
// ScrollView, FlatList, SectionList 等列表组件
|
||||
import { FlatList } from 'react-native';
|
||||
<FlatList data={data} renderItem={renderItem} />
|
||||
|
||||
// Image 组件
|
||||
import { Image } from 'react-native';
|
||||
<Image source={require('./image.png')} />
|
||||
|
||||
// TextInput 组件(如果没有自定义封装)
|
||||
import { TextInput } from 'react-native';
|
||||
<TextInput value={text} onChangeText={setText} />
|
||||
|
||||
// 特殊的原生组件
|
||||
import { SafeAreaView, KeyboardAvoidingView, Modal } from 'react-native';
|
||||
```
|
||||
|
||||
### 6.2 性能关键场景
|
||||
|
||||
在列表项等性能关键场景,如果自定义组件带来性能问题,可以考虑使用原生组件,但需要:
|
||||
|
||||
```tsx
|
||||
// ⚠️ 性能优化场景,谨慎使用
|
||||
import { View, Text } from 'react-native';
|
||||
import { memo } from 'react';
|
||||
|
||||
const ListItem = memo(({ item }) => (
|
||||
<View style={styles.item}>
|
||||
<Text style={styles.text}>{item.title}</Text>
|
||||
</View>
|
||||
));
|
||||
```
|
||||
|
||||
## 7. 导入规范
|
||||
|
||||
### 7.1 应用代码中的导入
|
||||
|
||||
在应用代码(`app/`、`src/features/` 等)中:
|
||||
|
||||
```tsx
|
||||
// ✅ 推荐:使用绝对路径导入
|
||||
import Block from '@/components/Block';
|
||||
import Center from '@/components/Center';
|
||||
import Flexbox from '@/components/Flexbox';
|
||||
import Text from '@/components/Text';
|
||||
```
|
||||
|
||||
### 7.2 组件内部的导入
|
||||
|
||||
在 `src/components/` 目录下的组件中:
|
||||
|
||||
```tsx
|
||||
// ✅ 推荐:使用相对路径导入其他组件
|
||||
import Block from '../Block';
|
||||
import Center from '../Center';
|
||||
import Flexbox from '../Flexbox';
|
||||
import Text from '../Text';
|
||||
```
|
||||
|
||||
### 7.3 Demo 文件中的导入
|
||||
|
||||
在组件的 `demos/` 目录下:
|
||||
|
||||
```tsx
|
||||
// ✅ 推荐:从 @lobehub/ui-rn 导入(展示公开 API)
|
||||
import { Block, Center, Flexbox, Text } from '@lobehub/ui-rn';
|
||||
```
|
||||
|
||||
## 8. 快速参考
|
||||
|
||||
| 需求 | 推荐组件 | 关键 Props |
|
||||
|-----|---------|-----------|
|
||||
| 显示普通文本 | `Text` | `children` |
|
||||
| 显示标题 | `Text` | `as="h1"` ~ `as="h5"` |
|
||||
| 显示错误/成功提示 | `Text` | `type="danger"` / `type="success"` |
|
||||
| 垂直布局 | `Flexbox` | `gap={16}` |
|
||||
| 水平布局 | `Flexbox` | `horizontal gap={8}` |
|
||||
| 内容居中 | `Center` | `flex={1}` |
|
||||
| 卡片容器 | `Block` | `variant="filled" shadow` |
|
||||
| 可点击容器 | `Flexbox` / `Block` | `onPress={handler}` |
|
||||
| 列表项 | `Block` / `Flexbox` | `horizontal align="center" gap={12}` |
|
||||
|
||||
## 9. 常见错误和修复
|
||||
|
||||
### 错误 1: 直接使用原生 Text
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import { Text, View } from 'react-native';
|
||||
|
||||
<View>
|
||||
<Text style={{ fontWeight: 'bold', color: '#e74c3c' }}>
|
||||
错误信息
|
||||
</Text>
|
||||
</View>
|
||||
|
||||
// ✅ 修复
|
||||
import Flexbox from '@/components/Flexbox';
|
||||
import Text from '@/components/Text';
|
||||
|
||||
<Flexbox>
|
||||
<Text type="danger" strong>
|
||||
错误信息
|
||||
</Text>
|
||||
</Flexbox>
|
||||
```
|
||||
|
||||
### 错误 2: 复杂的 View 样式
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import { View } from 'react-native';
|
||||
|
||||
<View
|
||||
style={{
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
gap: 16,
|
||||
padding: 12,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</View>
|
||||
|
||||
// ✅ 修复
|
||||
import Flexbox from '@/components/Flexbox';
|
||||
|
||||
<Flexbox
|
||||
horizontal
|
||||
justify="space-between"
|
||||
align="center"
|
||||
gap={16}
|
||||
padding={12}
|
||||
>
|
||||
{children}
|
||||
</Flexbox>
|
||||
```
|
||||
|
||||
### 错误 3: 手动实现居中布局
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import { View } from 'react-native';
|
||||
|
||||
<View style={{
|
||||
flex: 1,
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center'
|
||||
}}>
|
||||
{children}
|
||||
</View>
|
||||
|
||||
// ✅ 修复
|
||||
import Center from '@/components/Center';
|
||||
|
||||
<Center flex={1}>
|
||||
{children}
|
||||
</Center>
|
||||
```
|
||||
|
||||
### 错误 4: 复杂的 Pressable 样式
|
||||
|
||||
```tsx
|
||||
// ❌ 错误
|
||||
import { Pressable, StyleSheet } from 'react-native';
|
||||
|
||||
<Pressable
|
||||
style={({ pressed }) => [
|
||||
styles.card,
|
||||
pressed && styles.cardPressed,
|
||||
]}
|
||||
onPress={handlePress}
|
||||
>
|
||||
{children}
|
||||
</Pressable>
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
card: {
|
||||
backgroundColor: '#fff',
|
||||
borderRadius: 8,
|
||||
padding: 16,
|
||||
shadowColor: '#000',
|
||||
shadowOpacity: 0.1,
|
||||
shadowRadius: 8,
|
||||
shadowOffset: { width: 0, height: 2 },
|
||||
},
|
||||
cardPressed: {
|
||||
opacity: 0.8,
|
||||
},
|
||||
});
|
||||
|
||||
// ✅ 修复
|
||||
import Block from '@/components/Block';
|
||||
|
||||
<Block
|
||||
variant="filled"
|
||||
shadow
|
||||
padding={16}
|
||||
onPress={handlePress}
|
||||
>
|
||||
{children}
|
||||
</Block>
|
||||
```
|
||||
|
||||
## 10. 总结
|
||||
|
||||
### 核心优势
|
||||
|
||||
使用自定义组件的核心优势:
|
||||
|
||||
1. **更少的代码**:友好的 API 减少样式代码
|
||||
2. **更好的可读性**:语义化的 props 和组件名
|
||||
3. **类型安全**:完整的 TypeScript 支持
|
||||
4. **主题集成**:自动适配明暗主题
|
||||
5. **统一风格**:使用预设样式保持 UI 一致性
|
||||
6. **易于维护**:集中管理样式逻辑
|
||||
|
||||
### 记住这个规则
|
||||
|
||||
**在 LobeChat Mobile 中,优先使用:**
|
||||
|
||||
- ✅ `Text` 而不是 `react-native` 的 `Text`
|
||||
- ✅ `Flexbox` 而不是 `react-native` 的 `View` (flex 布局)
|
||||
- ✅ `Center` 而不是 `react-native` 的 `View` (居中布局)
|
||||
- ✅ `Block` 而不是 `react-native` 的 `View` / `Pressable` (样式容器)
|
||||
|
||||
**这些组件提供了更友好的配置方式,让代码更简洁、更易维护!**
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Lobe Chat React Native - Project Overview
|
||||
|
||||
This is a React Native chat application built with Expo Router, featuring AI-powered conversations and modern UI components.
|
||||
|
||||
## Core Architecture
|
||||
|
||||
### Entry Points
|
||||
- Main app entry: [src/app/_layout.tsx](mdc:src/app/_layout.tsx) - Root layout with providers
|
||||
- App router: [src/app/index.tsx](mdc:src/app/index.tsx) - Main routing logic
|
||||
- Package config: [package.json](mdc:package.json) - Dependencies and scripts
|
||||
|
||||
### Key Technologies
|
||||
- **Expo Router**: File-based routing system
|
||||
- **Zustand**: State management with persistence
|
||||
- **React Native Markdown**: Rich text rendering
|
||||
- **Shiki**: Syntax highlighting for code blocks
|
||||
- **MathJax**: Mathematical formula rendering
|
||||
|
||||
### State Management
|
||||
- OpenAI config: [store/openai.ts](mdc:store/openai.ts) - API key and proxy settings
|
||||
- Session management: [store/session/](mdc:store/session) - Chat sessions and groups
|
||||
- Chat state: [store/chat/](mdc:store/chat) - Active chat functionality
|
||||
|
||||
### Type Definitions
|
||||
- Session types: [types/session.ts](mdc:types/session.ts) - Chat session interfaces
|
||||
- Agent types: [types/agent.ts](mdc:types/agent.ts) - AI agent configurations
|
||||
- Message types: [types/message.ts](mdc:types/message.ts) - Chat message structures
|
||||
- Component types: [types/component.ts](mdc:types/component.ts) - UI component interfaces
|
||||
|
||||
### Constants and Configuration
|
||||
- Session constants: [const/session.ts](mdc:const/session.ts) - Default session configurations
|
||||
- Settings: [const/settings/](mdc:const/settings) - App configuration options
|
||||
- Branding: [const/branding.ts](mdc:const/branding.ts) - App branding constants
|
||||
|
||||
## Development Guidelines
|
||||
- Use pnpm as the package manager
|
||||
- Follow existing code patterns and component styles
|
||||
- Maintain TypeScript strict typing
|
||||
- Use Expo Router for navigation
|
||||
- Implement proper error handling and loading states
|
||||
@@ -0,0 +1,160 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Quick Reference Guide
|
||||
|
||||
## Essential Commands
|
||||
```bash
|
||||
pnpm start # Start development server
|
||||
pnpm ios # Run on iOS
|
||||
pnpm android # Run on Android
|
||||
pnpm web # Run in browser
|
||||
pnpm test # Run tests
|
||||
pnpm lint # Lint code
|
||||
pnpm i18n # Generate translations
|
||||
```
|
||||
|
||||
## Internationalization (i18n)
|
||||
|
||||
### Quick Setup
|
||||
```typescript
|
||||
import { useTranslation } from 'react-i18next';
|
||||
const { t } = useTranslation();
|
||||
|
||||
// Usage
|
||||
<Text>{t('chat.history')}</Text>
|
||||
<Text>{t('settings.theme.title')}</Text>
|
||||
```
|
||||
|
||||
### Key Files
|
||||
- `i18n/default/common.ts` - Add new translations here
|
||||
- `locales/*/common.json` - Generated translations
|
||||
- `pnpm run i18n` - Generate all languages
|
||||
|
||||
### Common Keys
|
||||
```typescript
|
||||
// Chat
|
||||
t('chat.history') // 对话历史
|
||||
t('chat.copy') // 复制
|
||||
t('chat.delete') // 删除
|
||||
|
||||
// Settings
|
||||
t('settings.theme.title') // 主题设置
|
||||
t('settings.locale.title') // 语言设置
|
||||
|
||||
// Common
|
||||
t('common.cancel') // 取消
|
||||
t('common.confirm') // 确认
|
||||
t('common.save') // 保存
|
||||
```
|
||||
|
||||
See [internationalization.mdc](mdc:.cursor/rules/internationalization.mdc) for full guidelines.
|
||||
|
||||
## Key Files to Know
|
||||
|
||||
### Entry Points
|
||||
- [src/app/_layout.tsx](mdc:src/app/_layout.tsx) - Root layout with providers
|
||||
- [src/app/index.tsx](mdc:src/app/index.tsx) - Main routing logic
|
||||
- [package.json](mdc:package.json) - Dependencies and scripts
|
||||
|
||||
### State Management
|
||||
- [store/openai.ts](mdc:store/openai.ts) - OpenAI configuration
|
||||
- [store/session/index.ts](mdc:store/session/index.ts) - Session management
|
||||
- [store/chat/index.ts](mdc:store/chat/index.ts) - Chat state
|
||||
|
||||
### Type Definitions
|
||||
- [types/session.ts](mdc:types/session.ts) - Session interfaces
|
||||
- [types/agent.ts](mdc:types/agent.ts) - Agent configurations
|
||||
- [types/message.ts](mdc:types/message.ts) - Message structures
|
||||
|
||||
### Core Components
|
||||
- [components/Markdown/index.tsx](mdc:components/Markdown/index.tsx) - Markdown renderer
|
||||
- [components/Highlighter/index.tsx](mdc:components/Highlighter/index.tsx) - Code highlighting
|
||||
- [components/Toast/index.ts](mdc:components/Toast/index.ts) - Toast system
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Component Structure
|
||||
```typescript
|
||||
interface ComponentProps {
|
||||
// Props definition
|
||||
}
|
||||
|
||||
const Component: React.FC<ComponentProps> = ({ prop1, prop2 }) => {
|
||||
const { t } = useTranslation();
|
||||
const { colors, dark } = useTheme();
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
// Styles
|
||||
});
|
||||
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text>{t('component.title')}</Text>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
### Store Usage
|
||||
```typescript
|
||||
const { data, setData } = useStore();
|
||||
const derivedData = useStore(selector);
|
||||
```
|
||||
|
||||
### Theme Integration
|
||||
```typescript
|
||||
const { colors, dark } = useTheme();
|
||||
const backgroundColor = dark ? colors.background : '#fff';
|
||||
```
|
||||
|
||||
## Development Rules
|
||||
|
||||
### Code Style
|
||||
- Use pnpm for package management
|
||||
- Follow existing component patterns
|
||||
- Don't change styles without reason
|
||||
- Use TypeScript strict mode
|
||||
- Implement proper error handling
|
||||
- **Always use translation keys for user-facing text**
|
||||
|
||||
### File Organization
|
||||
- Components in `components/` directory
|
||||
- Types in `types/` directory
|
||||
- Constants in `const/` directory
|
||||
- Utilities in `utils/` directory
|
||||
- Store logic in `store/` directory
|
||||
- Translations in `i18n/default/common.ts`
|
||||
|
||||
### Import Patterns
|
||||
```typescript
|
||||
// React imports
|
||||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
// Internal imports (use @/ prefix)
|
||||
import { Component } from '@/components/Component';
|
||||
import { useStore } from '@/store/store';
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
1. **Metro bundler issues**: Clear cache with `pnpm start --clear`
|
||||
2. **TypeScript errors**: Check [tsconfig.json](mdc:tsconfig.json) configuration
|
||||
3. **Theme issues**: Verify [constants/Colors.ts](mdc:constants/Colors.ts) setup
|
||||
4. **API errors**: Check [store/openai.ts](mdc:store/openai.ts) configuration
|
||||
5. **Translation issues**: Run `pnpm run i18n` to regenerate translations
|
||||
|
||||
### Debug Tools
|
||||
- [src/app/playground/](mdc:src/app/playground/) - Component testing playground
|
||||
- React Native Debugger for debugging
|
||||
- Expo DevTools for development
|
||||
|
||||
## Performance Tips
|
||||
- Use `useMemo` and `useCallback` for expensive operations
|
||||
- Implement proper list virtualization for large lists
|
||||
- Use selectors to prevent unnecessary re-renders
|
||||
- Optimize images and assets
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: true
|
||||
---
|
||||
1. 本项目使用 expo 框架,你是 expo 开发专家辅助我编程
|
||||
2. 该项目原有 web 端,你需要辅助我将其转化为 native 端
|
||||
@@ -0,0 +1,115 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# State Management with Zustand
|
||||
|
||||
## Store Architecture
|
||||
|
||||
The app uses Zustand for state management. Configuration data persists through **react-native-mmkv** (replacing AsyncStorage for better performance).
|
||||
|
||||
### Core Stores
|
||||
|
||||
#### Configuration Stores (with MMKV persistence)
|
||||
|
||||
**Settings**
|
||||
- [store/setting.ts](mdc:store/setting.ts) - App settings
|
||||
- Manages: Theme, font, language, developer mode
|
||||
- Persistence: **MMKV** with JSON serialization (appStorage instance)
|
||||
|
||||
**OpenAI Configuration**
|
||||
- [store/openai.ts](mdc:store/openai.ts) - OpenAI API configuration
|
||||
- Manages: API key, proxy settings
|
||||
- Persistence: **MMKV** with JSON serialization (appStorage instance)
|
||||
|
||||
**Agent Configuration**
|
||||
- [store/agent/store.ts](mdc:store/agent/store.ts) - AI Agent configuration
|
||||
- Manages: Agent config, initialization data
|
||||
- Persistence: **MMKV** with JSON serialization (appStorage instance)
|
||||
|
||||
#### Runtime Stores (no persistence)
|
||||
|
||||
**Session Management**
|
||||
- [store/session/store.ts](mdc:store/session/store.ts) - Main session store
|
||||
- Manages: Current session state, session list
|
||||
- Persistence: Runtime only (future: SWR + local database)
|
||||
|
||||
**Chat State**
|
||||
- [store/chat/store.ts](mdc:store/chat/store.ts) - Active chat functionality
|
||||
- Manages: Current chat state, messages, loading states
|
||||
- Persistence: Runtime only (future: SWR + local database)
|
||||
|
||||
**User State**
|
||||
- [store/user/index.ts](mdc:store/user/index.ts) - User authentication state
|
||||
- Manages: Authentication state, user info
|
||||
- Persistence: Runtime only (Token stored in expo-secure-store separately)
|
||||
|
||||
## State Patterns
|
||||
|
||||
### Store Structure
|
||||
```typescript
|
||||
interface StoreState {
|
||||
// State properties
|
||||
data: DataType;
|
||||
|
||||
// Actions
|
||||
setData: (data: DataType) => void;
|
||||
updateData: (updater: (data: DataType) => DataType) => void;
|
||||
resetData: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
### Persistence Pattern
|
||||
```typescript
|
||||
import { createJSONStorage, persist } from 'zustand/middleware';
|
||||
import { appStorage, createMMKVStorage } from '@/utils/storage';
|
||||
|
||||
export const useStore = create<StoreState>()(
|
||||
persist(
|
||||
(set, get) => ({
|
||||
// State and actions
|
||||
}),
|
||||
{
|
||||
name: 'store-name',
|
||||
storage: createJSONStorage(() => createMMKVStorage(appStorage)),
|
||||
},
|
||||
),
|
||||
);
|
||||
```
|
||||
|
||||
### Storage Instances
|
||||
|
||||
The app uses a single MMKV instance for configuration data:
|
||||
|
||||
- **appStorage**: Global app configuration (settings, openai, agent config)
|
||||
|
||||
For sensitive data (tokens, API keys), use **expo-secure-store** instead.
|
||||
|
||||
### Selector Pattern
|
||||
- Use selectors for derived state
|
||||
- Implement memoization for performance
|
||||
- Keep selectors in separate files for organization
|
||||
|
||||
### Type Safety
|
||||
- Define interfaces for all store states
|
||||
- Use TypeScript for compile-time type checking
|
||||
- Export types for use in components
|
||||
|
||||
## Usage Guidelines
|
||||
|
||||
### In Components
|
||||
```typescript
|
||||
const { data, setData } = useStore();
|
||||
const derivedData = useStore(selector);
|
||||
```
|
||||
|
||||
### Store Updates
|
||||
- Use immutable updates
|
||||
- Implement proper error handling
|
||||
- Add loading states for async operations
|
||||
|
||||
### Performance
|
||||
- Use selectors to prevent unnecessary re-renders
|
||||
- Implement proper memoization
|
||||
- Avoid storing computed values in state
|
||||
@@ -0,0 +1,9 @@
|
||||
build:
|
||||
steps:
|
||||
- eas/build
|
||||
- run:
|
||||
command: |
|
||||
curl \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"content": "Build android development succeeded! URL: ${ eas.job.expoBuildUrl }"}' \
|
||||
$DISCORD_WEBHOOK_URL
|
||||
@@ -0,0 +1,9 @@
|
||||
build:
|
||||
steps:
|
||||
- eas/build
|
||||
- run:
|
||||
command: |
|
||||
curl \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"content": "Build ios development succeeded! URL: ${ eas.job.expoBuildUrl }"}' \
|
||||
$DISCORD_WEBHOOK_URL
|
||||
@@ -0,0 +1,9 @@
|
||||
build:
|
||||
steps:
|
||||
- eas/build
|
||||
- run:
|
||||
command: |
|
||||
curl \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"content": "Build android preview succeeded! URL: ${ eas.job.expoBuildUrl }"}' \
|
||||
$DISCORD_WEBHOOK_URL
|
||||
@@ -0,0 +1,9 @@
|
||||
build:
|
||||
steps:
|
||||
- eas/build
|
||||
- run:
|
||||
command: |
|
||||
curl \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"content": "Build ios preview succeeded! URL: ${ eas.job.expoBuildUrl }"}' \
|
||||
$DISCORD_WEBHOOK_URL
|
||||
@@ -0,0 +1,9 @@
|
||||
build:
|
||||
steps:
|
||||
- eas/build
|
||||
- run:
|
||||
command: |
|
||||
curl \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"content": "Build android production succeeded! URL: ${ eas.job.expoBuildUrl }"}' \
|
||||
$DISCORD_WEBHOOK_URL
|
||||
@@ -0,0 +1,9 @@
|
||||
build:
|
||||
steps:
|
||||
- eas/build
|
||||
- run:
|
||||
command: |
|
||||
curl \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"content": "Build ios production succeeded! URL: ${ eas.job.expoBuildUrl }"}' \
|
||||
$DISCORD_WEBHOOK_URL
|
||||
@@ -0,0 +1,21 @@
|
||||
name: Create development builds
|
||||
|
||||
jobs:
|
||||
android_development_build:
|
||||
name: Build Android
|
||||
type: build
|
||||
params:
|
||||
platform: android
|
||||
profile: development
|
||||
ios_device_development_build:
|
||||
name: Build iOS device
|
||||
type: build
|
||||
params:
|
||||
platform: ios
|
||||
profile: development
|
||||
ios_simulator_development_build:
|
||||
name: Build iOS simulator
|
||||
type: build
|
||||
params:
|
||||
platform: ios
|
||||
profile: development-simulator
|
||||
@@ -0,0 +1,15 @@
|
||||
name: Create Production Builds
|
||||
|
||||
# on:
|
||||
# push:
|
||||
# branches: ['main']
|
||||
|
||||
jobs:
|
||||
build_android:
|
||||
type: build # This job type creates a production build for Android
|
||||
params:
|
||||
platform: android
|
||||
build_ios:
|
||||
type: build # This job type creates a production build for iOS
|
||||
params:
|
||||
platform: ios
|
||||
@@ -0,0 +1,68 @@
|
||||
name: Deploy to production
|
||||
|
||||
# on:
|
||||
# push:
|
||||
# branches: ['main']
|
||||
|
||||
jobs:
|
||||
fingerprint:
|
||||
name: Fingerprint
|
||||
type: fingerprint
|
||||
get_android_build:
|
||||
name: Check for existing android build
|
||||
needs: [fingerprint]
|
||||
type: get-build
|
||||
params:
|
||||
fingerprint_hash: ${{ needs.fingerprint.outputs.android_fingerprint_hash }}
|
||||
profile: production
|
||||
get_ios_build:
|
||||
name: Check for existing ios build
|
||||
needs: [fingerprint]
|
||||
type: get-build
|
||||
params:
|
||||
fingerprint_hash: ${{ needs.fingerprint.outputs.ios_fingerprint_hash }}
|
||||
profile: production
|
||||
build_android:
|
||||
name: Build Android
|
||||
needs: [get_android_build]
|
||||
if: ${{ !needs.get_android_build.outputs.build_id }}
|
||||
type: build
|
||||
params:
|
||||
platform: android
|
||||
profile: production
|
||||
build_ios:
|
||||
name: Build iOS
|
||||
needs: [get_ios_build]
|
||||
if: ${{ !needs.get_ios_build.outputs.build_id }}
|
||||
type: build
|
||||
params:
|
||||
platform: ios
|
||||
profile: production
|
||||
submit_android_build:
|
||||
name: Submit Android Build
|
||||
needs: [build_android]
|
||||
type: submit
|
||||
params:
|
||||
build_id: ${{ needs.build_android.outputs.build_id }}
|
||||
submit_ios_build:
|
||||
name: Submit iOS Build
|
||||
needs: [build_ios]
|
||||
type: submit
|
||||
params:
|
||||
build_id: ${{ needs.build_ios.outputs.build_id }}
|
||||
publish_android_update:
|
||||
name: Publish Android update
|
||||
needs: [get_android_build]
|
||||
if: ${{ needs.get_android_build.outputs.build_id }}
|
||||
type: update
|
||||
params:
|
||||
branch: production
|
||||
platform: android
|
||||
publish_ios_update:
|
||||
name: Publish iOS update
|
||||
needs: [get_ios_build]
|
||||
if: ${{ needs.get_ios_build.outputs.build_id }}
|
||||
type: update
|
||||
params:
|
||||
branch: production
|
||||
platform: ios
|
||||
@@ -0,0 +1,12 @@
|
||||
name: Publish preview update
|
||||
|
||||
# on:
|
||||
# push:
|
||||
# branches: ['*']
|
||||
|
||||
jobs:
|
||||
publish_preview_update:
|
||||
name: Publish preview update
|
||||
type: update
|
||||
params:
|
||||
branch: ${{ github.ref_name || 'test' }}
|
||||
@@ -0,0 +1,19 @@
|
||||
# on:
|
||||
# push:
|
||||
# branches: ['main']
|
||||
|
||||
jobs:
|
||||
build_android:
|
||||
name: Build Android app
|
||||
type: build
|
||||
params:
|
||||
platform: android
|
||||
profile: production
|
||||
|
||||
submit_android:
|
||||
name: Submit to Google Play Store
|
||||
needs: [build_android]
|
||||
type: submit
|
||||
params:
|
||||
platform: android
|
||||
build_id: ${{ needs.build_android.outputs.build_id }}
|
||||
@@ -0,0 +1,19 @@
|
||||
# on:
|
||||
# push:
|
||||
# branches: ['main']
|
||||
|
||||
jobs:
|
||||
build_ios:
|
||||
name: Build iOS app
|
||||
type: build
|
||||
params:
|
||||
platform: ios
|
||||
profile: production
|
||||
|
||||
submit_ios:
|
||||
name: Submit to Apple App Store
|
||||
needs: [build_ios]
|
||||
type: submit
|
||||
params:
|
||||
platform: ios
|
||||
build_id: ${{ needs.build_ios.outputs.build_id }}
|
||||
@@ -0,0 +1,9 @@
|
||||
# OAuth 2.0 OIDC 认证配置
|
||||
# 客户端 ID - 从认证服务器获取
|
||||
EXPO_PUBLIC_OAUTH_CLIENT_ID=lobehub-mobile
|
||||
|
||||
# 官方云服务器地址
|
||||
EXPO_PUBLIC_OFFICIAL_CLOUD_SERVER=https://lobechat.com
|
||||
|
||||
# 回调地址 - 必须与认证服务器配置一致
|
||||
EXPO_PUBLIC_OAUTH_REDIRECT_URI=com.lobehub.app://auth/callback
|
||||
@@ -0,0 +1,36 @@
|
||||
# Eslintignore for LobeHub
|
||||
################################################################
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
|
||||
# ci
|
||||
coverage
|
||||
.coverage
|
||||
|
||||
# test
|
||||
jest*
|
||||
*.test.ts
|
||||
*.test.tsx
|
||||
|
||||
# umi
|
||||
.umi
|
||||
.umi-production
|
||||
.umi-test
|
||||
.dumi/tmp*
|
||||
!.dumirc.ts
|
||||
|
||||
# production
|
||||
dist
|
||||
es
|
||||
lib
|
||||
logs
|
||||
ios
|
||||
android
|
||||
|
||||
# misc
|
||||
# add other ignore file below
|
||||
.expo
|
||||
|
||||
polyfills.ts
|
||||
temp
|
||||
@@ -0,0 +1,55 @@
|
||||
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# Expo
|
||||
.expo/
|
||||
dist/
|
||||
web-build/
|
||||
expo-env.d.ts
|
||||
|
||||
# Native
|
||||
*.orig.*
|
||||
*.jks
|
||||
*.p8
|
||||
*.p12
|
||||
*.key
|
||||
*.mobileprovision
|
||||
|
||||
# Metro
|
||||
.metro-health-check*
|
||||
|
||||
# debug
|
||||
npm-debug.*
|
||||
yarn-debug.*
|
||||
yarn-error.*
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
package-lock.json
|
||||
# pnpm-lock.yaml
|
||||
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
|
||||
app-example
|
||||
android
|
||||
ios
|
||||
yarn.lock
|
||||
repomix-output.xml
|
||||
lobe-ui-repomix-output.xml
|
||||
lobe-chat-repomix-output.xml
|
||||
repomix-output-ant-design-theme.xml
|
||||
credentials.json
|
||||
|
||||
build-*.aab
|
||||
build-*.apk
|
||||
build-*.ipa
|
||||
|
||||
coverage
|
||||
@@ -0,0 +1,50 @@
|
||||
const { defineConfig } = require('@lobehub/i18n-cli');
|
||||
|
||||
module.exports = defineConfig({
|
||||
entry: 'locales/zh-CN',
|
||||
entryLocale: 'zh-CN',
|
||||
output: 'locales',
|
||||
outputLocales: [
|
||||
'ar',
|
||||
'bg-BG',
|
||||
'zh-TW',
|
||||
'en-US',
|
||||
'ru-RU',
|
||||
'ja-JP',
|
||||
'ko-KR',
|
||||
'fr-FR',
|
||||
'tr-TR',
|
||||
'es-ES',
|
||||
'pt-BR',
|
||||
'de-DE',
|
||||
'it-IT',
|
||||
'nl-NL',
|
||||
'pl-PL',
|
||||
'vi-VN',
|
||||
'fa-IR',
|
||||
],
|
||||
temperature: 0,
|
||||
saveImmediately: true,
|
||||
// chatgpt-4o-latest 和 gpt-chat 翻译效果更好
|
||||
modelName: 'chatgpt-4o-latest',
|
||||
experimental: {
|
||||
jsonMode: true,
|
||||
},
|
||||
markdown: {
|
||||
reference: '你需要保持 mdx 的组件格式,输出文本不需要在最外层包裹任何代码块语法',
|
||||
entry: ['./README.zh-CN.md'],
|
||||
entryLocale: 'zh-CN',
|
||||
outputLocales: ['en-US'],
|
||||
includeMatter: true,
|
||||
exclude: ['./src/**/*'],
|
||||
outputExtensions: (locale, { filePath }) => {
|
||||
if (filePath.includes('.mdx')) {
|
||||
if (locale === 'en-US') return '.mdx';
|
||||
return `.${locale}.mdx`;
|
||||
} else {
|
||||
if (locale === 'en-US') return '.md';
|
||||
return `.${locale}.md`;
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,23 @@
|
||||
lockfile=true
|
||||
node-linker=hoisted
|
||||
ignore-workspace-root-check=true
|
||||
|
||||
enable-pre-post-scripts=true
|
||||
|
||||
# Load dotenv files for all the npm scripts
|
||||
node-options="--require dotenv-expand/config"
|
||||
|
||||
public-hoist-pattern[]=*@umijs/lint*
|
||||
public-hoist-pattern[]=*changelog*
|
||||
public-hoist-pattern[]=*commitlint*
|
||||
public-hoist-pattern[]=*eslint*
|
||||
public-hoist-pattern[]=*postcss*
|
||||
public-hoist-pattern[]=*prettier*
|
||||
public-hoist-pattern[]=*remark*
|
||||
public-hoist-pattern[]=*semantic-release*
|
||||
public-hoist-pattern[]=*stylelint*
|
||||
|
||||
public-hoist-pattern[]=@auth/core
|
||||
public-hoist-pattern[]=@clerk/backend
|
||||
public-hoist-pattern[]=@clerk/types
|
||||
public-hoist-pattern[]=pdfjs-dist
|
||||
@@ -0,0 +1,67 @@
|
||||
# Prettierignore for LobeHub
|
||||
################################################################
|
||||
|
||||
# general
|
||||
.DS_Store
|
||||
.editorconfig
|
||||
.idea
|
||||
.vscode
|
||||
.history
|
||||
.temp
|
||||
.env.local
|
||||
.husky
|
||||
.npmrc
|
||||
.gitkeep
|
||||
venv
|
||||
temp
|
||||
tmp
|
||||
LICENSE
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
*.log
|
||||
*.lock
|
||||
package-lock.json
|
||||
|
||||
# ci
|
||||
coverage
|
||||
.coverage
|
||||
.eslintcache
|
||||
.stylelintcache
|
||||
test-output
|
||||
__snapshots__
|
||||
*.snap
|
||||
|
||||
# production
|
||||
dist
|
||||
es
|
||||
lib
|
||||
logs
|
||||
|
||||
# umi
|
||||
.umi
|
||||
.umi-production
|
||||
.umi-test
|
||||
.dumi/tmp*
|
||||
|
||||
# ignore files
|
||||
.*ignore
|
||||
|
||||
# docker
|
||||
docker
|
||||
Dockerfile*
|
||||
|
||||
# image
|
||||
*.webp
|
||||
*.gif
|
||||
*.png
|
||||
*.jpg
|
||||
|
||||
|
||||
# misc
|
||||
# add other ignore file below
|
||||
./src/icons/MaterialFileTypeIcon/icon-map.json
|
||||
*.ico
|
||||
*.backup
|
||||
*.mdc
|
||||
*.ttf
|
||||
@@ -0,0 +1 @@
|
||||
module.exports = require('@lobehub/lint').prettier;
|
||||
@@ -0,0 +1 @@
|
||||
module.exports = require('@lobehub/lint').remarklint;
|
||||
@@ -0,0 +1,10 @@
|
||||
const config = require('@lobehub/lint').stylelint;
|
||||
|
||||
module.exports = {
|
||||
...config,
|
||||
rules: {
|
||||
'custom-property-pattern': null,
|
||||
'no-descending-specificity': null,
|
||||
...config.rules,
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,55 @@
|
||||
# LobeChat Mobile Agent Guide
|
||||
|
||||
## Project Overview
|
||||
|
||||
- React Native + Expo app delivering the LobeChat AI chat experience for iOS and Android from a shared codebase.
|
||||
- Core entry points: `src/app/_layout.tsx` wires global providers, while `src/app/index.tsx` (and nested routes under `src/app/(main)`) drive navigation via Expo Router.
|
||||
- State flows through colocated Zustand stores such as `store/chat`, `store/session`, and `store/openai`; selectors in `store/session/selectors` keep components efficient.
|
||||
- Key platform features include Markdown + math rendering (React Native Markdown, Shiki, MathJax), streaming chat transport via `utils/fetchSSE`, and tRPC clients configured in `utils/trpc`.
|
||||
- Follow the domain guides in `rules/` (e.g., `project-overview.mdc`, `state-management.mdc`, `api-integration.mdc`) for deeper architecture context before implementing changes.
|
||||
|
||||
## Build and Test Commands
|
||||
|
||||
| Task | Command | Notes |
|
||||
| ------------------------------ | ------------------------------------------------- | ----------------------------------------------------------------- |
|
||||
| Install dependencies | `pnpm install` | Requires Node 18+ and pnpm 8+. |
|
||||
| Start Expo dev server | `pnpm start` | Opens the Metro bundler with QR code pairing. |
|
||||
| Run on iOS simulator/device | `pnpm ios` / `pnpm device:ios` | Uses `expo run:ios`; ensure Xcode tooling is installed. |
|
||||
| Run on Android emulator/device | `pnpm android` / `pnpm device:android` | Uses `expo run:android`; start an emulator first. |
|
||||
| Web preview | `pnpm web` | Launches the web bundle for quick UI checks. |
|
||||
| Jest unit tests | `pnpm test` | Runs through `jest-expo` with coverage enabled. |
|
||||
| Lint TypeScript/JS | `pnpm lint` | Delegates to Expo + ESLint rules defined in repo. |
|
||||
| Format sources | `pnpm prettier` | Applies Prettier across the workspace. |
|
||||
| Generate translations | `pnpm i18n` | Executes scripted workflow from `rules/internationalization.mdc`. |
|
||||
| Production builds | `pnpm production:ios` / `pnpm production:android` | Wraps EAS build profiles from `eas.json`. |
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
- TypeScript runs in strict mode; define interfaces/types for component props and store state, avoiding `any`. Reference `rules/app-structure.mdc` and `rules/state-management.mdc` for patterns.
|
||||
- File naming: Components in PascalCase, hooks in camelCase prefixed with `use`, utilities in camelCase, constants in UPPER_SNAKE_CASE (see `rules/development-workflow.mdc`).
|
||||
- Use absolute imports with the `@/` alias; group imports by React, third-party, then internal modules.
|
||||
- Keep UI logic declarative; colocate styles in `styles.ts` companions and respect theming conventions from `rules/color-system.mdc`.
|
||||
- Run `pnpm lint` and `pnpm prettier` before committing. Git hooks enforce Conventional Commits and formatting, so align commit messages with `feat|fix|chore` etc.
|
||||
|
||||
## Testing Instructions
|
||||
|
||||
- Place tests under `test/` or alongside components as `*.test.ts(x)` per `rules/react-native.mdc` guidance.
|
||||
- Use `@testing-library/react-native` for rendering and interaction assertions; rely on user-centered queries rather than implementation details.
|
||||
- Mock async integrations (SecureStore, **MMKV**, network services) using Jest mocks; reference `rules/debug-usage.mdc` for logging utilities during tests.
|
||||
- MMKV is mocked in `test/utils.tsx` with an in-memory Map for test isolation.
|
||||
- Prefer explicit assertions over brittle snapshots; when snapshots are required, keep them under `__snapshots__` directories.
|
||||
- Run `pnpm test --watch` during iteration and ensure `pnpm test` + `pnpm lint` pass before opening a PR.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- Keep provider keys in `.env.local` (copied from `.env.example`) and load them through the secure configuration flows in `store/openai`; never commit secrets.
|
||||
- Persist sensitive tokens with `expo-secure-store`; configuration data uses MMKV as outlined in `rules/state-management.mdc`.
|
||||
- Validate API responses and sanitize Markdown before render—Shiki/remark plugins are already configured, but keep dependencies patched.
|
||||
- Enforce HTTPS endpoints for remote calls; review EAS credentials and signing configs before production builds.
|
||||
- Monitor dependency upgrades touching auth libraries (`expo-auth-session`, `jose`, `jwt-decode`) and align with guidance in `rules/development-workflow.mdc`.
|
||||
|
||||
## Additional References
|
||||
|
||||
- `rules/quick-reference.mdc` for command cheatsheets.
|
||||
- `rules/internationalization.mdc` to extend locale coverage.
|
||||
- `rules/debug-usage.mdc` for logging and diagnostics standards.
|
||||
@@ -0,0 +1,407 @@
|
||||
Attribution-NonCommercial 4.0 International
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||
does not provide legal services or legal advice. Distribution of
|
||||
Creative Commons public licenses does not create a lawyer-client or
|
||||
other relationship. Creative Commons makes its licenses and related
|
||||
information available on an "as-is" basis. Creative Commons gives no
|
||||
warranties regarding its licenses, any material licensed under their
|
||||
terms and conditions, or any related information. Creative Commons
|
||||
disclaims all liability for damages resulting from their use to the
|
||||
fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and
|
||||
conditions that creators and other rights holders may use to share
|
||||
original works of authorship and other material subject to copyright
|
||||
and certain other rights specified in the public license below. The
|
||||
following considerations are for informational purposes only, are not
|
||||
exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: By using one of our public
|
||||
licenses, a licensor grants the public permission to use the
|
||||
licensed material under specified terms and conditions. If
|
||||
the licensor's permission is not necessary for any reason--for
|
||||
example, because of any applicable exception or limitation to
|
||||
copyright--then that use is not regulated by the license. Our
|
||||
licenses grant only permissions under copyright and certain
|
||||
other rights that a licensor has authority to grant. Use of
|
||||
the licensed material may still be restricted for other
|
||||
reasons, including because others have copyright or other
|
||||
rights in the material. A licensor may make special requests,
|
||||
such as asking that all changes be marked or described.
|
||||
Although not required by our licenses, you are encouraged to
|
||||
respect those requests where reasonable. More considerations
|
||||
for the public:
|
||||
wiki.creativecommons.org/Considerations_for_licensees
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Attribution-NonCommercial 4.0 International Public
|
||||
License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution-NonCommercial 4.0 International Public License ("Public
|
||||
License"). To the extent this Public License may be interpreted as a
|
||||
contract, You are granted the Licensed Rights in consideration of Your
|
||||
acceptance of these terms and conditions, and the Licensor grants You
|
||||
such rights in consideration of benefits the Licensor receives from
|
||||
making the Licensed Material available under these terms and
|
||||
conditions.
|
||||
|
||||
|
||||
Section 1 -- Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material
|
||||
and in which the Licensed Material is translated, altered,
|
||||
arranged, transformed, or otherwise modified in a manner requiring
|
||||
permission under the Copyright and Similar Rights held by the
|
||||
Licensor. For purposes of this Public License, where the Licensed
|
||||
Material is a musical work, performance, or sound recording,
|
||||
Adapted Material is always produced where the Licensed Material is
|
||||
synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright
|
||||
and Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
performance, broadcast, sound recording, and Sui Generis Database
|
||||
Rights, without regard to how the rights are labeled or
|
||||
categorized. For purposes of this Public License, the rights
|
||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||
Rights.
|
||||
d. Effective Technological Measures means those measures that, in the
|
||||
absence of proper authority, may not be circumvented under laws
|
||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||
Treaty adopted on December 20, 1996, and/or similar international
|
||||
agreements.
|
||||
|
||||
e. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||
any other exception or limitation to Copyright and Similar Rights
|
||||
that applies to Your use of the Licensed Material.
|
||||
|
||||
f. Licensed Material means the artistic or literary work, database,
|
||||
or other material to which the Licensor applied this Public
|
||||
License.
|
||||
|
||||
g. Licensed Rights means the rights granted to You subject to the
|
||||
terms and conditions of this Public License, which are limited to
|
||||
all Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
h. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
|
||||
i. NonCommercial means not primarily intended for or directed towards
|
||||
commercial advantage or monetary compensation. For purposes of
|
||||
this Public License, the exchange of the Licensed Material for
|
||||
other material subject to Copyright and Similar Rights by digital
|
||||
file-sharing or similar means is NonCommercial provided there is
|
||||
no payment of monetary compensation in connection with the
|
||||
exchange.
|
||||
|
||||
j. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such
|
||||
as reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
k. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and of
|
||||
the Council of 11 March 1996 on the legal protection of databases,
|
||||
as amended and/or succeeded, as well as other essentially
|
||||
equivalent rights anywhere in the world.
|
||||
|
||||
l. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
|
||||
Section 2 -- Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
a. reproduce and Share the Licensed Material, in whole or
|
||||
in part, for NonCommercial purposes only; and
|
||||
|
||||
b. produce, reproduce, and Share Adapted Material for
|
||||
NonCommercial purposes only.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||
Exceptions and Limitations apply to Your use, this Public
|
||||
License does not apply, and You do not need to comply with
|
||||
its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section
|
||||
6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in
|
||||
all media and formats whether now known or hereafter created,
|
||||
and to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including
|
||||
technical modifications necessary to circumvent Effective
|
||||
Technological Measures. For purposes of this Public License,
|
||||
simply making modifications authorized by this Section 2(a)
|
||||
(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
a. Offer from the Licensor -- Licensed Material. Every
|
||||
recipient of the Licensed Material automatically
|
||||
receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this
|
||||
Public License.
|
||||
|
||||
b. No downstream restrictions. You may not offer or impose
|
||||
any additional or different terms or conditions on, or
|
||||
apply any Effective Technological Measures to, the
|
||||
Licensed Material if doing so restricts exercise of the
|
||||
Licensed Rights by any recipient of the Licensed
|
||||
Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not
|
||||
licensed under this Public License, nor are publicity,
|
||||
privacy, and/or other similar personality rights; however, to
|
||||
the extent possible, the Licensor waives and/or agrees not to
|
||||
assert any such rights held by the Licensor to the limited
|
||||
extent necessary to allow You to exercise the Licensed
|
||||
Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this
|
||||
Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to
|
||||
collect royalties from You for the exercise of the Licensed
|
||||
Rights, whether directly or through a collecting society
|
||||
under any voluntary or waivable statutory or compulsory
|
||||
licensing scheme. In all other cases the Licensor expressly
|
||||
reserves any right to collect such royalties, including when
|
||||
the Licensed Material is used other than for NonCommercial
|
||||
purposes.
|
||||
|
||||
|
||||
Section 3 -- License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the
|
||||
following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
|
||||
a. retain the following if it is supplied by the Licensor
|
||||
with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed
|
||||
Material and any others designated to receive
|
||||
attribution, in any reasonable manner requested by
|
||||
the Licensor (including by pseudonym if
|
||||
designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the
|
||||
extent reasonably practicable;
|
||||
|
||||
b. indicate if You modified the Licensed Material and
|
||||
retain an indication of any previous modifications; and
|
||||
|
||||
c. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI or
|
||||
hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may be
|
||||
reasonable to satisfy the conditions by providing a URI or
|
||||
hyperlink to a resource that includes the required
|
||||
information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section 3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
|
||||
4. If You Share Adapted Material You produce, the Adapter's
|
||||
License You apply must not prevent recipients of the Adapted
|
||||
Material from complying with this Public License.
|
||||
|
||||
|
||||
Section 4 -- Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||
to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database for NonCommercial purposes
|
||||
only;
|
||||
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material; and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share
|
||||
all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
|
||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||
|
||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
|
||||
Section 6 -- Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply with
|
||||
this Public License, then Your rights under this Public License
|
||||
terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under
|
||||
Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided
|
||||
it is cured within 30 days of Your discovery of the
|
||||
violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||
right the Licensor may have to seek remedies for Your violations
|
||||
of this Public License.
|
||||
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||
License.
|
||||
|
||||
|
||||
Section 7 -- Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
|
||||
Section 8 -- Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and
|
||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is
|
||||
deemed unenforceable, it shall be automatically reformed to the
|
||||
minimum extent necessary to make it enforceable. If the provision
|
||||
cannot be reformed, it shall be severed from this Public License
|
||||
without affecting the enforceability of the remaining terms and
|
||||
conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no
|
||||
failure to comply consented to unless expressly agreed to by the
|
||||
Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted
|
||||
as a limitation upon, or waiver of, any privileges and immunities
|
||||
that apply to the Licensor or You, including from the legal
|
||||
processes of any jurisdiction or authority.
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons is not a party to its public
|
||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||
its public licenses to material it publishes and in those instances
|
||||
will be considered the "Licensor." The text of the Creative Commons
|
||||
public licenses is dedicated to the public domain under the CC0 Public
|
||||
Domain Dedication. Except for the limited purpose of indicating that
|
||||
material is shared under a Creative Commons public license or as
|
||||
otherwise permitted by the Creative Commons policies published at
|
||||
creativecommons.org/policies, Creative Commons does not authorize the
|
||||
use of the trademark "Creative Commons" or any other trademark or logo
|
||||
of Creative Commons without its prior written consent including,
|
||||
without limitation, in connection with any unauthorized modifications
|
||||
to any of its public licenses or any other arrangements,
|
||||
understandings, or agreements concerning use of licensed material. For
|
||||
the avoidance of doubt, this paragraph does not form part of the
|
||||
public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
@@ -0,0 +1,558 @@
|
||||
<div align="center"><a name="readme-top"></a>
|
||||
|
||||
<img width="128" height="128" alt="appicon" src="https://github.com/user-attachments/assets/13c89551-5dd5-4dfb-9397-1aaf467c841f" />
|
||||
|
||||
# LobeHub Mobile
|
||||
|
||||
Your Workspace, Anywhere
|
||||
|
||||
The LobeHub application for iOS, and Android
|
||||
|
||||
[Parent Project][parent-project] · [Changelog][changelog] · [Report Bug][issues-link] · [Request Feature][issues-link]
|
||||
|
||||
<!-- SHIELD GROUP -->
|
||||
|
||||
[![][expo-sdk-shield]][expo-link]
|
||||
[![][react-native-shield]][react-native-link]
|
||||
[![][typescript-shield]][typescript-link]<br/>
|
||||
[![][license-shield]][license-link]
|
||||
[![][github-stars-shield]][github-stars-link]
|
||||
[![][github-forks-shield]][github-forks-link]
|
||||
[![][github-issues-shield]][github-issues-link]
|
||||
|
||||
**Share LobeHub Mobile**
|
||||
|
||||
[![][share-x-shield]][share-x-link]
|
||||
[![][share-telegram-shield]][share-telegram-link]
|
||||
[![][share-whatsapp-shield]][share-whatsapp-link]
|
||||
[![][share-reddit-shield]][share-reddit-link]
|
||||
|
||||
<sup>Experience AI conversations on your mobile device. Built for you, the Super Individual.</sup>
|
||||
|
||||

|
||||
|
||||
</div>
|
||||
|
||||
> \[!IMPORTANT]
|
||||
>
|
||||
> **📱 iOS Open Beta Now Available!**
|
||||
>
|
||||
> Join our TestFlight beta program and be among the first to experience LobeHub Mobile on your iPhone or iPad!
|
||||
>
|
||||
> 🔗 **[Join TestFlight Beta](https://testflight.apple.com/join/2ZbjX4Qp)**
|
||||
>
|
||||
> We'd love to hear your feedback! Share your experience with us on [Discord][discord-link] or [GitHub Issues][issues-link]. 🫰
|
||||
|
||||
<details>
|
||||
<summary><kbd>Table of contents</kbd></summary>
|
||||
|
||||
#### TOC
|
||||
|
||||
- [👋🏻 Getting Started](#-getting-started)
|
||||
- [✨ Features](#-features)
|
||||
- [📱 Cross-Platform Native Experience](#-cross-platform-native-experience)
|
||||
- [🎨 Modern UI Design](#-modern-ui-design)
|
||||
- [🤖 Multi-Model AI Provider Support](#-multi-model-ai-provider-support)
|
||||
- [💬 Rich Conversation Features](#-rich-conversation-features)
|
||||
- [🔒 Privacy & Security First](#-privacy--security-first)
|
||||
- [`*` What's more](#-whats-more)
|
||||
- [📱 Platform Support](#-platform-support)
|
||||
- [🚀 Quick Start](#-quick-start)
|
||||
- [Installation](#installation)
|
||||
- [Configuration](#configuration)
|
||||
- [Development](#development)
|
||||
- [🛠️ Tech Stack](#️-tech-stack)
|
||||
- [⌨️ Local Development](#️-local-development)
|
||||
- [Available Scripts](#available-scripts)
|
||||
- [Project Structure](#project-structure)
|
||||
- [Development Workflow](#development-workflow)
|
||||
- [🤝 Contributing](#-contributing)
|
||||
- [Contribution Workflow](#contribution-workflow)
|
||||
- [Development Standards](#development-standards)
|
||||
- [📦 Ecosystem](#-ecosystem)
|
||||
- [❤️ Community](#️-community)
|
||||
|
||||
####
|
||||
|
||||
<br/>
|
||||
|
||||
</details>
|
||||
|
||||
## 👋🏻 Getting Started
|
||||
|
||||
We are bringing the powerful LobeHub experience to your mobile devices! Whether you're an iOS or Android user, LobeHub Mobile provides a seamless, native AI chat experience on the go.
|
||||
|
||||
| [![][testflight-shield]][testflight-link] | Download the iOS beta now! Join our TestFlight program to experience LobeHub Mobile. |
|
||||
| :---------------------------------------: | :----------------------------------------------------------------------------------- |
|
||||
| [![][discord-shield-badge]][discord-link] | Join our Discord community! Connect with other users and share your feedback. |
|
||||
|
||||
> \[!IMPORTANT]
|
||||
>
|
||||
> **Star Us**, You will receive all release notifications from GitHub without any delay \~ ⭐️
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## ✨ Features
|
||||
|
||||
### 📱 Cross-Platform Native Experience
|
||||
|
||||
**True Native Performance on Both Platforms**
|
||||
|
||||
Built with React Native and Expo SDK 54, LobeHub Mobile delivers genuine native performance across iOS and Android. Enjoy smooth 60fps animations, instant touch feedback, and platform-specific UI patterns that feel right at home on your device.
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
### 🎨 Modern UI Design
|
||||
|
||||
**Beautifully Crafted for Mobile**
|
||||
|
||||
- 💎 **Refined Interface**: Carefully crafted UI with elegant visuals and smooth interactions
|
||||
- 🌗 **Adaptive Themes**: Seamless dark/light mode switching that follows system preferences
|
||||
- 📱 **Mobile-First**: Optimized touch interactions and gestures for the best mobile experience
|
||||
- ✨ **Fluid Animations**: Powered by React Native Reanimated for buttery-smooth 60fps animations
|
||||
- 🎯 **Native Patterns**: Platform-specific UI components following iOS and Android design guidelines
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
### 🤖 Multi-Model AI Provider Support
|
||||
|
||||
**60+ AI Service Providers at Your Fingertips**
|
||||
|
||||
LobeHub Mobile supports an extensive range of AI service providers, giving you unparalleled flexibility to choose the best models for your needs:
|
||||
|
||||
**Major Providers:**
|
||||
|
||||
- **OpenAI**: GPT-4o, GPT-4 Turbo, GPT-3.5, and more
|
||||
- **Anthropic**: Claude 3.5 Sonnet, Claude 3 Opus/Sonnet/Haiku
|
||||
- **Google**: Gemini 2.0 Flash, Gemini Pro, and Vision models
|
||||
- **Microsoft**: Azure OpenAI, Azure AI services
|
||||
- **xAI**: Grok models
|
||||
|
||||
**Local & Self-Hosted:**
|
||||
|
||||
- Ollama, LM Studio, vLLM, Xinference
|
||||
|
||||
**Chinese Providers:**
|
||||
|
||||
- DeepSeek, Moonshot, Qwen, ZhiPu, Baichuan, Minimax
|
||||
- Hunyuan, Spark, SenseNova, Wenxin, and more
|
||||
|
||||
**Additional Providers:**
|
||||
|
||||
- Groq, Perplexity, Mistral, Together AI, Fireworks AI
|
||||
- OpenRouter, HuggingFace, Cloudflare Workers AI
|
||||
- Bedrock, Vertex AI, and 40+ more providers
|
||||
|
||||
> \[!TIP]
|
||||
>
|
||||
> Seamlessly switch between providers and models. All API keys are stored securely using Expo SecureStore (iOS Keychain / Android Keystore).
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
### 💬 Rich Conversation Features
|
||||
|
||||
**Everything You Need for Powerful AI Conversations**
|
||||
|
||||
- 🗣️ **Streaming Responses**: Real-time AI replies with smooth streaming animation
|
||||
- 📝 **Rich Markdown**: Full Markdown support with tables, lists, GFM, and alerts
|
||||
- 🎨 **Code Highlighting**: Professional syntax highlighting powered by Shiki (100+ languages)
|
||||
- 📐 **Math Rendering**: Beautiful LaTeX formula rendering with KaTeX
|
||||
- 🎙️ **Voice Interaction**: Built-in TTS (Text-to-Speech) and STT (Speech-to-Text) support
|
||||
- 🖼️ **Vision Models**: Upload images and chat with vision-enabled AI models
|
||||
- 🎨 **Image Generation**: Create images with DALL·E, Midjourney, and more
|
||||
- 💾 **Lightning Fast Storage**: MMKV-powered local storage for instant access
|
||||
- 📤 **Export & Share**: Export conversations in multiple formats
|
||||
- 🔄 **Multi-Session**: Manage unlimited conversations with smart organization
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
### 🔒 Privacy & Security First
|
||||
|
||||
**Your Data, Your Control**
|
||||
|
||||
- 🔐 **Secure Storage**: API keys protected with Expo SecureStore (iOS Keychain / Android Keystore)
|
||||
- 💾 **Local First**: All data stored locally on your device using MMKV
|
||||
- 🚫 **No Tracking**: Zero analytics or tracking - your conversations stay private
|
||||
- 🔓 **Open Source**: Fully transparent codebase you can audit and trust
|
||||
- 📴 **Offline Access**: View your chat history even without internet connection
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
### `*` What's more
|
||||
|
||||
Beyond these features, LobeHub Mobile also offers:
|
||||
|
||||
- [x] 🌐 **i18n Support**: Built-in support for 18 languages with auto-detection
|
||||
- [x] 🎯 **Context Menu**: Long-press for quick actions (copy, delete, retry, regenerate)
|
||||
- [x] 📋 **Smart Copy**: Intelligent content detection for code blocks, text, or entire messages
|
||||
- [x] 🔍 **Global Search**: Quickly find messages across all conversations with full-text search
|
||||
- [x] 🏷️ **Session Groups**: Organize conversations with custom groups, folders, and tags
|
||||
- [x] 🗂️ **Topic Management**: Auto-create topics and organize conversations by context
|
||||
- [x] ⚙️ **Advanced Customization**: Fine-tune model parameters (temperature, top-p, frequency penalty, etc.)
|
||||
- [x] 📱 **Haptic Feedback**: Native haptic feedback for enhanced touch experience
|
||||
- [x] 🎨 **Theme System**: Dynamic theming with dark/light modes and system preferences
|
||||
- [x] 🔔 **Push Notifications**: Stay updated with conversation notifications
|
||||
- [x] 📊 **Token Usage Tracking**: Monitor your API usage and costs
|
||||
- [x] 🔄 **Pull to Refresh**: Natural gesture-based UI updates
|
||||
- [x] ⌨️ **Keyboard Shortcuts**: Enhanced productivity with keyboard controls
|
||||
- [x] 📤 **Import/Export**: Backup and restore your conversations
|
||||
|
||||
> ✨ More features will be added as LobeHub Mobile evolves.
|
||||
|
||||
---
|
||||
|
||||
> \[!NOTE]
|
||||
>
|
||||
> Check out our [Roadmap](https://github.com/lobehub/lobe-chat/projects) to see what's coming next!
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## 📱 Platform Support
|
||||
|
||||
| Platform | Status | Recommended |
|
||||
| -------- | --------------- | --------------------- |
|
||||
| iOS | ✅ Fully Tested | iOS 18.0+ |
|
||||
| Android | ✅ Fully Tested | Android 15.0 (API 35) |
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Installation
|
||||
|
||||
1. Clone the repository:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/lobehub/lobe-chat.git
|
||||
cd lobe-chat/apps/mobile
|
||||
```
|
||||
|
||||
2. Install dependencies:
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
1. Copy the environment template:
|
||||
|
||||
```bash
|
||||
cp .env.example .env.local
|
||||
```
|
||||
|
||||
2. Configure your API keys in `.env.local`:
|
||||
|
||||
```bash
|
||||
# OpenAI API Key (Required)
|
||||
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxx
|
||||
|
||||
# Optional: Custom API Base URL
|
||||
# OPENAI_PROXY_URL=https://api.openai.com/v1
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
Start the development server:
|
||||
|
||||
```bash
|
||||
# Start Expo development server
|
||||
pnpm start
|
||||
|
||||
# Or run directly on a specific platform
|
||||
pnpm ios # iOS simulator (macOS only)
|
||||
pnpm android # Android emulator
|
||||
pnpm web # Web browser preview
|
||||
```
|
||||
|
||||
**Testing on Physical Devices:**
|
||||
|
||||
1. Install [Expo Go](https://expo.dev/client) on your device:
|
||||
- [📱 iOS App Store](https://apps.apple.com/app/expo-go/id982107779)
|
||||
- [🤖 Google Play Store](https://play.google.com/store/apps/details?id=host.exp.exponent)
|
||||
|
||||
2. Scan the QR code in the terminal with Expo Go to launch the app
|
||||
|
||||
> \[!TIP]
|
||||
>
|
||||
> For a faster development experience on physical devices, consider using [EAS Build](https://docs.expo.dev/build/introduction/) to create custom development builds.
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## 🛠️ Tech Stack
|
||||
|
||||
Our technology choices focus on **performance**, **developer experience**, and **maintainability**:
|
||||
|
||||
| Technology | Version | Purpose |
|
||||
| -------------------------------- | -------- | --------------------------------------- |
|
||||
| **React Native** | 0.81.5 | Core framework for cross-platform apps |
|
||||
| **Expo SDK** | \~54.0.0 | Development platform and native modules |
|
||||
| **TypeScript** | ^5.8.2 | Type safety and better DX |
|
||||
| **Expo Router** | \~4.0.17 | File-based navigation |
|
||||
| **Zustand** | ^5.0.3 | Lightweight state management |
|
||||
| **MMKV** | ^3.1.0 | Lightning-fast local storage |
|
||||
| **React Native Reanimated** | \~3.16.7 | 60fps animations on native thread |
|
||||
| **React Native Gesture Handler** | \~2.20.2 | Native touch gestures |
|
||||
| **Shiki** | ^3.1.0 | Beautiful code syntax highlighting |
|
||||
| **React Native Markdown** | Latest | Rich markdown rendering |
|
||||
| **React i18next** | ^15.2.0 | Internationalization (18 languages) |
|
||||
| **Jest** | Latest | Testing framework |
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## ⌨️ Local Development
|
||||
|
||||
### Available Scripts
|
||||
|
||||
```bash
|
||||
# Development
|
||||
pnpm start # Start Expo dev server
|
||||
pnpm ios # Run on iOS simulator
|
||||
pnpm android # Run on Android emulator
|
||||
pnpm web # Run in web browser
|
||||
|
||||
# Testing & Quality
|
||||
pnpm test # Run Jest tests
|
||||
pnpm test:watch # Run tests in watch mode
|
||||
pnpm lint # Run ESLint
|
||||
pnpm type-check # Run TypeScript compiler check
|
||||
|
||||
# Internationalization
|
||||
pnpm i18n # Generate translations for all languages
|
||||
|
||||
# Production
|
||||
pnpm build # Create production build
|
||||
pnpm production:ios # Build iOS production app
|
||||
pnpm production:android # Build Android production app
|
||||
```
|
||||
|
||||
### Project Structure
|
||||
|
||||
```bash
|
||||
apps/mobile/
|
||||
├── app/ # Expo Router pages
|
||||
│ ├── (main)/ # Main app routes
|
||||
│ ├── (setting)/ # Settings routes
|
||||
│ └── playground/ # Component playground
|
||||
├── src/
|
||||
│ ├── components/ # Reusable UI components
|
||||
│ ├── features/ # Feature-based modules
|
||||
│ ├── store/ # Zustand stores
|
||||
│ ├── types/ # TypeScript types
|
||||
│ ├── utils/ # Utility functions
|
||||
│ └── locales/ # i18n source files
|
||||
├── assets/ # Images, fonts, etc.
|
||||
├── locales/ # Generated translations
|
||||
└── test/ # Test utilities
|
||||
```
|
||||
|
||||
### Development Workflow
|
||||
|
||||
1. **Feature Development**
|
||||
- Create feature branch from `feat/mobile-app`
|
||||
- Follow [Development Guidelines](./docs/DEVELOPMENT.md)
|
||||
- Write tests for new features
|
||||
|
||||
2. **Code Quality**
|
||||
- Run `pnpm lint` before committing
|
||||
- Use TypeScript strictly (no `any`)
|
||||
- Follow existing code patterns
|
||||
|
||||
3. **Internationalization**
|
||||
- Add translations to `src/locales/default/common.ts`
|
||||
- Run `pnpm i18n` to generate all languages
|
||||
- Test with different locales in app settings
|
||||
|
||||
4. **Testing**
|
||||
- Write unit tests for utilities and hooks
|
||||
- Write component tests with React Native Testing Library
|
||||
- Ensure `pnpm test` passes before PR
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
Contributions of all types are more than welcome! If you are interested in contributing code, feel free to check out our GitHub [Issues](https://github.com/lobehub/lobe-chat/issues) and [Projects](https://github.com/lobehub/lobe-chat/projects).
|
||||
|
||||
> \[!TIP]
|
||||
>
|
||||
> We are building a modern mobile AI chat application. Join us in creating an amazing user experience!
|
||||
>
|
||||
> Whether it's **reporting bugs**, **requesting features**, **improving documentation**, or **contributing code** - we appreciate it all.
|
||||
|
||||
[![][pr-welcome-shield]][pr-welcome-link]
|
||||
|
||||
### Contribution Workflow
|
||||
|
||||
1. **Fork** the repository
|
||||
2. **Clone** your fork: `git clone https://github.com/your-username/lobe-chat.git`
|
||||
3. **Create** a feature branch: `git checkout -b feature/amazing-feature`
|
||||
4. **Make** your changes
|
||||
5. **Test** your changes: `pnpm test && pnpm lint`
|
||||
6. **Commit** with conventional commit messages: `git commit -m 'feat: add amazing feature'`
|
||||
7. **Push** to your fork: `git push origin feature/amazing-feature`
|
||||
8. **Open** a Pull Request
|
||||
|
||||
### Development Standards
|
||||
|
||||
- 📝 **Commit Messages**: Follow [Conventional Commits](https://conventionalcommits.org/)
|
||||
- `feat:` New features
|
||||
- `fix:` Bug fixes
|
||||
- `docs:` Documentation changes
|
||||
- `style:` Code style changes (formatting, etc.)
|
||||
- `refactor:` Code refactoring
|
||||
- `test:` Adding or updating tests
|
||||
- `chore:` Build process or auxiliary tool changes
|
||||
|
||||
- 💻 **Code Style**
|
||||
- Use TypeScript strictly
|
||||
- Follow ESLint and Prettier rules
|
||||
- Write meaningful variable and function names
|
||||
- Add comments for complex logic
|
||||
|
||||
- 🧪 **Testing**
|
||||
- Write tests for new features
|
||||
- Ensure all tests pass
|
||||
- Maintain or improve code coverage
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## 📦 Ecosystem
|
||||
|
||||
| NPM | Repository | Description | Version |
|
||||
| --------------------------------- | --------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------- |
|
||||
| [@lobehub/ui][lobe-ui-link] | [lobehub/lobe-ui][lobe-ui-github] | Open-source UI component library for building AIGC web applications | [![][lobe-ui-shield]][lobe-ui-link] |
|
||||
| [@lobehub/icons][lobe-icons-link] | [lobehub/lobe-icons][lobe-icons-github] | Popular AI / LLM Model Brand SVG Logo and Icon Collection | [![][lobe-icons-shield]][lobe-icons-link] |
|
||||
| [@lobehub/tts][lobe-tts-link] | [lobehub/lobe-tts][lobe-tts-github] | High-quality & reliable TTS/STT React Hooks library | [![][lobe-tts-shield]][lobe-tts-link] |
|
||||
| [@lobehub/lint][lobe-lint-link] | [lobehub/lobe-lint][lobe-lint-github] | ESlint, Stylelint, Commitlint, Prettier configurations for LobeHub | [![][lobe-lint-shield]][lobe-lint-link] |
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
## ❤️ Community
|
||||
|
||||
We are a group of e/acc design-engineers, hoping to provide modern design components and tools for AIGC. By adopting the Bootstrapping approach, we aim to provide developers and users with a more open, transparent, and user-friendly product ecosystem.
|
||||
|
||||
| [![][parent-shield]][parent-project] | No installation or registration necessary! Visit our website to experience the web version firsthand. |
|
||||
| :---------------------------------------: | :---------------------------------------------------------------------------------------------------- |
|
||||
| [![][discord-shield-badge]][discord-link] | Join our Discord community! Connect with developers and other enthusiastic users of LobeHub. |
|
||||
|
||||
> \[!IMPORTANT]
|
||||
>
|
||||
> **Star Us**, You will receive all release notifications from GitHub without any delay \~ ⭐️
|
||||
|
||||
<div align="right">
|
||||
|
||||
[![][back-to-top]](#readme-top)
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
#### 📝 License
|
||||
|
||||
[![][license-image]][license-link]
|
||||
|
||||
Copyright © 2025 [LobeHub][profile-link]. <br />
|
||||
This project is licensed under a [Creative Commons Attribution-NonCommercial 4.0 International License][license-link].
|
||||
|
||||
<!-- LINK GROUP -->
|
||||
|
||||
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square
|
||||
[changelog]: https://github.com/lobehub/lobe-chat/blob/main/CHANGELOG.md
|
||||
[discord-link]: https://discord.gg/AYFPHvv2jT
|
||||
[discord-shield-badge]: https://img.shields.io/discord/1127171173982154893?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=for-the-badge
|
||||
[expo-link]: https://expo.dev
|
||||
[expo-sdk-shield]: https://img.shields.io/badge/Expo-54.0.0-000020?labelColor=black&logo=expo&style=flat-square
|
||||
[github-forks-link]: https://github.com/lobehub/lobe-chat/network/members
|
||||
[github-forks-shield]: https://img.shields.io/github/forks/lobehub/lobe-chat?color=8ae8ff&labelColor=black&style=flat-square
|
||||
[github-issues-link]: https://github.com/lobehub/lobe-chat/issues
|
||||
[github-issues-shield]: https://img.shields.io/github/issues/lobehub/lobe-chat?color=ff80eb&labelColor=black&style=flat-square
|
||||
[github-stars-link]: https://github.com/lobehub/lobe-chat/network/stargazers
|
||||
[github-stars-shield]: https://img.shields.io/github/stars/lobehub/lobe-chat?color=ffcb47&labelColor=black&style=flat-square
|
||||
[issues-link]: https://github.com/lobehub/lobe-chat/issues/new/choose
|
||||
[license-image]: https://licensebuttons.net/l/by-nc/4.0/88x31.png
|
||||
[license-link]: https://creativecommons.org/licenses/by-nc/4.0/
|
||||
[license-shield]: https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey?labelColor=black&style=flat-square
|
||||
[lobe-icons-github]: https://github.com/lobehub/lobe-icons
|
||||
[lobe-icons-link]: https://www.npmjs.com/package/@lobehub/icons
|
||||
[lobe-icons-shield]: https://img.shields.io/npm/v/@lobehub/icons?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
|
||||
[lobe-lint-github]: https://github.com/lobehub/lobe-lint
|
||||
[lobe-lint-link]: https://www.npmjs.com/package/@lobehub/lint
|
||||
[lobe-lint-shield]: https://img.shields.io/npm/v/@lobehub/lint?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
|
||||
[lobe-tts-github]: https://github.com/lobehub/lobe-tts
|
||||
[lobe-tts-link]: https://www.npmjs.com/package/@lobehub/tts
|
||||
[lobe-tts-shield]: https://img.shields.io/npm/v/@lobehub/tts?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
|
||||
[lobe-ui-github]: https://github.com/lobehub/lobe-ui
|
||||
[lobe-ui-link]: https://www.npmjs.com/package/@lobehub/ui
|
||||
[lobe-ui-shield]: https://img.shields.io/npm/v/@lobehub/ui?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
|
||||
[parent-project]: https://github.com/lobehub/lobe-chat
|
||||
[parent-shield]: https://img.shields.io/badge/🤯_Lobe_Chat-Web_Version-55b467?labelColor=black&style=for-the-badge
|
||||
[pr-welcome-link]: https://github.com/lobehub/lobe-chat/pulls
|
||||
[pr-welcome-shield]: https://img.shields.io/badge/🤯_PR_WELCOME-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge
|
||||
[profile-link]: https://github.com/lobehub
|
||||
[react-native-link]: https://reactnative.dev
|
||||
[react-native-shield]: https://img.shields.io/badge/React%20Native-0.81.5-61dafb?labelColor=black&logo=react&style=flat-square
|
||||
[share-reddit-link]: https://www.reddit.com/submit?title=Check%20this%20GitHub%20repository%20out%20%F0%9F%A4%AF%20LobeHub%20Mobile%20-%20An%20open-source%2C%20modern-design%20AI%20chat%20mobile%20application.%20One-click%20FREE%20deployment%20of%20your%20private%20ChatGPT%2FClaude%2FGemini%20mobile%20app.&url=https%3A%2F%2Fgithub.com%2Flobehub%2Flobe-chat
|
||||
[share-reddit-shield]: https://img.shields.io/badge/-share%20on%20reddit-black?labelColor=black&logo=reddit&logoColor=white&style=flat-square
|
||||
[share-telegram-link]: https://t.me/share/url?text=Check%20this%20GitHub%20repository%20out%20%F0%9F%A4%AF%20LobeHub%20Mobile%20-%20An%20open-source%2C%20modern-design%20AI%20chat%20mobile%20application.%20One-click%20FREE%20deployment%20of%20your%20private%20ChatGPT%2FClaude%2FGemini%20mobile%20app.&url=https%3A%2F%2Fgithub.com%2Flobehub%2Flobe-chat
|
||||
[share-telegram-shield]: https://img.shields.io/badge/-share%20on%20telegram-black?labelColor=black&logo=telegram&logoColor=white&style=flat-square
|
||||
[share-whatsapp-link]: https://api.whatsapp.com/send?text=Check%20this%20GitHub%20repository%20out%20%F0%9F%A4%AF%20LobeHub%20Mobile%20-%20An%20open-source%2C%20modern-design%20AI%20chat%20mobile%20application.%20One-click%20FREE%20deployment%20of%20your%20private%20ChatGPT%2FClaude%2FGemini%20mobile%20app.%20https%3A%2F%2Fgithub.com%2Flobehub%2Flobe-chat
|
||||
[share-whatsapp-shield]: https://img.shields.io/badge/-share%20on%20whatsapp-black?labelColor=black&logo=whatsapp&logoColor=white&style=flat-square
|
||||
[share-x-link]: https://x.com/intent/tweet?hashtags=chatbot%2CchatGPT%2Cmobile%2Creactnative&text=Check%20this%20GitHub%20repository%20out%20%F0%9F%A4%AF%20LobeHub%20Mobile%20-%20An%20open-source%2C%20modern-design%20AI%20chat%20mobile%20application.%20One-click%20FREE%20deployment%20of%20your%20private%20ChatGPT%2FClaude%2FGemini%20mobile%20app.&url=https%3A%2F%2Fgithub.com%2Flobehub%2Flobe-chat
|
||||
[share-x-shield]: https://img.shields.io/badge/-share%20on%20x-black?labelColor=black&logo=x&logoColor=white&style=flat-square
|
||||
[testflight-link]: https://testflight.apple.com/join/2ZbjX4Qp
|
||||
[testflight-shield]: https://img.shields.io/badge/TestFlight-iOS_Beta-0D96F6?labelColor=black&logo=apple&style=for-the-badge
|
||||
[typescript-link]: https://www.typescriptlang.org
|
||||
[typescript-shield]: https://img.shields.io/badge/TypeScript-5.8.2-3178c6?labelColor=black&logo=typescript&style=flat-square
|
||||
@@ -0,0 +1,200 @@
|
||||
import { ConfigContext, ExpoConfig } from 'expo/config';
|
||||
import 'tsx/cjs';
|
||||
|
||||
import { version } from './package.json';
|
||||
|
||||
/**
|
||||
* Expo 配置
|
||||
* 使用 TypeScript 提供类型安全和自动补全
|
||||
* @see https://docs.expo.dev/workflow/configuration/
|
||||
*/
|
||||
export default ({ config }: ConfigContext): ExpoConfig => ({
|
||||
...config,
|
||||
android: {
|
||||
adaptiveIcon: {
|
||||
backgroundColor: '#000000',
|
||||
backgroundImage: './assets/images/icon-android-background.png',
|
||||
foregroundImage: './assets/images/icon-android-foreground.png',
|
||||
monochromeImage: './assets/images/icon-android-foreground.png',
|
||||
},
|
||||
edgeToEdgeEnabled: true,
|
||||
icon: './assets/images/icon-android.png',
|
||||
package: 'com.lobehub.app',
|
||||
permissions: [
|
||||
'android.permission.READ_EXTERNAL_STORAGE',
|
||||
'android.permission.WRITE_EXTERNAL_STORAGE',
|
||||
'android.permission.READ_MEDIA_IMAGES',
|
||||
],
|
||||
},
|
||||
androidNavigationBar: {
|
||||
barStyle: 'light-content',
|
||||
},
|
||||
androidStatusBar: {
|
||||
barStyle: 'light-content',
|
||||
},
|
||||
experiments: {
|
||||
// @ts-ignore
|
||||
appDir: './src/app',
|
||||
typedRoutes: true,
|
||||
},
|
||||
extra: {
|
||||
eas: {
|
||||
projectId: 'f02d6f4f-e042-4c95-ba0d-ac06bb474ef0',
|
||||
},
|
||||
router: {
|
||||
origin: false,
|
||||
},
|
||||
},
|
||||
icon: './assets/images/icon.png',
|
||||
|
||||
ios: {
|
||||
appleTeamId: '4684H589ZU',
|
||||
bundleIdentifier: 'com.lobehub.app',
|
||||
icon: './assets/images/ios.icon',
|
||||
infoPlist: {
|
||||
ITSAppUsesNonExemptEncryption: false,
|
||||
NSAppTransportSecurity: {
|
||||
NSAllowsArbitraryLoads: true,
|
||||
},
|
||||
NSPhotoLibraryAddUsageDescription: '需要保存图片到相册',
|
||||
NSPhotoLibraryUsageDescription: '需要访问相册以保存图片',
|
||||
// 仅支持 iPhone
|
||||
UIDeviceFamily: [1],
|
||||
},
|
||||
// 声明不支持平板
|
||||
supportsTablet: false,
|
||||
userInterfaceStyle: 'automatic',
|
||||
},
|
||||
name: 'LobeHub',
|
||||
newArchEnabled: true,
|
||||
orientation: 'portrait',
|
||||
owner: 'lobehub',
|
||||
plugins: [
|
||||
['expo-build-properties', { ios: { deploymentTarget: '16.4' } }],
|
||||
'expo-router',
|
||||
'expo-video',
|
||||
['react-native-edge-to-edge', { android: { enforceNavigationBarContrast: false } }],
|
||||
[
|
||||
'expo-notifications',
|
||||
{
|
||||
color: '#000',
|
||||
icon: './assets/images/icon-android-notification.png',
|
||||
},
|
||||
],
|
||||
[
|
||||
'expo-splash-screen',
|
||||
{
|
||||
android: {
|
||||
backgroundColor: '#f5f5f5',
|
||||
dark: {
|
||||
backgroundColor: '#000',
|
||||
image: './assets/images/splash-icon.png',
|
||||
imageWidth: 150,
|
||||
},
|
||||
image: './assets/images/splash-icon.png',
|
||||
imageWidth: 150,
|
||||
},
|
||||
ios: {
|
||||
backgroundColor: '#f5f5f5',
|
||||
dark: {
|
||||
backgroundColor: '#000',
|
||||
enableFullScreenImage_legacy: true,
|
||||
image: './assets/images/splash-dark.png',
|
||||
resizeMode: 'cover',
|
||||
},
|
||||
enableFullScreenImage_legacy: true,
|
||||
image: './assets/images/splash.png',
|
||||
resizeMode: 'cover',
|
||||
},
|
||||
},
|
||||
],
|
||||
[
|
||||
'expo-font',
|
||||
{
|
||||
android: {
|
||||
fonts: [
|
||||
{
|
||||
fontDefinitions: [
|
||||
{
|
||||
path: './assets/fonts/Hack-Regular.ttf',
|
||||
weight: 400,
|
||||
},
|
||||
{
|
||||
path: './assets/fonts/Hack-Bold.ttf',
|
||||
weight: 700,
|
||||
},
|
||||
{
|
||||
path: './assets/fonts/Hack-Italic.ttf',
|
||||
style: 'italic',
|
||||
weight: 400,
|
||||
},
|
||||
{
|
||||
path: './assets/fonts/Hack-BoldItalic.ttf',
|
||||
style: 'italic',
|
||||
weight: 700,
|
||||
},
|
||||
],
|
||||
fontFamily: 'Hack',
|
||||
},
|
||||
{
|
||||
fontDefinitions: [
|
||||
{
|
||||
path: './assets/fonts/HarmonyOS_Sans_SC_Regular.ttf',
|
||||
weight: 400,
|
||||
},
|
||||
{
|
||||
path: './assets/fonts/HarmonyOS_Sans_SC_Medium.ttf',
|
||||
weight: 500,
|
||||
},
|
||||
{
|
||||
path: './assets/fonts/HarmonyOS_Sans_SC_Bold.ttf',
|
||||
weight: 700,
|
||||
},
|
||||
],
|
||||
fontFamily: 'HarmonyOS-Sans-SC',
|
||||
},
|
||||
],
|
||||
},
|
||||
fonts: [
|
||||
'./assets/fonts/Hack-Regular.ttf',
|
||||
'./assets/fonts/Hack-Bold.ttf',
|
||||
'./assets/fonts/Hack-Italic.ttf',
|
||||
'./assets/fonts/Hack-BoldItalic.ttf',
|
||||
'./assets/fonts/HarmonyOS_Sans_SC_Regular.ttf',
|
||||
'./assets/fonts/HarmonyOS_Sans_SC_Medium.ttf',
|
||||
'./assets/fonts/HarmonyOS_Sans_SC_Bold.ttf',
|
||||
],
|
||||
ios: {
|
||||
fonts: [
|
||||
'./assets/fonts/Hack-Regular.ttf',
|
||||
'./assets/fonts/Hack-Bold.ttf',
|
||||
'./assets/fonts/Hack-Italic.ttf',
|
||||
'./assets/fonts/Hack-BoldItalic.ttf',
|
||||
'./assets/fonts/HarmonyOS_Sans_SC_Regular.ttf',
|
||||
'./assets/fonts/HarmonyOS_Sans_SC_Medium.ttf',
|
||||
'./assets/fonts/HarmonyOS_Sans_SC_Bold.ttf',
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
'expo-secure-store',
|
||||
'expo-localization',
|
||||
'./plugins/withFbjniFix.ts',
|
||||
'./plugins/withAndroidTransparentNavigation.ts',
|
||||
],
|
||||
runtimeVersion: {
|
||||
policy: 'appVersion',
|
||||
},
|
||||
scheme: 'com.lobehub.app',
|
||||
slug: 'lobe-chat-react-native',
|
||||
updates: {
|
||||
url: 'https://u.expo.dev/f02d6f4f-e042-4c95-ba0d-ac06bb474ef0',
|
||||
},
|
||||
userInterfaceStyle: 'automatic',
|
||||
version: version,
|
||||
web: {
|
||||
bundler: 'metro',
|
||||
favicon: './assets/images/favicon.ico',
|
||||
output: 'static',
|
||||
},
|
||||
});
|
||||
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 925 KiB |
|
After Width: | Height: | Size: 465 KiB |
|
After Width: | Height: | Size: 376 KiB |
|
After Width: | Height: | Size: 947 KiB |
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"fill": "automatic",
|
||||
"groups": [
|
||||
{
|
||||
"blur-material": 1,
|
||||
"hidden": false,
|
||||
"layers": [
|
||||
{
|
||||
"glass": false,
|
||||
"image-name": "dLogo.png",
|
||||
"name": "dLogo",
|
||||
"position": {
|
||||
"scale": 0.65,
|
||||
"translation-in-points": [0, 0]
|
||||
}
|
||||
},
|
||||
{
|
||||
"glass": false,
|
||||
"hidden": true,
|
||||
"image-name": "Group 72.png",
|
||||
"name": "Group 72",
|
||||
"position": {
|
||||
"scale": 1.3,
|
||||
"translation-in-points": [0, 0]
|
||||
}
|
||||
}
|
||||
],
|
||||
"lighting": "individual",
|
||||
"shadow": {
|
||||
"kind": "neutral",
|
||||
"opacity": 0.5
|
||||
},
|
||||
"specular": true,
|
||||
"translucency": {
|
||||
"enabled": true,
|
||||
"value": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"supported-platforms": {
|
||||
"circles": ["watchOS"],
|
||||
"squares": "shared"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 637 KiB |
|
After Width: | Height: | Size: 606 KiB |
@@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
plugins: ['@babel/plugin-transform-class-static-block', 'react-native-worklets/plugin'],
|
||||
presets: [['babel-preset-expo', { unstable_transformImportMeta: true }]],
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"build": {
|
||||
"development": {
|
||||
"environment": "development",
|
||||
"developmentClient": true,
|
||||
"distribution": "internal",
|
||||
"ios": {
|
||||
"simulator": true,
|
||||
"config": "development-ios.yml"
|
||||
},
|
||||
"android": {
|
||||
"gradleCommand": ":app:assembleDebug",
|
||||
"config": "development-android.yml"
|
||||
},
|
||||
"pnpm": "10.10.0",
|
||||
"channel": "development"
|
||||
},
|
||||
"preview": {
|
||||
"environment": "preview",
|
||||
"distribution": "internal",
|
||||
"channel": "preview",
|
||||
"pnpm": "10.10.0"
|
||||
},
|
||||
"production": {
|
||||
"environment": "production",
|
||||
"autoIncrement": true,
|
||||
"channel": "production",
|
||||
"pnpm": "10.10.0"
|
||||
}
|
||||
},
|
||||
"cli": {
|
||||
"version": ">= 14.7.1",
|
||||
"appVersionSource": "remote"
|
||||
},
|
||||
"submit": {
|
||||
"production": {
|
||||
"ios": {
|
||||
"ascAppId": "6749615954"
|
||||
},
|
||||
"android": {
|
||||
"serviceAccountKeyPath": "./service-account-key.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import 'expo-crypto';
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
crypto: Crypto;
|
||||
}
|
||||
|
||||
const crypto: Crypto;
|
||||
|
||||
/** Expo / React Native 全局开发标记 */
|
||||
const __DEV__: boolean;
|
||||
}
|
||||
|
||||
// JSON 模块声明
|
||||
declare module '*.json' {
|
||||
const value: any;
|
||||
export default value;
|
||||
}
|
||||
|
||||
// 确保这个文件被当作模块处理
|
||||
export {};
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"collectCoverage": true,
|
||||
"collectCoverageFrom": [
|
||||
"src/**/*.{ts,tsx,js,jsx}",
|
||||
"app/**/*.{ts,tsx,js,jsx}",
|
||||
"!app/playground/**",
|
||||
"!**/node_modules/**"
|
||||
],
|
||||
"moduleFileExtensions": ["ts", "tsx", "js", "jsx"],
|
||||
"moduleNameMapper": {
|
||||
"^@/test/(.*)$": "<rootDir>/test/$1",
|
||||
"^@/(.*)$": "<rootDir>/src/$1",
|
||||
"^react-native$": "react-native-web"
|
||||
},
|
||||
"setupFiles": ["<rootDir>/test/jest.setup.js"],
|
||||
"setupFilesAfterEnv": ["<rootDir>/test/jest.setupAfterEnv.js"],
|
||||
"testEnvironment": "jsdom",
|
||||
"testMatch": ["**/__tests__/**/*.(ts|tsx|js)", "**/*.(test|spec).(ts|tsx|js)"],
|
||||
"transform": {
|
||||
"^.+\\.(js|jsx|ts|tsx)$": "babel-jest"
|
||||
},
|
||||
"transformIgnorePatterns": [
|
||||
"node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg)"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"login": {
|
||||
"button": "تسجيل الدخول إلى {{appName}}",
|
||||
"cancel": "إلغاء",
|
||||
"loginWithLobeHub": "تسجيل الدخول باستخدام حساب {{appName}}",
|
||||
"privacyPolicy": "سياسة الخصوصية",
|
||||
"processing": "جارٍ تسجيل الدخول، يرجى الانتظار...",
|
||||
"securityNote": "التوقيع يعني قبولك لـ",
|
||||
"selfHostedButton": "استخدام نسخة مستضافة ذاتيًا",
|
||||
"selfHostedContinue": "متابعة",
|
||||
"selfHostedDescription": "الاتصال بخادم LobeChat الذي قمت بنشره بنفسك.",
|
||||
"selfHostedHint": "سنحتفظ بعنوان هذا الخادم حتى تقوم بتبديله إلى النسخة الرسمية في الإعدادات.",
|
||||
"selfHostedInvalid": "يرجى إدخال عنوان HTTP أو HTTPS صالح.",
|
||||
"selfHostedPlaceholder": "https://your-lobechat-instance.com",
|
||||
"selfHostedRequired": "يرجى إدخال عنوان الخادم.",
|
||||
"selfHostedTitle": "أدخل عنوان الخادم المستضاف ذاتيًا",
|
||||
"subtitle": "مرحبًا بعودتك! يرجى تسجيل الدخول للمتابعة",
|
||||
"usePolicy": "شروط الاستخدام"
|
||||
},
|
||||
"logout": {
|
||||
"button": "تسجيل الخروج",
|
||||
"confirm": {
|
||||
"cancel": "إلغاء",
|
||||
"message": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
|
||||
"ok": "موافق",
|
||||
"title": "تأكيد تسجيل الخروج"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"verified": "تم التحقق"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"agentDefaultMessage": "مرحبًا، أنا **{{name}}**، يمكنك البدء في المحادثة معي فورًا، أو يمكنك الذهاب إلى [إعدادات المساعد]({{url}}) لتحديث معلوماتي.",
|
||||
"agentDefaultMessageWithSystemRole": "مرحبًا، أنا **{{name}}**، {{systemRole}}، هيا نبدأ المحادثة!",
|
||||
"agentDefaultMessageWithoutEdit": "مرحبًا، أنا **{{name}}**، هيا نبدأ المحادثة!",
|
||||
"agentList": "قائمة المساعدين",
|
||||
"agentRoleEdit": {
|
||||
"cancel": "إلغاء",
|
||||
"confirm": "تأكيد",
|
||||
"edit": "تعديل",
|
||||
"editButton": "تعديل إعدادات الدور",
|
||||
"placeholder": "يرجى إدخال كلمة تلميح الدور",
|
||||
"roleSetting": "إعداد الدور",
|
||||
"title": "إعداد الدور"
|
||||
},
|
||||
"confirmDelete": "تأكيد الحذف",
|
||||
"confirmRemoveSessionItemAlert": "سيتم حذف هذا المساعد ولن يمكن استعادته بعد الحذف، يرجى تأكيد العملية.",
|
||||
"copyFailed": "فشل النسخ",
|
||||
"defaultAgent": "مساعد مخصص",
|
||||
"defaultList": "القائمة الافتراضية",
|
||||
"deleteMessageConfirm": "هل أنت متأكد من حذف هذه الرسالة؟",
|
||||
"history": "سجل المحادثات",
|
||||
"inbox": {
|
||||
"desc": "فعّل مجموعة العقول لتحفيز شرارات الأفكار. مساعدك الذكي هنا للتواصل معك في كل شيء.",
|
||||
"title": "دردشة عشوائية"
|
||||
},
|
||||
"messageCopied": "تم نسخ الرسالة",
|
||||
"messageEdit": {
|
||||
"placeholder": "يرجى إدخال محتوى الرسالة",
|
||||
"title": "تحرير الرسالة"
|
||||
},
|
||||
"newAgent": "مساعد جديد",
|
||||
"newChat": "محادثة جديدة",
|
||||
"pin": "تثبيت",
|
||||
"pinOff": "إلغاء التثبيت",
|
||||
"placeholder": "أدخل رسالتك...",
|
||||
"reasoning": {
|
||||
"thinking": "جارٍ التفكير بعمق...",
|
||||
"thought": "تم التفكير بعمق (استغرق {{duration}} ثانية)",
|
||||
"thoughtWithoutDuration": "تم التفكير بعمق"
|
||||
},
|
||||
"regenerateFailed": "فشل في إعادة التوليد، يرجى المحاولة لاحقًا",
|
||||
"send": "إرسال",
|
||||
"session": {
|
||||
"createFirst": "أنشئ أول جلسة دردشة لك",
|
||||
"empty": "لا توجد جلسات حالياً",
|
||||
"search": {
|
||||
"discoverAssistants": "مساعدو السوق",
|
||||
"emptyResult": "لم يتم العثور على مساعد مطابق",
|
||||
"myAssistants": "مساعديّ",
|
||||
"placeholder": "ابحث عن المساعد الذي تفضله...",
|
||||
"recentSearches": "عمليات البحث الأخيرة",
|
||||
"title": "بحث"
|
||||
},
|
||||
"title": "دردشة عشوائية"
|
||||
},
|
||||
"sessionGroup": {
|
||||
"config": "إدارة المجموعات",
|
||||
"confirmRemoveGroupAlert": "سيتم حذف هذه المجموعة، وبعد الحذف سيتم نقل المساعدين ضمنها إلى القائمة الافتراضية. يرجى تأكيد الإجراء.",
|
||||
"createGroup": "إنشاء مجموعة",
|
||||
"createSuccess": "تم إنشاء المجموعة بنجاح",
|
||||
"emptyGroup": "لا توجد مجموعات حالياً",
|
||||
"inputPlaceholder": "يرجى إدخال اسم المجموعة",
|
||||
"moveGroup": "نقل إلى مجموعة",
|
||||
"moveSuccess": "تم النقل بنجاح",
|
||||
"newGroup": "مجموعة جديدة",
|
||||
"removeSuccess": "تم الحذف بنجاح",
|
||||
"rename": "إعادة التسمية",
|
||||
"renameSuccess": "تمت إعادة التسمية بنجاح",
|
||||
"tooLong": "يجب أن يتراوح طول اسم المجموعة بين 1 و20 حرفًا"
|
||||
},
|
||||
"setting": {
|
||||
"avatar": "الصورة الرمزية",
|
||||
"description": "الوصف",
|
||||
"done": "تم",
|
||||
"name": "الاسم",
|
||||
"title": "إعدادات المحادثة"
|
||||
},
|
||||
"share": "مشاركة",
|
||||
"stop": "إيقاف",
|
||||
"thinking": "جارٍ التفكير..."
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"actions": {
|
||||
"add": "إضافة",
|
||||
"cancel": "إلغاء",
|
||||
"clear": "مسح",
|
||||
"confirm": "تأكيد",
|
||||
"continue": "متابعة",
|
||||
"copy": "نسخ",
|
||||
"delete": "حذف",
|
||||
"edit": "تعديل",
|
||||
"more": "المزيد",
|
||||
"notNow": "ليس الآن",
|
||||
"regenerate": "إعادة التوليد",
|
||||
"retry": "إعادة المحاولة",
|
||||
"save": "حفظ",
|
||||
"saveImage": "حفظ الصورة"
|
||||
},
|
||||
"and": "و",
|
||||
"assistant": {
|
||||
"fetchError": "فشل في جلب قائمة المساعدين، يرجى المحاولة لاحقًا",
|
||||
"noData": "لا توجد بيانات للمساعد",
|
||||
"noMatch": "لم يتم العثور على مساعد مطابق",
|
||||
"recentSearches": "عمليات البحث الأخيرة",
|
||||
"search": "ابحث عن مساعد...",
|
||||
"searchNoResult": "لم يتم العثور على مساعد مطابق",
|
||||
"searchPlaceholder": "يرجى إدخال كلمات البحث"
|
||||
},
|
||||
"defaultSession": "مساعد مخصص",
|
||||
"image": {
|
||||
"permissionDenied": "يتطلب إذن الوصول إلى الألبوم لحفظ الصورة",
|
||||
"permissionRequest": "يرجى السماح بالوصول إلى الألبوم من الإعدادات",
|
||||
"saveFailed": "فشل الحفظ، يرجى المحاولة مرة أخرى",
|
||||
"saveSuccess": "تم حفظ الصورة في الألبوم"
|
||||
},
|
||||
"navigation": {
|
||||
"goToHomeScreen": "العودة إلى الصفحة الرئيسية"
|
||||
},
|
||||
"or": "أو",
|
||||
"search": {
|
||||
"placeholder": "بحث"
|
||||
},
|
||||
"status": {
|
||||
"error": "خطأ",
|
||||
"info": "معلومات",
|
||||
"loading": "جارٍ التحميل...",
|
||||
"networkRetryTip": "يرجى التحقق من اتصال الشبكة أو المحاولة مرة أخرى",
|
||||
"success": "نجاح",
|
||||
"warning": "تحذير"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"Highlighter": {
|
||||
"cancel": "إلغاء",
|
||||
"selectLanguage": "اختر اللغة"
|
||||
},
|
||||
"ModelSwitchPanel": {
|
||||
"chooseModel": "اختر النموذج",
|
||||
"emptyModel": "لا توجد نماذج مفعلة، يرجى التوجه إلى الإعدادات للتفعيل",
|
||||
"emptyProvider": "لا توجد مزودين مفعّلين، يرجى التوجه إلى الإعدادات للتفعيل",
|
||||
"goToSettings": "اذهب إلى الإعدادات",
|
||||
"provider": "مزود الخدمة",
|
||||
"title": "النموذج"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"assistant": {
|
||||
"detail": {
|
||||
"addAndChat": "إضافة المساعد والدردشة",
|
||||
"addFailed": "فشل في إضافة المساعد",
|
||||
"addFailedMessage": "فشل في إضافة المساعد، يرجى المحاولة مرة أخرى لاحقًا",
|
||||
"assistantSettings": "إعدادات المساعد",
|
||||
"loadFailed": "فشل في الحصول على تفاصيل المساعد، يرجى المحاولة مرة أخرى لاحقًا",
|
||||
"notFoundIdentifier": "لم يتم العثور على معرف المساعد",
|
||||
"share": "مشاركة",
|
||||
"shareFailed": "فشل في المشاركة",
|
||||
"title": "تفاصيل المساعد"
|
||||
}
|
||||
},
|
||||
"category": {
|
||||
"assistant": {
|
||||
"academic": "أكاديمي",
|
||||
"all": "الكل",
|
||||
"career": "المهنة",
|
||||
"copywriting": "كتابة الإعلانات",
|
||||
"design": "تصميم",
|
||||
"education": "تعليم",
|
||||
"emotions": "العواطف",
|
||||
"entertainment": "ترفيه",
|
||||
"games": "ألعاب",
|
||||
"general": "عام",
|
||||
"life": "الحياة",
|
||||
"marketing": "تسويق",
|
||||
"office": "مكتب",
|
||||
"programming": "برمجة",
|
||||
"translation": "ترجمة"
|
||||
}
|
||||
},
|
||||
"title": "اكتشف"
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"error": {
|
||||
"title": "حدث خطأ"
|
||||
},
|
||||
"http": {
|
||||
"forbidden": "ممنوع الوصول",
|
||||
"networkError": "خطأ في الشبكة",
|
||||
"notFound": "غير موجود",
|
||||
"serverError": "خطأ في الخادم",
|
||||
"timeout": "انتهت مهلة الطلب",
|
||||
"unauthorized": "غير مصرح"
|
||||
},
|
||||
"login": {
|
||||
"accessDenied": "عذرًا، تم رفض طلب تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"cancelled": "لقد ألغيت تسجيل الدخول",
|
||||
"invalidGrant": "عذرًا، انتهت صلاحية جلسة تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"invalidIdToken": "عذرًا، لا يمكن الحصول على معلومات حسابك في الوقت الحالي، يرجى المحاولة لاحقًا",
|
||||
"invalidRequest": "عذرًا، هناك مشكلة في طلب تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"invalidState": "عذرًا، فشل التحقق من تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"missingCodeOrState": "عذرًا، معلومات تسجيل الدخول المطلوبة مفقودة، يرجى المحاولة لاحقًا",
|
||||
"missingPkce": "عذرًا، معلومات التحقق من تسجيل الدخول مفقودة، يرجى المحاولة لاحقًا",
|
||||
"networkError": "عذرًا، حدث خلل في الشبكة أثناء تسجيل الدخول، يرجى التحقق من الاتصال والمحاولة مجددًا",
|
||||
"noIdToken": "عذرًا، لم يتم الحصول على معلومات تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"serverError": "عذرًا، حدث خطأ في خدمة تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"temporarilyUnavailable": "عذرًا، خدمة تسجيل الدخول غير متوفرة مؤقتًا، يرجى المحاولة لاحقًا",
|
||||
"tokenEndpointNonJson": "عذرًا، استجابت خدمة تسجيل الدخول غير متوقعة، يرجى المحاولة لاحقًا",
|
||||
"tokenExchangeFailed": "عذرًا، حدث خطأ أثناء معالجة تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"unknown": "عذرًا، فشل تسجيل الدخول، يرجى المحاولة لاحقًا",
|
||||
"unsupportedResponseType": "عذرًا، طريقة تسجيل الدخول الحالية غير مدعومة، يرجى المحاولة لاحقًا"
|
||||
},
|
||||
"page": {
|
||||
"notFoundMessage": "هذه الصفحة غير موجودة.",
|
||||
"notFoundTitle": "آه!"
|
||||
},
|
||||
"response": {
|
||||
"400": "عذرًا، الخادم لا يفهم طلبك، يرجى التأكد من صحة معلمات الطلب",
|
||||
"401": "عذرًا، رفض الخادم طلبك، قد يكون بسبب عدم كفاية الصلاحيات أو عدم تقديم مصادقة صحيحة",
|
||||
"403": "عذرًا، رفض الخادم طلبك، ليس لديك صلاحية الوصول إلى هذا المحتوى",
|
||||
"404": "عذرًا، لم يعثر الخادم على الصفحة أو المورد المطلوب، يرجى التأكد من صحة عنوان URL",
|
||||
"405": "عذرًا، طريقة الطلب المستخدمة غير مدعومة من الخادم، يرجى التأكد من صحة طريقة الطلب",
|
||||
"406": "عذرًا، الخادم لا يستطيع تلبية خصائص المحتوى المطلوبة في طلبك",
|
||||
"407": "عذرًا، يجب عليك إجراء مصادقة الوكيل قبل متابعة هذا الطلب",
|
||||
"408": "عذرًا، انتهت مهلة انتظار الخادم للطلب، يرجى التحقق من اتصال الشبكة والمحاولة مجددًا",
|
||||
"409": "عذرًا، يوجد تعارض في الطلب ولا يمكن معالجته، قد يكون بسبب حالة المورد غير متوافقة مع الطلب",
|
||||
"410": "عذرًا، المورد الذي طلبته تم إزالته نهائيًا ولا يمكن العثور عليه",
|
||||
"411": "عذرًا، الخادم لا يمكنه معالجة طلب بدون طول محتوى صالح",
|
||||
"412": "عذرًا، لم تستوف شروط الخادم لإكمال الطلب",
|
||||
"413": "عذرًا، حجم بيانات الطلب كبير جدًا ولا يمكن معالجته",
|
||||
"414": "عذرًا، عنوان URI في الطلب طويل جدًا ولا يمكن معالجته",
|
||||
"415": "عذرًا، الخادم لا يدعم تنسيق الوسائط المرفق في الطلب",
|
||||
"416": "عذرًا، الخادم لا يمكنه تلبية نطاق الطلب",
|
||||
"417": "عذرًا، الخادم لا يمكنه تلبية توقعاتك",
|
||||
"422": "عذرًا، تنسيق طلبك صحيح لكن يحتوي على أخطاء دلالية، لا يمكن الاستجابة له",
|
||||
"423": "عذرًا، المورد الذي طلبته مقفل",
|
||||
"424": "عذرًا، فشل الطلب السابق أدى إلى عدم إمكانية إكمال الطلب الحالي",
|
||||
"426": "عذرًا، الخادم يطلب ترقية العميل إلى إصدار بروتوكول أعلى",
|
||||
"428": "عذرًا، الخادم يطلب شروطًا مسبقة، يرجى تضمين رؤوس شروط صحيحة في الطلب",
|
||||
"429": "عذرًا، طلباتك كثيرة جدًا، الخادم متعب قليلاً، يرجى المحاولة لاحقًا",
|
||||
"431": "عذرًا، رؤوس الطلب كبيرة جدًا، الخادم لا يمكنه معالجتها",
|
||||
"451": "عذرًا، لأسباب قانونية، رفض الخادم توفير هذا المورد",
|
||||
"499": "عذرًا، تم قطع طلبك بشكل غير متوقع أثناء المعالجة، قد يكون بسبب إلغاء العملية أو اتصال شبكة غير مستقر. يرجى التحقق من الشبكة والمحاولة مجددًا.",
|
||||
"500": "عذرًا، يبدو أن الخادم يواجه بعض الصعوبات ولا يمكن إكمال طلبك مؤقتًا، يرجى المحاولة لاحقًا",
|
||||
"501": "عذرًا، الخادم لا يعرف كيفية معالجة هذا الطلب بعد، يرجى التأكد من صحة العملية",
|
||||
"502": "عذرًا، يبدو أن الخادم فقد الاتجاه، لا يمكن تقديم الخدمة مؤقتًا، يرجى المحاولة لاحقًا",
|
||||
"503": "عذرًا، الخادم غير قادر حاليًا على معالجة طلبك، قد يكون بسبب التحميل الزائد أو الصيانة، يرجى المحاولة لاحقًا",
|
||||
"504": "عذرًا، لم يتلق الخادم ردًا من الخادم الأعلى، يرجى المحاولة لاحقًا",
|
||||
"505": "عذرًا، الخادم لا يدعم إصدار HTTP المستخدم، يرجى التحديث والمحاولة مجددًا",
|
||||
"506": "عذرًا، هناك مشكلة في تكوين الخادم، يرجى الاتصال بالمسؤول",
|
||||
"507": "عذرًا، مساحة التخزين في الخادم غير كافية لمعالجة طلبك، يرجى المحاولة لاحقًا",
|
||||
"509": "عذرًا، تم استنفاد عرض النطاق الترددي للخادم، يرجى المحاولة لاحقًا",
|
||||
"510": "عذرًا، الخادم لا يدعم الوظائف الموسعة المطلوبة، يرجى الاتصال بالمسؤول",
|
||||
"520": "عذرًا، واجه الخادم مشكلة غير متوقعة أدت إلى عدم إكمال طلبك. يرجى المحاولة لاحقًا، نحن نعمل على حل المشكلة.",
|
||||
"522": "عذرًا، انتهت مهلة اتصال الخادم، لم يتم الرد على طلبك في الوقت المناسب. قد يكون السبب عدم استقرار الشبكة أو عدم توفر الخادم مؤقتًا. يرجى المحاولة لاحقًا، نحن نعمل على استعادة الخدمة.",
|
||||
"524": "عذرًا، انتهت مهلة انتظار الخادم للرد، قد يكون السبب بطء الاستجابة، يرجى المحاولة لاحقًا",
|
||||
"AgentRuntimeError": "حدث خطأ في تنفيذ Lobe AI Runtime، يرجى التحقق من المعلومات أدناه أو المحاولة مجددًا",
|
||||
"ConnectionCheckFailed": "الطلب عاد فارغًا، يرجى التحقق من أن عنوان وكيل API لا ينتهي بـ `/v1`",
|
||||
"CreateMessageError": "عذرًا، لم يتم إرسال الرسالة بنجاح، يرجى نسخ المحتوى وإعادة الإرسال، بعد تحديث الصفحة لن يتم الاحتفاظ بهذه الرسالة",
|
||||
"ExceededContextWindow": "محتوى الطلب الحالي يتجاوز الحد الأقصى الذي يمكن للنموذج معالجته، يرجى تقليل المحتوى والمحاولة مجددًا",
|
||||
"FreePlanLimit": "أنت مستخدم مجاني حاليًا، لا يمكنك استخدام هذه الميزة، يرجى الترقية إلى خطة مدفوعة للاستمرار",
|
||||
"InsufficientQuota": "عذرًا، تم الوصول إلى حد الحصة (quota) للمفتاح، يرجى التحقق من رصيد الحساب أو زيادة الحصة ثم المحاولة مجددًا",
|
||||
"InvalidAccessCode": "كلمة المرور غير صحيحة أو فارغة، يرجى إدخال كلمة مرور صحيحة أو إضافة مفتاح API مخصص",
|
||||
"InvalidBedrockCredentials": "فشل التحقق من Bedrock، يرجى التحقق من AccessKeyId/SecretAccessKey والمحاولة مجددًا",
|
||||
"InvalidClerkUser": "عذرًا، لم تقم بتسجيل الدخول بعد، يرجى تسجيل الدخول أو إنشاء حساب للمتابعة",
|
||||
"InvalidGithubToken": "رمز Github PAT غير صحيح أو فارغ، يرجى التحقق والمحاولة مجددًا",
|
||||
"InvalidOllamaArgs": "تكوين Ollama غير صحيح، يرجى التحقق والمحاولة مجددًا",
|
||||
"InvalidProviderAPIKey": "مفتاح API الخاص بـ {{provider}} غير صحيح أو فارغ، يرجى التحقق والمحاولة مجددًا",
|
||||
"InvalidVertexCredentials": "فشل التحقق من Vertex، يرجى التحقق من بيانات الاعتماد والمحاولة مجددًا",
|
||||
"LocationNotSupportError": "عذرًا، منطقتك غير مدعومة لهذه الخدمة النموذجية، قد يكون بسبب قيود المنطقة أو عدم تفعيل الخدمة. يرجى التأكد من دعم منطقتك أو المحاولة في منطقة أخرى",
|
||||
"ModelNotFound": "عذرًا، لا يمكن الوصول إلى النموذج المطلوب، قد يكون النموذج غير موجود أو ليس لديك صلاحية الوصول، يرجى تغيير مفتاح API أو تعديل الصلاحيات والمحاولة مجددًا",
|
||||
"NoOpenAIAPIKey": "مفتاح OpenAI API غير صحيح أو فارغ، يرجى إضافة مفتاح OpenAI API مخصص",
|
||||
"OllamaBizError": "حدث خطأ في طلب خدمة Ollama، يرجى التحقق من المعلومات أدناه أو المحاولة مجددًا",
|
||||
"OllamaServiceUnavailable": "فشل الاتصال بخدمة Ollama، يرجى التحقق من تشغيل Ollama بشكل صحيح أو إعدادات التهيئة عبر النطاق (CORS)",
|
||||
"PermissionDenied": "عذرًا، ليس لديك صلاحية الوصول إلى هذه الخدمة، يرجى التحقق من صلاحيات مفتاحك",
|
||||
"PluginApiNotFound": "عذرًا، API غير موجود في ملف وصف الإضافة، يرجى التحقق من تطابق طريقة الطلب مع API في ملف الوصف",
|
||||
"PluginApiParamsError": "عذرًا، فشل التحقق من معلمات طلب الإضافة، يرجى التحقق من المعلمات ومطابقتها مع وصف API",
|
||||
"PluginFailToTransformArguments": "عذرًا، فشل تحليل معلمات استدعاء الإضافة، يرجى محاولة إعادة إنشاء رسالة المساعد أو استخدام نموذج AI بقدرات Tools Calling أقوى والمحاولة مجددًا",
|
||||
"PluginGatewayError": "عذرًا، حدث خطأ في بوابة الإضافة، يرجى التحقق من إعدادات البوابة",
|
||||
"PluginManifestInvalid": "عذرًا، فشل التحقق من ملف وصف الإضافة، يرجى التأكد من تنسيق الملف",
|
||||
"PluginManifestNotFound": "عذرًا، لم يعثر الخادم على ملف وصف الإضافة (manifest.json)، يرجى التحقق من صحة عنوان الملف",
|
||||
"PluginMarketIndexInvalid": "عذرًا، فشل التحقق من فهرس الإضافة، يرجى التحقق من تنسيق الملف",
|
||||
"PluginMarketIndexNotFound": "عذرًا، لم يعثر الخادم على فهرس الإضافة، يرجى التحقق من صحة العنوان",
|
||||
"PluginMetaInvalid": "عذرًا، فشل التحقق من بيانات تعريف الإضافة، يرجى التحقق من تنسيق البيانات",
|
||||
"PluginMetaNotFound": "عذرًا، لم يتم العثور على الإضافة في الفهرس، يرجى التحقق من معلومات التكوين في الفهرس",
|
||||
"PluginOpenApiInitError": "عذرًا، فشل تهيئة عميل OpenAPI، يرجى التحقق من إعدادات OpenAPI",
|
||||
"PluginServerError": "حدث خطأ في استجابة خادم الإضافة، يرجى التحقق من ملف وصف الإضافة، التكوين أو تنفيذ الخادم بناءً على رسالة الخطأ أدناه",
|
||||
"PluginSettingsInvalid": "تتطلب هذه الإضافة تكوينًا صحيحًا قبل الاستخدام، يرجى التحقق من إعداداتك",
|
||||
"ProviderBizError": "حدث خطأ في طلب خدمة {{provider}}، يرجى التحقق من المعلومات أدناه أو المحاولة مجددًا",
|
||||
"QuotaLimitReached": "عذرًا، تم الوصول إلى حد استخدام الرموز أو عدد الطلبات لمفتاحك، يرجى زيادة الحصة أو المحاولة لاحقًا",
|
||||
"StreamChunkError": "خطأ في تحليل جزء من رسالة الطلب المتدفق، يرجى التحقق من توافق واجهة API أو الاتصال بمزود الخدمة",
|
||||
"SubscriptionKeyMismatch": "عذرًا، بسبب خلل نظامي مؤقت، تم تعطيل اشتراكك مؤقتًا، يرجى الضغط على الزر أدناه لاستعادة الاشتراك أو الاتصال بنا عبر البريد الإلكتروني للدعم",
|
||||
"SubscriptionPlanLimit": "لقد استنفدت نقاط اشتراكك، لا يمكنك استخدام هذه الميزة، يرجى الترقية إلى خطة أعلى أو تكوين API لنموذج مخصص للاستمرار",
|
||||
"SystemTimeNotMatchError": "عذرًا، وقت نظامك لا يتطابق مع الخادم، يرجى التحقق من وقت النظام والمحاولة مجددًا",
|
||||
"UnknownChatFetchError": "عذرًا، حدث خطأ غير معروف في الطلب، يرجى التحقق من المعلومات أدناه أو المحاولة مجددًا"
|
||||
},
|
||||
"sessionExpired": {
|
||||
"desc": "لحماية أمان حسابك، يرجى تسجيل الدخول مجددًا",
|
||||
"login": "تسجيل الدخول الآن",
|
||||
"title": "انتهت صلاحية الجلسة"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"ai21": {
|
||||
"description": "تقوم AI21 Labs ببناء نماذج أساسية وأنظمة ذكاء اصطناعي للشركات، لتسريع تطبيق الذكاء الاصطناعي التوليدي في الإنتاج."
|
||||
},
|
||||
"ai302": {
|
||||
"description": "302.AI هو منصة تطبيقات ذكاء اصطناعي بنظام الدفع حسب الاستخدام، توفر أكثر واجهات برمجة التطبيقات (API) وتطبيقات الذكاء الاصطناعي شمولاً في السوق."
|
||||
},
|
||||
"ai360": {
|
||||
"description": "360 AI هي منصة نماذج وخدمات الذكاء الاصطناعي التي أطلقتها شركة 360، تقدم مجموعة متنوعة من نماذج معالجة اللغة الطبيعية المتقدمة، بما في ذلك 360GPT2 Pro، 360GPT Pro، 360GPT Turbo و360GPT Turbo Responsibility 8K. تجمع هذه النماذج بين معلمات ضخمة وقدرات متعددة الوسائط، وتُستخدم على نطاق واسع في توليد النصوص، فهم الدلالات، أنظمة الحوار وتوليد الأكواد. من خلال استراتيجيات تسعير مرنة، تلبي 360 AI احتياجات المستخدمين المتنوعة، وتدعم دمج المطورين، وتعزز الابتكار والتطوير في التطبيقات الذكية."
|
||||
},
|
||||
"aihubmix": {
|
||||
"description": "يوفر AiHubMix الوصول إلى مجموعة متنوعة من نماذج الذكاء الاصطناعي من خلال واجهة برمجة تطبيقات موحدة."
|
||||
},
|
||||
"anthropic": {
|
||||
"description": "Anthropic هي شركة متخصصة في أبحاث وتطوير الذكاء الاصطناعي، تقدم مجموعة من نماذج اللغة المتقدمة مثل Claude 3.5 Sonnet، Claude 3 Sonnet، Claude 3 Opus وClaude 3 Haiku. تحقق هذه النماذج توازناً مثالياً بين الذكاء والسرعة والتكلفة، وتناسب مجموعة واسعة من سيناريوهات الاستخدام من أعباء العمل على مستوى المؤسسات إلى الاستجابات السريعة. يُعد Claude 3.5 Sonnet أحدث نماذجها، ويتميز بأداء ممتاز في العديد من التقييمات مع الحفاظ على تكلفة فعالة."
|
||||
},
|
||||
"azure": {
|
||||
"description": "توفر Azure مجموعة من نماذج الذكاء الاصطناعي المتقدمة، بما في ذلك GPT-3.5 وسلسلة GPT-4 الأحدث، تدعم أنواع بيانات متعددة ومهام معقدة، وتركز على حلول ذكاء اصطناعي آمنة وموثوقة ومستدامة."
|
||||
},
|
||||
"azureai": {
|
||||
"description": "توفر Azure مجموعة من نماذج الذكاء الاصطناعي المتقدمة، بما في ذلك GPT-3.5 وسلسلة GPT-4 الأحدث، تدعم أنواع بيانات متعددة ومهام معقدة، وتركز على حلول ذكاء اصطناعي آمنة وموثوقة ومستدامة."
|
||||
},
|
||||
"baichuan": {
|
||||
"description": "تعد Baichuan Intelligent شركة متخصصة في تطوير نماذج الذكاء الاصطناعي الكبيرة، حيث تتفوق نماذجها في مهام اللغة الصينية مثل المعرفة الموسوعية، معالجة النصوص الطويلة، والإبداع التوليدي، متجاوزة النماذج العالمية الرائدة. كما تتميز بقدرات متعددة الوسائط رائدة في الصناعة، مع أداء ممتاز في العديد من التقييمات الموثوقة. تشمل نماذجها Baichuan 4، Baichuan 3 Turbo وBaichuan 3 Turbo 128k، والتي تم تحسينها لمختلف سيناريوهات الاستخدام، مقدمة حلولاً ذات تكلفة فعالة."
|
||||
},
|
||||
"bedrock": {
|
||||
"description": "Bedrock هي خدمة تقدمها أمازون AWS تركز على توفير نماذج لغة ورؤية متقدمة للشركات. تشمل عائلة نماذجها سلسلة Claude من Anthropic، وسلسلة Llama 3.1 من Meta، مع خيارات تتراوح من خفيفة إلى عالية الأداء، تدعم مهام توليد النصوص، الحوار، ومعالجة الصور، مناسبة لتطبيقات الشركات بمختلف الأحجام والاحتياجات."
|
||||
},
|
||||
"cloudflare": {
|
||||
"description": "تشغيل نماذج التعلم الآلي المدعومة بوحدات معالجة الرسومات بدون خادم على شبكة Cloudflare العالمية."
|
||||
},
|
||||
"cohere": {
|
||||
"description": "تقدم Cohere أحدث نماذج متعددة اللغات، ووظائف استرجاع متقدمة، ومساحات عمل ذكاء اصطناعي مصممة خصيصاً للشركات الحديثة — كل ذلك مدمج في منصة آمنة."
|
||||
},
|
||||
"deepseek": {
|
||||
"description": "DeepSeek هي شركة متخصصة في أبحاث وتطبيقات الذكاء الاصطناعي، حيث يتفوق نموذجها الأحدث DeepSeek-V3 في العديد من التقييمات على نماذج مفتوحة المصدر مثل Qwen2.5-72B وLlama-3.1-405B، ويقارب أداء نماذج مغلقة رائدة مثل GPT-4o وClaude-3.5-Sonnet."
|
||||
},
|
||||
"fal": {
|
||||
"description": "منصة وسائط توليدية موجهة للمطورين."
|
||||
},
|
||||
"fireworksai": {
|
||||
"description": "Fireworks AI هي شركة رائدة في خدمات نماذج اللغة المتقدمة، تركز على استدعاء الوظائف والمعالجة متعددة الوسائط. يعتمد نموذجها الأحدث Firefunction V2 على Llama-3، ومحسن لاستدعاء الوظائف، الحوار، وتتبع التعليمات. يدعم نموذج اللغة البصرية FireLLaVA-13B إدخال الصور والنصوص معاً. تشمل النماذج البارزة الأخرى سلسلة Llama وسلسلة Mixtral، مقدمة دعماً فعالاً لتتبع التعليمات والتوليد متعدد اللغات."
|
||||
},
|
||||
"giteeai": {
|
||||
"description": "توفر Gitee AI واجهة برمجة تطبيقات Serverless لخدمات استدلال النماذج الكبيرة جاهزة للاستخدام لمطوري الذكاء الاصطناعي."
|
||||
},
|
||||
"github": {
|
||||
"description": "من خلال نماذج GitHub، يمكن للمطورين أن يصبحوا مهندسي ذكاء اصطناعي ويستخدموا نماذج الذكاء الاصطناعي الرائدة في الصناعة للبناء."
|
||||
},
|
||||
"google": {
|
||||
"description": "سلسلة Gemini من Google هي نماذج الذكاء الاصطناعي الأكثر تقدماً وشمولية، طورتها Google DeepMind، مصممة خصيصاً للوسائط المتعددة، تدعم الفهم والمعالجة السلسة للنصوص، الأكواد، الصور، الصوت والفيديو. مناسبة لمجموعة واسعة من البيئات من مراكز البيانات إلى الأجهزة المحمولة، مما يعزز كفاءة وانتشار نماذج الذكاء الاصطناعي."
|
||||
},
|
||||
"groq": {
|
||||
"description": "محرك الاستدلال LPU من Groq يحقق أداءً متميزاً في أحدث اختبارات نماذج اللغة الكبيرة المستقلة، معاد تعريف معايير حلول الذكاء الاصطناعي بسرعته وكفاءته المذهلة. يمثل Groq سرعة استدلال فورية ويظهر أداءً جيداً في النشر السحابي."
|
||||
},
|
||||
"higress": {
|
||||
"description": "Higress هو بوابة API سحابية أصلية، نشأت داخل علي بابا لحل مشاكل إعادة تحميل Tengine التي تؤثر على الأعمال ذات الاتصالات الطويلة، ونقص قدرات موازنة التحميل في gRPC/Dubbo."
|
||||
},
|
||||
"huggingface": {
|
||||
"description": "توفر واجهة برمجة تطبيقات HuggingFace Inference طريقة سريعة ومجانية لاستكشاف آلاف النماذج لمهام متنوعة. سواء كنت تصمم نموذجاً أولياً لتطبيق جديد أو تستكشف إمكانيات التعلم الآلي، تتيح لك هذه الواجهة الوصول الفوري إلى نماذج عالية الأداء في مجالات متعددة."
|
||||
},
|
||||
"hunyuan": {
|
||||
"description": "نموذج لغة كبير طورته Tencent يتميز بقدرات قوية في الإبداع باللغة الصينية، والتفكير المنطقي في سياقات معقدة، وقدرة موثوقة على تنفيذ المهام."
|
||||
},
|
||||
"infiniai": {
|
||||
"description": "تقدم خدمات نماذج كبيرة عالية الأداء، سهلة الاستخدام، وآمنة للمطورين، تغطي كامل دورة تطوير النماذج الكبيرة إلى نشرها كخدمات."
|
||||
},
|
||||
"internlm": {
|
||||
"description": "منظمة مفتوحة المصدر مكرسة لأبحاث النماذج الكبيرة وأدوات تطويرها. توفر منصة مفتوحة المصدر فعالة وسهلة الاستخدام لجميع مطوري الذكاء الاصطناعي، لتقريب أحدث تقنيات النماذج والخوارزميات."
|
||||
},
|
||||
"jina": {
|
||||
"description": "تأسست Jina AI في 2020، وهي شركة رائدة في مجال البحث بالذكاء الاصطناعي. تشمل منصتها الأساسية نماذج متجهة، معيد ترتيب ونماذج لغة صغيرة، تساعد الشركات على بناء تطبيقات بحث توليدية ومتعددة الوسائط موثوقة وعالية الجودة."
|
||||
},
|
||||
"lmstudio": {
|
||||
"description": "LM Studio هو تطبيق سطح مكتب لتطوير وتجربة نماذج اللغة الكبيرة على جهاز الكمبيوتر الخاص بك."
|
||||
},
|
||||
"minimax": {
|
||||
"description": "تأسست MiniMax في 2021 كشركة تكنولوجيا ذكاء اصطناعي عامة، تلتزم بالابتكار الذكي مع المستخدمين. طورت MiniMax نماذج عامة متعددة الوسائط، بما في ذلك نموذج نصي MoE بمليارات المعلمات، ونماذج صوت وصورة كبيرة، وأطلقت تطبيقات مثل Conch AI."
|
||||
},
|
||||
"mistral": {
|
||||
"description": "توفر Mistral نماذج متقدمة عامة، مهنية وبحثية، تُستخدم على نطاق واسع في الاستدلال المعقد، المهام متعددة اللغات، وتوليد الأكواد. من خلال واجهة استدعاء الوظائف، يمكن للمستخدمين دمج وظائف مخصصة لتلبية تطبيقات محددة."
|
||||
},
|
||||
"modelscope": {
|
||||
"description": "ModelScope هي منصة نموذج كخدمة أطلقتها Alibaba Cloud، تقدم مجموعة غنية من نماذج الذكاء الاصطناعي وخدمات الاستدلال."
|
||||
},
|
||||
"moonshot": {
|
||||
"description": "Moonshot هي منصة مفتوحة المصدر أطلقتها شركة Beijing Moon's Dark Side Technology Co., Ltd، تقدم نماذج متعددة لمعالجة اللغة الطبيعية، وتغطي مجالات واسعة مثل إنشاء المحتوى، البحث الأكاديمي، التوصية الذكية، التشخيص الطبي، وتدعم معالجة النصوص الطويلة والمهام التوليدية المعقدة."
|
||||
},
|
||||
"novita": {
|
||||
"description": "Novita AI هي منصة خدمات API تقدم نماذج لغة كبيرة وتوليد صور بالذكاء الاصطناعي، مرنة وموثوقة وفعالة من حيث التكلفة. تدعم أحدث النماذج المفتوحة مثل Llama3 وMistral، وتوفر حلول API شاملة، سهلة الاستخدام وقابلة للتوسع تلقائياً لتطوير تطبيقات الذكاء الاصطناعي التوليدية، مناسبة للنمو السريع لشركات الذكاء الاصطناعي الناشئة."
|
||||
},
|
||||
"nvidia": {
|
||||
"description": "توفر NVIDIA NIM™ حاويات لاستخدام خدمات استدلال معجلة بوحدات معالجة الرسومات ذاتية الاستضافة، تدعم نشر نماذج الذكاء الاصطناعي المدربة مسبقاً والمخصصة على السحابة، مراكز البيانات، أجهزة الكمبيوتر الشخصية ومحطات العمل RTX™ AI."
|
||||
},
|
||||
"ollama": {
|
||||
"description": "تغطي نماذج Ollama مجالات توليد الأكواد، العمليات الحسابية، معالجة اللغات المتعددة والتفاعل الحواري، وتدعم احتياجات النشر المؤسسي والمحلي المتنوعة."
|
||||
},
|
||||
"openai": {
|
||||
"description": "OpenAI هي مؤسسة رائدة عالمياً في أبحاث الذكاء الاصطناعي، حيث دفعت نماذجها مثل سلسلة GPT حدود معالجة اللغة الطبيعية. تلتزم OpenAI بتغيير الصناعات من خلال حلول ذكاء اصطناعي مبتكرة وفعالة. تتميز منتجاتها بأداء عالي وتكلفة اقتصادية، وتستخدم على نطاق واسع في البحث، الأعمال والتطبيقات الابتكارية."
|
||||
},
|
||||
"openrouter": {
|
||||
"description": "OpenRouter هو منصة خدمات توفر واجهات لنماذج كبيرة متقدمة متعددة، تدعم OpenAI، Anthropic، LLaMA والمزيد، مناسبة لمتطلبات التطوير والتطبيق المتنوعة. يمكن للمستخدمين اختيار النماذج والأسعار المثلى حسب احتياجاتهم، لتعزيز تجربة الذكاء الاصطناعي."
|
||||
},
|
||||
"perplexity": {
|
||||
"description": "Perplexity هي مزود رائد لنماذج توليد الحوار، تقدم نماذج Llama 3.1 متقدمة، تدعم التطبيقات عبر الإنترنت وغير المتصلة، ومناسبة بشكل خاص لمهام معالجة اللغة الطبيعية المعقدة."
|
||||
},
|
||||
"ppio": {
|
||||
"description": "توفر PPIO خدمات API لنماذج مفتوحة المصدر مستقرة وذات تكلفة فعالة، تدعم سلسلة DeepSeek، Llama، Qwen وغيرها من النماذج الرائدة في الصناعة."
|
||||
},
|
||||
"qiniu": {
|
||||
"description": "تعتبر Qiniu مزود خدمة سحابة قديم يقدم خدمات استدلال ذكاء اصطناعي في الوقت الحقيقي والدفعي بتكلفة فعالة واستقرار وسهولة استخدام."
|
||||
},
|
||||
"qwen": {
|
||||
"description": "Tongyi Qianwen هو نموذج لغة ضخم طورته Alibaba Cloud، يتمتع بقدرات قوية في فهم وتوليد اللغة الطبيعية. يمكنه الإجابة على الأسئلة، إنشاء المحتوى، التعبير عن الآراء، وكتابة الأكواد، ويعمل في مجالات متعددة."
|
||||
},
|
||||
"sambanova": {
|
||||
"description": "تتيح SambaNova Cloud للمطورين استخدام أفضل النماذج المفتوحة المصدر بسهولة والاستمتاع بأسرع سرعات الاستدلال."
|
||||
},
|
||||
"search1api": {
|
||||
"description": "توفر Search1API وصولاً إلى نماذج سلسلة DeepSeek التي يمكن توصيلها بالشبكة حسب الحاجة، بما في ذلك النسخ القياسية والسريعة، مع دعم اختيار نماذج بأحجام معلمات مختلفة."
|
||||
},
|
||||
"sensenova": {
|
||||
"description": "Sensenova من SenseTime تقدم خدمات نماذج كبيرة متكاملة وعالية الكفاءة وسهلة الاستخدام، مدعومة بالبنية التحتية القوية لشركة SenseTime."
|
||||
},
|
||||
"siliconcloud": {
|
||||
"description": "SiliconCloud هي خدمة سحابية GenAI ذات تكلفة فعالة تعتمد على نماذج أساسية مفتوحة المصدر ممتازة."
|
||||
},
|
||||
"spark": {
|
||||
"description": "توفر نماذج Xinghuo الكبيرة من iFlytek قدرات ذكاء اصطناعي قوية متعددة المجالات ومتعددة اللغات، باستخدام تقنيات معالجة اللغة الطبيعية المتقدمة، لبناء تطبيقات مبتكرة في الأجهزة الذكية، الرعاية الصحية الذكية، التمويل الذكي وغيرها من المجالات الرأسية."
|
||||
},
|
||||
"stepfun": {
|
||||
"description": "نموذج Starry Large من StepFun يتميز بقدرات متعددة الوسائط واستدلال معقدة رائدة في الصناعة، يدعم فهم النصوص الطويلة ومحرك بحث ذاتي الجدولة قوي."
|
||||
},
|
||||
"taichu": {
|
||||
"description": "أطلقت معهد الأتمتة التابع للأكاديمية الصينية للعلوم ومعهد ووهان للذكاء الاصطناعي نموذجاً كبيراً متعدد الوسائط من الجيل الجديد، يدعم الأسئلة المتعددة الجولات، إنشاء النصوص، توليد الصور، الفهم ثلاثي الأبعاد، تحليل الإشارات وغيرها من المهام الشاملة، مع قدرات معرفية وفهم وإبداع أقوى، لتجربة تفاعلية جديدة."
|
||||
},
|
||||
"tencentcloud": {
|
||||
"description": "محرك المعرفة الذري (LLM Knowledge Engine Atomic Power) من Tencent Cloud يعتمد على محرك المعرفة لتوفير قدرة شاملة على الأسئلة والأجوبة المعرفية، موجه للشركات والمطورين، يتيح بناء وتطوير تطبيقات نموذجية مرنة. يمكنكم تجميع خدماتكم الخاصة باستخدام قدرات ذرية متعددة مثل تحليل المستندات، التقسيم، التضمين، إعادة الصياغة متعددة الجولات، لتخصيص أعمال الذكاء الاصطناعي الخاصة بالمؤسسات."
|
||||
},
|
||||
"togetherai": {
|
||||
"description": "تسعى Together AI لتحقيق أداء رائد من خلال نماذج ذكاء اصطناعي مبتكرة، وتوفر قدرات تخصيص واسعة، بما في ذلك دعم التوسع السريع وعملية نشر بديهية، لتلبية احتياجات الشركات المتنوعة."
|
||||
},
|
||||
"upstage": {
|
||||
"description": "تركز Upstage على تطوير نماذج ذكاء اصطناعي لمختلف الاحتياجات التجارية، بما في ذلك Solar LLM وDocument AI، بهدف تحقيق الذكاء الاصطناعي العام الاصطناعي (AGI). تتيح إنشاء وكلاء حوار بسيطين عبر Chat API، وتدعم استدعاء الوظائف، الترجمة، التضمين، والتطبيقات المتخصصة."
|
||||
},
|
||||
"v0": {
|
||||
"description": "v0 هو مساعد برمجة زوجي، يكفي أن تصف أفكارك بلغة طبيعية، ليولد لك الكود وواجهة المستخدم (UI) لمشروعك."
|
||||
},
|
||||
"vertexai": {
|
||||
"description": "سلسلة Gemini من Google هي نماذج الذكاء الاصطناعي الأكثر تقدماً وشمولية، طورتها Google DeepMind، مصممة خصيصاً للوسائط المتعددة، تدعم الفهم والمعالجة السلسة للنصوص، الأكواد، الصور، الصوت والفيديو. مناسبة لمجموعة واسعة من البيئات من مراكز البيانات إلى الأجهزة المحمولة، مما يعزز كفاءة وانتشار نماذج الذكاء الاصطناعي."
|
||||
},
|
||||
"vllm": {
|
||||
"description": "vLLM هي مكتبة سريعة وسهلة الاستخدام للاستدلال وخدمات نماذج اللغة الكبيرة."
|
||||
},
|
||||
"volcengine": {
|
||||
"description": "منصة تطوير خدمات النماذج الكبيرة التي أطلقتها ByteDance، تقدم خدمات استدعاء نماذج غنية الوظائف، آمنة وبأسعار تنافسية، مع توفير وظائف شاملة من بيانات النماذج، الضبط الدقيق، الاستدلال، التقييم، لضمان تطوير تطبيقات الذكاء الاصطناعي بنجاح."
|
||||
},
|
||||
"wenxin": {
|
||||
"description": "منصة تطوير وخدمات نماذج كبيرة وذكاء اصطناعي أصلية للمؤسسات، تقدم سلسلة أدوات شاملة وسهلة الاستخدام لتطوير نماذج الذكاء الاصطناعي التوليدية وتطوير التطبيقات."
|
||||
},
|
||||
"xai": {
|
||||
"description": "xAI هي شركة مكرسة لبناء ذكاء اصطناعي لتسريع الاكتشافات العلمية البشرية. مهمتنا هي دفع فهمنا المشترك للكون."
|
||||
},
|
||||
"xinference": {
|
||||
"description": "Xorbits Inference (Xinference) هي منصة مفتوحة المصدر لتبسيط تشغيل ودمج نماذج الذكاء الاصطناعي المتنوعة. مع Xinference، يمكنك تشغيل استدلال أي نموذج LLM مفتوح المصدر، نموذج تضمين، ونماذج متعددة الوسائط في بيئات سحابية أو محلية، وإنشاء تطبيقات ذكاء اصطناعي قوية."
|
||||
},
|
||||
"zeroone": {
|
||||
"description": "ZeroOne致力于推动以人为本的AI 2.0技术革命,旨在通过大语言模型创造巨大的经济和社会价值,并开创新的AI生态与商业模式。"
|
||||
},
|
||||
"zhipu": {
|
||||
"description": "توفر Zhipu AI منصة مفتوحة للنماذج متعددة الوسائط واللغوية، تدعم مجموعة واسعة من سيناريوهات تطبيقات الذكاء الاصطناعي، بما في ذلك معالجة النصوص، فهم الصور، والمساعدة في البرمجة."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
{
|
||||
"about": "حول LobeHub",
|
||||
"account": {
|
||||
"group": "الحساب",
|
||||
"profile": {
|
||||
"email": "البريد الإلكتروني",
|
||||
"name": "اسم المستخدم",
|
||||
"status": "حالة الحساب",
|
||||
"unverified": "غير مُحقق",
|
||||
"verified": "تم التحقق"
|
||||
},
|
||||
"signOut": {
|
||||
"confirm": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
|
||||
"label": "تسجيل الخروج"
|
||||
},
|
||||
"switchAccount": {
|
||||
"action": "تبديل الحساب",
|
||||
"confirm": "هل تريد بالتأكيد تبديل الحساب؟ سيؤدي ذلك إلى تسجيل الخروج من الحساب الحالي وتسجيل الدخول من جديد.",
|
||||
"error": "فشل تبديل الحساب، يرجى المحاولة مرة أخرى.",
|
||||
"label": "تبديل الحساب"
|
||||
},
|
||||
"title": "إعدادات الحساب"
|
||||
},
|
||||
"advanced": {
|
||||
"group": "متقدم"
|
||||
},
|
||||
"aiProviders": {
|
||||
"configuration": {
|
||||
"apiKey": {
|
||||
"description": "يرجى إدخال مفتاح API الخاص بـ {{name}}",
|
||||
"label": "مفتاح API",
|
||||
"placeholder": "يرجى إدخال مفتاح API الخاص بـ {{name}}"
|
||||
},
|
||||
"proxyUrl": {
|
||||
"desc": "يجب أن يبدأ بـ http(s)://",
|
||||
"invalid": "يرجى إدخال عنوان URL صالح يبدأ بـ http:// أو https://",
|
||||
"placeholder": "https://api.example.com/v1",
|
||||
"title": "عنوان وكيل API"
|
||||
},
|
||||
"saving": "جارٍ حفظ الإعدادات...",
|
||||
"title": "الإعدادات",
|
||||
"updateFailedDesc": "فشل الحفظ، يرجى المحاولة مرة أخرى",
|
||||
"updateFailedTitle": "فشل الحفظ"
|
||||
},
|
||||
"detail": {
|
||||
"loadFailed": "فشل تحميل إعدادات المزود",
|
||||
"loading": "جارٍ تحميل إعدادات المزود..."
|
||||
},
|
||||
"info": {
|
||||
"builtIn": "مزود مدمج",
|
||||
"custom": "مزود مخصص"
|
||||
},
|
||||
"list": {
|
||||
"disabled": "غير مفعل",
|
||||
"emptySearch": "لم يتم العثور على مزود مطابق",
|
||||
"enabled": "مفعل",
|
||||
"loadFailed": "فشل تحميل قائمة المزودين"
|
||||
},
|
||||
"models": {
|
||||
"allLoaded": "تم عرض جميع النماذج",
|
||||
"copySuccess": "تم النسخ بنجاح",
|
||||
"disableFailed": "فشل تعطيل النموذج",
|
||||
"emptyNoSearch": "لم يتم العثور على أي نموذج، حاول التحميل من الخادم",
|
||||
"emptyWithSearch": "لا توجد نماذج تطابق معايير البحث",
|
||||
"enableFailed": "فشل تفعيل النموذج",
|
||||
"fetch": "جلب النماذج",
|
||||
"fetchFailed": "فشل جلب النماذج، يرجى المحاولة مرة أخرى",
|
||||
"fetchSuccess": "تم جلب قائمة النماذج بنجاح!",
|
||||
"fetching": "جارٍ الجلب...",
|
||||
"loading": "جارٍ التحميل...",
|
||||
"loadingMore": "جارٍ تحميل المزيد...",
|
||||
"modelsAvailable": "عدد النماذج المتاحة: {{count}}",
|
||||
"searchPlaceholder": "ابحث عن نموذج...",
|
||||
"title": "النماذج"
|
||||
},
|
||||
"skeleton": {
|
||||
"disabled": "غير مفعل",
|
||||
"enabled": "مفعل"
|
||||
}
|
||||
},
|
||||
"cache": {
|
||||
"clear": {
|
||||
"confirm": {
|
||||
"action": "مسح الذاكرة المؤقتة",
|
||||
"description": "سيؤدي ذلك إلى إزالة البيانات المخزنة محليًا، وسيتعين إعادة تحميل المحتوى عند فتح التطبيق مرة أخرى.",
|
||||
"title": "هل تريد تأكيد مسح الذاكرة المؤقتة؟"
|
||||
},
|
||||
"failure": "فشل مسح الذاكرة المؤقتة",
|
||||
"success": "تم مسح الذاكرة المؤقتة"
|
||||
},
|
||||
"description": "تُستخدم الذاكرة المؤقتة لتسريع بدء التشغيل. يمكنك مسحها لتحرير المساحة.",
|
||||
"title": "مسح الذاكرة المؤقتة"
|
||||
},
|
||||
"changelog": "سجل التحديثات",
|
||||
"color": {
|
||||
"neutral": {
|
||||
"description": "اختر اللون المحايد للتطبيق",
|
||||
"title": "إعداد اللون المحايد"
|
||||
},
|
||||
"preview": "معاينة",
|
||||
"previewMessages": {
|
||||
"botGreat": "سعيد لأنك أحببت ذلك! تتيح لك هذه المعاينة رؤية تأثير السمة قبل تطبيقها.",
|
||||
"botHowToUse": "يمكنك استخدام أداة اختيار الألوان أدناه لتعديل اللون الأساسي والمحايد، وسيتم تحديث المعاينة في الوقت الفعلي.",
|
||||
"userGreat": "رائع!",
|
||||
"userHowToUse": "كيف أستخدم معاينة السمة؟"
|
||||
},
|
||||
"primary": {
|
||||
"description": "اختر اللون الأساسي للتطبيق",
|
||||
"title": "إعداد اللون الأساسي"
|
||||
},
|
||||
"title": "إعدادات الألوان"
|
||||
},
|
||||
"developer": {
|
||||
"auth": {
|
||||
"accessToken": {
|
||||
"expire": {
|
||||
"success": "تم إنهاء صلاحية رمز الوصول فورًا",
|
||||
"title": "انتهاء صلاحية رمز الوصول"
|
||||
},
|
||||
"invalidate": {
|
||||
"success": "تم إدخال رمز وصول غير صالح",
|
||||
"title": "رمز وصول غير صالح"
|
||||
}
|
||||
},
|
||||
"clearAuthData": {
|
||||
"success": "تم مسح بيانات المصادقة",
|
||||
"title": "مسح بيانات المصادقة"
|
||||
},
|
||||
"error": {
|
||||
"noToken": "لا يوجد رمز متاح حاليًا"
|
||||
},
|
||||
"group": "إعدادات المصادقة",
|
||||
"refreshToken": {
|
||||
"expire": {
|
||||
"success": "تم إنهاء صلاحية رمز التحديث فورًا",
|
||||
"title": "انتهاء صلاحية رمز التحديث"
|
||||
},
|
||||
"invalidate": {
|
||||
"success": "تم إدخال رمز تحديث غير صالح",
|
||||
"title": "رمز تحديث غير صالح"
|
||||
}
|
||||
}
|
||||
},
|
||||
"failurePrefix": "فشل العملية: ",
|
||||
"mode": {
|
||||
"already": "أنت بالفعل في وضع المطور",
|
||||
"enabled": "تم تفعيل وضع المطور",
|
||||
"remaining": "اضغط {{count}} مرة أخرى لتفعيل وضع المطور",
|
||||
"title": "وضع المطور"
|
||||
},
|
||||
"selfHostedEntry": {
|
||||
"confirmAction": "الانتقال إلى صفحة الإعدادات",
|
||||
"confirmDescription": "بعد التفعيل، سيتم فتح صفحة إعدادات الاستضافة الذاتية مباشرة. هل ترغب في تسجيل الخروج والانتقال؟",
|
||||
"confirmResetAction": "إعادة التعيين والانتقال إلى تسجيل الدخول",
|
||||
"confirmResetDescription": "سيؤدي إيقاف وضع الاستضافة الذاتية إلى إعادة تعيين عنوان الخادم إلى النسخة الرسمية وتسجيل الخروج. هل ترغب في المتابعة؟",
|
||||
"confirmResetTitle": "إيقاف وضع الاستضافة الذاتية",
|
||||
"confirmTitle": "تفعيل مدخل تسجيل الدخول للاستضافة الذاتية",
|
||||
"description": "التحكم في ما إذا كان زر الاستضافة الذاتية يظهر في صفحة تسجيل الدخول",
|
||||
"title": "تفعيل وضع الاستضافة الذاتية"
|
||||
},
|
||||
"server": {
|
||||
"confirmDescription": "سيؤدي تغيير عنوان الخادم إلى تسجيل الخروج وإعادة تسجيل الدخول. هل ترغب في المتابعة؟",
|
||||
"confirmTitle": "تأكيد تغيير الخادم",
|
||||
"current": "العنوان الحالي",
|
||||
"description": "بعد التكوين، سيتم استخدام هذا العنوان لجميع الطلبات. اتركه فارغًا للعودة إلى الخادم الرسمي.",
|
||||
"group": "إعدادات الخادم",
|
||||
"hint": "يجب أن يبدأ بـ http:// أو https://، قد يتطلب التطبيق تسجيل الدخول من جديد.",
|
||||
"invalid": "يرجى إدخال عنوان صالح يبدأ بـ http:// أو https://",
|
||||
"notice": "سيتم استبدال عنوان الواجهة الافتراضي بالخادم المخصص. تأكد من أن الخدمة متاحة ومتوافقة مع بروتوكول LobeChat API. قد تحتاج إلى إعادة تسجيل الدخول أو إعادة تشغيل التطبيق بعد التبديل.",
|
||||
"noticeTitle": "يرجى الملاحظة قبل التبديل",
|
||||
"placeholder": "https://your-server.example.com",
|
||||
"reset": "استعادة الإعدادات الافتراضية",
|
||||
"resetSuccess": "تمت استعادة عنوان الخادم الرسمي",
|
||||
"save": "حفظ",
|
||||
"title": "مثيل مستضاف ذاتيًا",
|
||||
"updated": "تم تحديث عنوان الخادم المخصص"
|
||||
},
|
||||
"title": "خيارات المطور"
|
||||
},
|
||||
"feedback": {
|
||||
"email": {
|
||||
"body": {
|
||||
"description": "وصف المشكلة:",
|
||||
"footer": "تم الإرسال من {{device}} الخاص بي",
|
||||
"frequency": "معدل التكرار:",
|
||||
"screenshots": "لقطات الشاشة ذات الصلة:",
|
||||
"template": "يرجى وصف المشكلة التي واجهتها بالتفصيل حتى نتمكن من مساعدتك بشكل أفضل."
|
||||
},
|
||||
"subject": "ملاحظات - LobeChat - {{version}}"
|
||||
},
|
||||
"error": "فشل في فتح تطبيق البريد، يرجى المحاولة مرة أخرى لاحقًا",
|
||||
"saved": "تم حفظ الملاحظات في المسودات",
|
||||
"sent": "تم إرسال البريد، شكرًا لملاحظاتك!",
|
||||
"title": "ملاحظات",
|
||||
"unavailable": "ميزة البريد غير متوفرة، يرجى التحقق مما إذا كان قد تم إعداد حساب بريد إلكتروني أو تم تفعيل وظيفة البريد على الجهاز"
|
||||
},
|
||||
"fontSize": {
|
||||
"preview": {
|
||||
"botAnswer": "**كيف يمكنني تعديل حجم الخط؟**\n\nاستخدم شريط التمرير أدناه لتغيير حجم الخط: إلى اليسار لتصغيره، وإلى اليمين لتكبيره. سيتم عرض المعاينة في الوقت الفعلي أثناء التعديل.\n\nنصيحة: اختر \"قياسي\" للعودة إلى الحجم الافتراضي بسرعة.",
|
||||
"botGreat": "سعيد لأنك أحببت ذلك! تتيح لك هذه المعاينة رؤية تأثير حجم الخط في المحادثة قبل تطبيقه.",
|
||||
"userGreat": "رائع!",
|
||||
"userQuestion": "أريد تكبير حجم خط المحادثة، كيف أفعل ذلك؟"
|
||||
},
|
||||
"standard": "قياسي",
|
||||
"text": "ملاحظة: هذا الإعداد يؤثر فقط على حجم خط محتوى الرسائل",
|
||||
"title": "حجم الخط"
|
||||
},
|
||||
"general": {
|
||||
"group": "عام"
|
||||
},
|
||||
"help": "مساعدة الاستخدام",
|
||||
"info": {
|
||||
"group": "معلومات"
|
||||
},
|
||||
"locale": {
|
||||
"auto": {
|
||||
"description": "اتبع إعدادات لغة النظام",
|
||||
"title": "اتبع النظام"
|
||||
},
|
||||
"title": "إعدادات اللغة"
|
||||
},
|
||||
"openai": "إعدادات OpenAI",
|
||||
"openaiSettings": {
|
||||
"apiKey": "مفتاح API",
|
||||
"apiKeyPlaceholder": "يرجى إدخال مفتاح OpenAI API الخاص بك",
|
||||
"checkApiKey": "يرجى التحقق من صحة مفتاح API",
|
||||
"checkProxyAddress": "تعذر الاتصال بالخادم، يرجى التحقق من عنوان الوكيل",
|
||||
"connectionSuccess": "تم الاتصال بنجاح، مفتاح API وعنوان الوكيل صحيحان",
|
||||
"connectivityHint": "بعد اختبار الاتصال، سيتم التحقق من صحة مفتاح API وعنوان الوكيل",
|
||||
"pleaseEnterApiKey": "يرجى إدخال مفتاح API",
|
||||
"proxyAddress": "عنوان وكيل API",
|
||||
"proxyPlaceholder": "يجب أن يحتوي على http(s)://",
|
||||
"testConnectivity": "اختبار الاتصال",
|
||||
"validationFailed": "فشل التحقق",
|
||||
"validationSuccess": "تم التحقق بنجاح"
|
||||
},
|
||||
"providerModels": {
|
||||
"config": {
|
||||
"aesGcm": "سيتم تشفير مفتاحك وعنوان الوكيل باستخدام خوارزمية <1>AES-GCM</1>",
|
||||
"checker": {
|
||||
"button": "اختبار الاتصال",
|
||||
"desc": "اختبر ما إذا كان مفتاح API وعنوان الوكيل قد تم إدخالهما بشكل صحيح",
|
||||
"pass": "تم التحقق بنجاح",
|
||||
"selectModel": "اختر نموذجًا لاختبار الاتصال",
|
||||
"title": "اختبار الاتصال"
|
||||
}
|
||||
}
|
||||
},
|
||||
"providers": "مزودو الذكاء الاصطناعي",
|
||||
"providersDetail": {
|
||||
"tabs": {
|
||||
"configuration": "الإعدادات",
|
||||
"models": "النماذج"
|
||||
}
|
||||
},
|
||||
"providersSearchPlaceholder": "ابحث عن مزود باستخدام الكلمات المفتاحية...",
|
||||
"support": "دعم عبر البريد الإلكتروني",
|
||||
"themeMode": {
|
||||
"auto": "اتبع النظام",
|
||||
"dark": "الوضع الداكن",
|
||||
"light": "الوضع الفاتح",
|
||||
"title": "وضع السمة"
|
||||
},
|
||||
"title": "الإعدادات",
|
||||
"update": {
|
||||
"check": {
|
||||
"applyAction": "إعادة التشغيل الآن",
|
||||
"applyDescription": "يجب إعادة تشغيل التطبيق لتطبيق التحديث الأخير. هل ترغب في إعادة التشغيل الآن؟",
|
||||
"applyError": "فشل تطبيق التحديث، يرجى المحاولة لاحقًا",
|
||||
"applyTitle": "تطبيق التحديث",
|
||||
"applying": "جارٍ إعادة التشغيل لتطبيق التحديث...",
|
||||
"checking": "جارٍ التحقق من وجود تحديثات...",
|
||||
"downloaded": "تم تنزيل حزمة التحديث",
|
||||
"downloading": "تم اكتشاف إصدار جديد، جارٍ تنزيل التحديث...",
|
||||
"error": "فشل التحقق من التحديث، يرجى المحاولة لاحقًا",
|
||||
"none": "أنت تستخدم أحدث إصدار حاليًا",
|
||||
"title": "التحقق من التحديثات",
|
||||
"unavailable": "البنية الحالية لا تدعم التحقق من التحديثات. يرجى استخدام النسخة الرسمية."
|
||||
}
|
||||
},
|
||||
"version": "الإصدار الحالي"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"localSystem": {
|
||||
"apiName": {
|
||||
"listLocalFiles": "عرض قائمة الملفات",
|
||||
"moveLocalFiles": "نقل الملفات",
|
||||
"readLocalFile": "قراءة محتوى الملف",
|
||||
"renameLocalFile": "إعادة تسمية",
|
||||
"searchLocalFiles": "البحث عن الملفات",
|
||||
"writeLocalFile": "كتابة الملف"
|
||||
},
|
||||
"title": "النظام المحلي"
|
||||
},
|
||||
"mobileNotSupported": "هذه الأداة غير مدعومة على الأجهزة المحمولة حاليًا، يُرجى استخدام جهاز سطح المكتب لعرض المحتوى الكامل",
|
||||
"search": {
|
||||
"apiName": {
|
||||
"crawlMultiPages": "قراءة محتوى عدة صفحات",
|
||||
"crawlSinglePage": "قراءة محتوى الصفحة",
|
||||
"search": "البحث في الصفحة"
|
||||
},
|
||||
"crawPages": {
|
||||
"crawling": "جارٍ الزحف...",
|
||||
"meta": {
|
||||
"crawler": "الزاحف",
|
||||
"words": "عدد الكلمات"
|
||||
}
|
||||
},
|
||||
"emptyResult": "لا توجد نتائج للبحث",
|
||||
"title": "بحث الويب"
|
||||
},
|
||||
"title": "استدعاء الأدوات",
|
||||
"unknown": "أداة غير معروفة"
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"actions": {
|
||||
"confirmRemoveAll": "سيتم حذف جميع المواضيع، ولا يمكن استعادتها بعد الحذف، يرجى توخي الحذر",
|
||||
"confirmRemoveUnstarred": "سيتم حذف المواضيع غير المضافة إلى المفضلة، ولا يمكن استعادتها بعد الحذف، يرجى توخي الحذر",
|
||||
"favorite": "إضافة إلى المفضلة",
|
||||
"removeAll": "حذف جميع المواضيع",
|
||||
"removeUnstarred": "حذف المواضيع غير المفضلة",
|
||||
"unfavorite": "إزالة من المفضلة"
|
||||
},
|
||||
"confirmRemoveTopicItemAlert": "سيتم حذف هذا الموضوع، ولن يكون بالإمكان استعادته بعد الحذف. يرجى تأكيد الإجراء.",
|
||||
"defaultTitle": "الموضوع الافتراضي",
|
||||
"empty": "لا توجد مواضيع",
|
||||
"favorite": "المفضلة",
|
||||
"groupTitle": {
|
||||
"byTime": {
|
||||
"favorite": "المفضلة",
|
||||
"month": "هذا الشهر",
|
||||
"today": "اليوم",
|
||||
"week": "هذا الأسبوع",
|
||||
"yesterday": "أمس"
|
||||
}
|
||||
},
|
||||
"guide": {
|
||||
"desc": "انقر على زر الإرسال على اليسار لحفظ المحادثة الحالية كموضوع محفوظ وبدء محادثة جديدة",
|
||||
"title": "قائمة المواضيع"
|
||||
},
|
||||
"loading": "جارٍ التحميل...",
|
||||
"newTopic": "موضوع جديد",
|
||||
"rename": {
|
||||
"action": "إعادة التسمية",
|
||||
"done": "تم",
|
||||
"emptyTitle": "لا يمكن أن يكون اسم الموضوع فارغًا",
|
||||
"error": "فشل في إعادة التسمية",
|
||||
"placeholder": "أدخل اسم الموضوع",
|
||||
"success": "تمت إعادة التسمية بنجاح",
|
||||
"title": "إعادة تسمية الموضوع",
|
||||
"tooLong": "اسم الموضوع طويل جدًا"
|
||||
},
|
||||
"search": {
|
||||
"emptyResult": "لم يتم العثور على مواضيع مطابقة",
|
||||
"placeholder": "ابحث عن موضوع...",
|
||||
"recentSearches": "عمليات البحث الأخيرة",
|
||||
"title": "البحث عن موضوع"
|
||||
},
|
||||
"searchPlaceholder": "ابحث عن موضوع...",
|
||||
"temp": "مؤقت",
|
||||
"title": "الموضوع"
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"guide": {
|
||||
"agents": {
|
||||
"replaceBtn": "تغيير المجموعة",
|
||||
"title": "توصيات مساعد جديدة:"
|
||||
},
|
||||
"defaultMessage": "أنا مساعدك الذكي الشخصي {{appName}}، كيف يمكنني مساعدتك الآن؟<br />إذا كنت بحاجة إلى مساعد أكثر تخصصًا أو مخصصًا، يمكنك النقر على <plus /> لإنشاء مساعد مخصص",
|
||||
"defaultMessageWithoutCreate": "أنا مساعدك الذكي الشخصي {{appName}}، كيف يمكنني مساعدتك الآن؟",
|
||||
"qa": {
|
||||
"q01": "ما هو LobeHub؟",
|
||||
"q02": "ما هو {{appName}}؟",
|
||||
"q03": "هل لدى {{appName}} دعم مجتمعي؟",
|
||||
"q04": "ما هي الميزات التي يدعمها {{appName}}؟",
|
||||
"q05": "كيف يمكن نشر واستخدام {{appName}}؟",
|
||||
"q06": "كيف يتم تسعير {{appName}}؟",
|
||||
"q07": "هل {{appName}} مجاني؟",
|
||||
"q08": "هل هناك نسخة خدمة سحابية؟",
|
||||
"q09": "هل يدعم نماذج اللغة المحلية؟",
|
||||
"q10": "هل يدعم التعرف على الصور وتوليدها؟",
|
||||
"q11": "هل يدعم تحويل النص إلى كلام والتعرف على الصوت؟",
|
||||
"q12": "هل يدعم نظام الإضافات؟",
|
||||
"q13": "هل لديه سوق خاص للحصول على GPTs؟",
|
||||
"q14": "هل يدعم مزودي خدمات الذكاء الاصطناعي المتعددين؟",
|
||||
"q15": "ماذا أفعل إذا واجهت مشكلة أثناء الاستخدام؟"
|
||||
},
|
||||
"questions": {
|
||||
"moreBtn": "اعرف المزيد",
|
||||
"title": "الأسئلة الشائعة:"
|
||||
},
|
||||
"topics": {
|
||||
"title": "المواضيع الأخيرة:"
|
||||
},
|
||||
"welcome": {
|
||||
"afternoon": "مساء الخير",
|
||||
"morning": "صباح الخير",
|
||||
"night": "مساء الخير",
|
||||
"noon": "طاب يومك"
|
||||
}
|
||||
},
|
||||
"header": "مرحبًا بك",
|
||||
"pickAgent": "أو اختر من قوالب المساعدين أدناه",
|
||||
"skip": "تخطي الإنشاء",
|
||||
"slogan": {
|
||||
"desc1": "افتح عقول الجماعة وأشعل شرارة الأفكار. مساعدك الذكي دائمًا معك.",
|
||||
"desc2": "أنشئ مساعدك الأول، هيا نبدأ~",
|
||||
"title": "امنح نفسك عقلًا أكثر ذكاءً"
|
||||
},
|
||||
"title": "مرحبًا بك"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"login": {
|
||||
"button": "Вход в {{appName}}",
|
||||
"cancel": "Отказ",
|
||||
"loginWithLobeHub": "Вход с акаунт в {{appName}}",
|
||||
"privacyPolicy": "Политика за поверителност",
|
||||
"processing": "Вход в системата, моля изчакайте...",
|
||||
"securityNote": "Подписването означава, че приемате нашите",
|
||||
"selfHostedButton": "Използвайте самостоятелен екземпляр",
|
||||
"selfHostedContinue": "Продължи",
|
||||
"selfHostedDescription": "Свържете се със своя самостоятелно хостван LobeChat сървър.",
|
||||
"selfHostedHint": "Ще запомним този адрес на сървъра, докато не превключите обратно към официалния екземпляр в настройките.",
|
||||
"selfHostedInvalid": "Моля, въведете валиден HTTP или HTTPS адрес.",
|
||||
"selfHostedPlaceholder": "https://your-lobechat-instance.com",
|
||||
"selfHostedRequired": "Моля, въведете адрес на сървъра.",
|
||||
"selfHostedTitle": "Въведете адреса на самостоятелно хоствания сървър",
|
||||
"subtitle": "Добре дошли отново! Моля, влезте, за да продължите",
|
||||
"usePolicy": "Условия за ползване"
|
||||
},
|
||||
"logout": {
|
||||
"button": "Изход",
|
||||
"confirm": {
|
||||
"cancel": "Отказ",
|
||||
"message": "Сигурни ли сте, че искате да излезете?",
|
||||
"ok": "Потвърждавам",
|
||||
"title": "Потвърждение за изход"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"verified": "Потвърден"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"agentDefaultMessage": "Здравейте, аз съм **{{name}}**, можете веднага да започнете разговор с мен или да отидете в [Настройки на асистента]({{url}}), за да подобрите информацията ми.",
|
||||
"agentDefaultMessageWithSystemRole": "Здравейте, аз съм **{{name}}**, {{systemRole}}, нека започнем разговора!",
|
||||
"agentDefaultMessageWithoutEdit": "Здравейте, аз съм **{{name}}**, нека започнем разговора!",
|
||||
"agentList": "Списък с асистенти",
|
||||
"agentRoleEdit": {
|
||||
"cancel": "Отказ",
|
||||
"confirm": "Потвърждение",
|
||||
"edit": "Редактиране",
|
||||
"editButton": "Редактиране на ролята",
|
||||
"placeholder": "Моля, въведете подсказка за ролята",
|
||||
"roleSetting": "Настройка на ролята",
|
||||
"title": "Настройка на ролята"
|
||||
},
|
||||
"confirmDelete": "Потвърдете изтриването",
|
||||
"confirmRemoveSessionItemAlert": "Този асистент ще бъде изтрит и няма да може да бъде възстановен. Моля, потвърдете действието си.",
|
||||
"copyFailed": "Копирането не бе успешно",
|
||||
"defaultAgent": "Персонализиран асистент",
|
||||
"defaultList": "Списък по подразбиране",
|
||||
"deleteMessageConfirm": "Сигурни ли сте, че искате да изтриете това съобщение?",
|
||||
"history": "История на разговорите",
|
||||
"inbox": {
|
||||
"desc": "Активирайте мозъчния клъстер и стимулирайте искрите на мисълта. Вашият интелигентен асистент е тук, за да обсъжда всичко с вас.",
|
||||
"title": "Свободен разговор"
|
||||
},
|
||||
"messageCopied": "Съобщението е копирано",
|
||||
"messageEdit": {
|
||||
"placeholder": "Моля, въведете съдържанието на съобщението",
|
||||
"title": "Редактиране на съобщение"
|
||||
},
|
||||
"newAgent": "Нов помощник",
|
||||
"newChat": "Нов разговор",
|
||||
"pin": "Закачане",
|
||||
"pinOff": "Премахване на закачането",
|
||||
"placeholder": "Въведете вашето съобщение...",
|
||||
"reasoning": {
|
||||
"thinking": "Задълбочено обмисляне...",
|
||||
"thought": "Задълбочено обмислено (отне {{duration}} секунди)",
|
||||
"thoughtWithoutDuration": "Задълбочено обмислено"
|
||||
},
|
||||
"regenerateFailed": "Неуспешно повторно генериране, моля опитайте по-късно",
|
||||
"send": "Изпрати",
|
||||
"session": {
|
||||
"createFirst": "Създайте първата си чат сесия",
|
||||
"empty": "Няма налични сесии",
|
||||
"search": {
|
||||
"discoverAssistants": "Открийте асистенти",
|
||||
"emptyResult": "Няма намерени съвпадащи помощници",
|
||||
"myAssistants": "Моите асистенти",
|
||||
"placeholder": "Търсете любимия си асистент...",
|
||||
"recentSearches": "Скорошни търсения",
|
||||
"title": "Търсене"
|
||||
},
|
||||
"title": "Свободен разговор"
|
||||
},
|
||||
"sessionGroup": {
|
||||
"config": "Управление на групи",
|
||||
"confirmRemoveGroupAlert": "Групата ще бъде изтрита. След изтриването, асистентите в тази група ще бъдат преместени в списъка по подразбиране. Моля, потвърдете действието си.",
|
||||
"createGroup": "Създаване на група",
|
||||
"createSuccess": "Групата беше създадена успешно",
|
||||
"emptyGroup": "Няма налични групи",
|
||||
"inputPlaceholder": "Моля, въведете име на групата",
|
||||
"moveGroup": "Преместване в група",
|
||||
"moveSuccess": "Успешно преместване",
|
||||
"newGroup": "Нова група",
|
||||
"removeSuccess": "Успешно изтриване",
|
||||
"rename": "Преименуване",
|
||||
"renameSuccess": "Успешно преименуване",
|
||||
"tooLong": "Името на групата трябва да бъде между 1 и 20 символа"
|
||||
},
|
||||
"setting": {
|
||||
"avatar": "Аватар",
|
||||
"description": "Описание",
|
||||
"done": "Готово",
|
||||
"name": "Име",
|
||||
"title": "Настройки на разговора"
|
||||
},
|
||||
"share": "Сподели",
|
||||
"stop": "Спри",
|
||||
"thinking": "Мислене..."
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"actions": {
|
||||
"add": "Добавяне",
|
||||
"cancel": "Отказ",
|
||||
"clear": "Изчисти",
|
||||
"confirm": "Потвърждение",
|
||||
"continue": "Продължи",
|
||||
"copy": "Копирай",
|
||||
"delete": "Изтрий",
|
||||
"edit": "Редактирай",
|
||||
"more": "Още",
|
||||
"notNow": "Не сега",
|
||||
"regenerate": "Генерирай отново",
|
||||
"retry": "Опитай отново",
|
||||
"save": "Запази",
|
||||
"saveImage": "Запази изображението"
|
||||
},
|
||||
"and": "и",
|
||||
"assistant": {
|
||||
"fetchError": "Неуспешно зареждане на списъка с асистенти, моля опитайте по-късно",
|
||||
"noData": "Няма данни за асистенти",
|
||||
"noMatch": "Не са намерени съвпадащи асистенти",
|
||||
"recentSearches": "Скорошни търсения",
|
||||
"search": "Търсене на асистент...",
|
||||
"searchNoResult": "Няма намерени съвпадащи асистенти",
|
||||
"searchPlaceholder": "Моля, въведете ключова дума за търсене"
|
||||
},
|
||||
"defaultSession": "Персонализиран асистент",
|
||||
"image": {
|
||||
"permissionDenied": "Необходим е достъп до албума, за да се запази изображението",
|
||||
"permissionRequest": "Моля, разрешете достъп до албума в настройките",
|
||||
"saveFailed": "Неуспешно запазване, моля опитайте отново",
|
||||
"saveSuccess": "Изображението е запазено в албума"
|
||||
},
|
||||
"navigation": {
|
||||
"goToHomeScreen": "Върни се на началния екран"
|
||||
},
|
||||
"or": "или",
|
||||
"search": {
|
||||
"placeholder": "Търсене"
|
||||
},
|
||||
"status": {
|
||||
"error": "Грешка",
|
||||
"info": "Информация",
|
||||
"loading": "Зареждане...",
|
||||
"networkRetryTip": "Моля, проверете мрежовата връзка или опитайте отново",
|
||||
"success": "Успешно",
|
||||
"warning": "Предупреждение"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"Highlighter": {
|
||||
"cancel": "Отказ",
|
||||
"selectLanguage": "Избор на език"
|
||||
},
|
||||
"ModelSwitchPanel": {
|
||||
"chooseModel": "Изберете модел",
|
||||
"emptyModel": "Няма активирани модели, моля отидете в настройките, за да активирате",
|
||||
"emptyProvider": "Няма активирани доставчици, моля отидете в настройките, за да активирате",
|
||||
"goToSettings": "Отидете в настройките",
|
||||
"provider": "Доставчик",
|
||||
"title": "Модел"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"assistant": {
|
||||
"detail": {
|
||||
"addAndChat": "Добавяне на асистент и чат",
|
||||
"addFailed": "Неуспешно добавяне на асистент",
|
||||
"addFailedMessage": "Неуспешно добавяне на асистент, моля опитайте по-късно",
|
||||
"assistantSettings": "Настройки на асистента",
|
||||
"loadFailed": "Неуспешно зареждане на детайли за асистента, моля опитайте по-късно",
|
||||
"notFoundIdentifier": "Идентификаторът на асистента не е намерен",
|
||||
"share": "Споделяне",
|
||||
"shareFailed": "Неуспешно споделяне",
|
||||
"title": "Подробности за асистента"
|
||||
}
|
||||
},
|
||||
"category": {
|
||||
"assistant": {
|
||||
"academic": "Академичен",
|
||||
"all": "Всички",
|
||||
"career": "Кариера",
|
||||
"copywriting": "Копирайтинг",
|
||||
"design": "Дизайн",
|
||||
"education": "Образование",
|
||||
"emotions": "Емоции",
|
||||
"entertainment": "Развлечение",
|
||||
"games": "Игри",
|
||||
"general": "Общ",
|
||||
"life": "Живот",
|
||||
"marketing": "Бизнес",
|
||||
"office": "Офис",
|
||||
"programming": "Програмиране",
|
||||
"translation": "Превод"
|
||||
}
|
||||
},
|
||||
"title": "Открийте"
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"error": {
|
||||
"title": "Възникна грешка"
|
||||
},
|
||||
"http": {
|
||||
"forbidden": "Достъпът е забранен",
|
||||
"networkError": "Грешка в мрежата",
|
||||
"notFound": "Не е намерено",
|
||||
"serverError": "Грешка на сървъра",
|
||||
"timeout": "Времето за заявката изтече",
|
||||
"unauthorized": "Неоторизиран"
|
||||
},
|
||||
"login": {
|
||||
"accessDenied": "Съжаляваме, заявката за влизане е отказана, моля опитайте по-късно",
|
||||
"cancelled": "Отказахте влизането",
|
||||
"invalidGrant": "Съжаляваме, сесията за влизане е изтекла, моля опитайте по-късно",
|
||||
"invalidIdToken": "Съжаляваме, временно не можем да получим информация за вашия акаунт, моля опитайте по-късно",
|
||||
"invalidRequest": "Съжаляваме, има проблем със заявката за влизане, моля опитайте по-късно",
|
||||
"invalidState": "Съжаляваме, проверката за влизане не е премината, моля опитайте по-късно",
|
||||
"missingCodeOrState": "Съжаляваме, липсва необходимата информация за влизане, моля опитайте по-късно",
|
||||
"missingPkce": "Съжаляваме, липсва информация за проверка при влизане, моля опитайте по-късно",
|
||||
"networkError": "Съжаляваме, възникна мрежова грешка по време на влизане, моля проверете мрежата и опитайте отново",
|
||||
"noIdToken": "Съжаляваме, не успяхме да получим информация за влизане, моля опитайте по-късно",
|
||||
"serverError": "Съжаляваме, възникна проблем със сървъра за влизане, моля опитайте по-късно",
|
||||
"temporarilyUnavailable": "Съжаляваме, услугата за влизане временно не е налична, моля опитайте по-късно",
|
||||
"tokenEndpointNonJson": "Съжаляваме, услугата за влизане върна неочакван отговор, моля опитайте по-късно",
|
||||
"tokenExchangeFailed": "Съжаляваме, възникна проблем при обработката на влизането, моля опитайте по-късно",
|
||||
"unknown": "Съжаляваме, влизането не бе успешно, моля опитайте по-късно",
|
||||
"unsupportedResponseType": "Съжаляваме, този метод за влизане не се поддържа в момента, моля опитайте по-късно"
|
||||
},
|
||||
"page": {
|
||||
"notFoundMessage": "Тази страница не съществува.",
|
||||
"notFoundTitle": "Опа!"
|
||||
},
|
||||
"response": {
|
||||
"400": "Съжаляваме, сървърът не разбира вашата заявка, моля проверете дали параметрите са правилни",
|
||||
"401": "Съжаляваме, сървърът отказа вашата заявка, вероятно поради липса на права или невалидна автентикация",
|
||||
"403": "Съжаляваме, сървърът отказа вашата заявка, нямате достъп до това съдържание",
|
||||
"404": "Съжаляваме, сървърът не намери страницата или ресурса, моля проверете дали URL адресът е правилен",
|
||||
"405": "Съжаляваме, сървърът не поддържа използвания метод на заявка, моля проверете метода",
|
||||
"406": "Съжаляваме, сървърът не може да изпълни заявката според характеристиките на съдържанието",
|
||||
"407": "Съжаляваме, трябва да се извърши прокси автентикация, за да продължите",
|
||||
"408": "Съжаляваме, сървърът изтече времето за изчакване на заявката, моля проверете мрежата и опитайте отново",
|
||||
"409": "Съжаляваме, заявката е в конфликт и не може да бъде обработена, вероятно поради несъвместимо състояние на ресурса",
|
||||
"410": "Съжаляваме, ресурсът, който търсите, е премахнат завинаги и не може да бъде намерен",
|
||||
"411": "Съжаляваме, сървърът не може да обработи заявка без валидна дължина на съдържанието",
|
||||
"412": "Съжаляваме, вашата заявка не отговаря на условията на сървъра и не може да бъде изпълнена",
|
||||
"413": "Съжаляваме, заявката е твърде голяма и сървърът не може да я обработи",
|
||||
"414": "Съжаляваме, URI на заявката е твърде дълъг и сървърът не може да го обработи",
|
||||
"415": "Съжаляваме, сървърът не може да обработи медийния формат на заявката",
|
||||
"416": "Съжаляваме, сървърът не може да удовлетвори диапазона, който искате",
|
||||
"417": "Съжаляваме, сървърът не може да удовлетвори вашите очаквания",
|
||||
"422": "Съжаляваме, форматът на заявката е правилен, но съдържа семантични грешки и не може да бъде обработена",
|
||||
"423": "Съжаляваме, ресурсът, който искате, е заключен",
|
||||
"424": "Съжаляваме, поради неуспешна предишна заявка, текущата не може да бъде изпълнена",
|
||||
"426": "Съжаляваме, сървърът изисква клиентът да се актуализира до по-висока версия на протокола",
|
||||
"428": "Съжаляваме, сървърът изисква предварително условие, моля включете правилните условни заглавки в заявката",
|
||||
"429": "Съжаляваме, изпратихте твърде много заявки, сървърът е претоварен, моля опитайте по-късно",
|
||||
"431": "Съжаляваме, заглавните полета на заявката са твърде големи и сървърът не може да ги обработи",
|
||||
"451": "Съжаляваме, поради правни причини сървърът отказва достъп до този ресурс",
|
||||
"499": "Съжаляваме, вашата заявка беше прекъсната неочаквано по време на обработка, вероятно поради отказана операция или нестабилна мрежа. Моля, проверете мрежата и опитайте отново.",
|
||||
"500": "Съжаляваме, сървърът срещна проблем и не може да изпълни заявката ви в момента, моля опитайте по-късно",
|
||||
"501": "Съжаляваме, сървърът не знае как да обработи тази заявка, моля проверете дали операцията е правилна",
|
||||
"502": "Съжаляваме, сървърът изглежда е загубил посоката си и не може да предостави услуга в момента, моля опитайте по-късно",
|
||||
"503": "Съжаляваме, сървърът не може да обработи заявката ви в момента, вероятно поради претоварване или поддръжка, моля опитайте по-късно",
|
||||
"504": "Съжаляваме, сървърът не получи отговор от горестоящ сървър, моля опитайте по-късно",
|
||||
"505": "Съжаляваме, сървърът не поддържа използваната версия на HTTP, моля обновете и опитайте отново",
|
||||
"506": "Съжаляваме, възникна проблем с конфигурацията на сървъра, моля свържете се с администратора",
|
||||
"507": "Съжаляваме, сървърът няма достатъчно място за съхранение, за да обработи заявката ви, моля опитайте по-късно",
|
||||
"509": "Съжаляваме, пропускателната способност на сървъра е изчерпана, моля опитайте по-късно",
|
||||
"510": "Съжаляваме, сървърът не поддържа разширените функции на заявката, моля свържете се с администратора",
|
||||
"520": "Съжаляваме, сървърът срещна неочакван проблем и не може да изпълни заявката ви. Моля опитайте по-късно, работим по решаването на проблема.",
|
||||
"522": "Съжаляваме, връзката със сървъра изтече и не получихме отговор навреме. Възможно е мрежата да е нестабилна или сървърът временно недостъпен. Моля опитайте по-късно, работим за възстановяване на услугата.",
|
||||
"524": "Съжаляваме, сървърът изтече времето за изчакване на отговор, вероятно поради бавен отговор, моля опитайте по-късно",
|
||||
"AgentRuntimeError": "Възникна грешка при изпълнението на Lobe AI Runtime, моля проверете информацията по-долу или опитайте отново",
|
||||
"ConnectionCheckFailed": "Заявката върна празен отговор, моля проверете дали адресът на API проксито завършва с `/v1`",
|
||||
"CreateMessageError": "Съжаляваме, съобщението не бе изпратено успешно, моля копирайте съдържанието и го изпратете отново. След презареждане на страницата това съобщение няма да се запази.",
|
||||
"ExceededContextWindow": "Съдържанието на текущата заявка надвишава максималната дължина, която моделът може да обработи, моля намалете обема и опитайте отново",
|
||||
"FreePlanLimit": "В момента използвате безплатен план и не можете да използвате тази функция, моля надградете до платен план, за да продължите",
|
||||
"InsufficientQuota": "Съжаляваме, квотата на този ключ е изчерпана, моля проверете баланса на акаунта или увеличете квотата на ключа и опитайте отново",
|
||||
"InvalidAccessCode": "Паролата е неправилна или празна, моля въведете правилната парола за достъп или добавете персонализиран API ключ",
|
||||
"InvalidBedrockCredentials": "Проверката на Bedrock не е успешна, моля проверете AccessKeyId/SecretAccessKey и опитайте отново",
|
||||
"InvalidClerkUser": "Съжаляваме, в момента не сте влезли в системата, моля влезте или регистрирайте акаунт, за да продължите",
|
||||
"InvalidGithubToken": "Github PAT е неправилен или празен, моля проверете Github PAT и опитайте отново",
|
||||
"InvalidOllamaArgs": "Конфигурацията на Ollama е неправилна, моля проверете настройките и опитайте отново",
|
||||
"InvalidProviderAPIKey": "{{provider}} API ключът е неправилен или празен, моля проверете {{provider}} API ключа и опитайте отново",
|
||||
"InvalidVertexCredentials": "Проверката на Vertex не е успешна, моля проверете удостоверителните данни и опитайте отново",
|
||||
"LocationNotSupportError": "Съжаляваме, вашият регион не поддържа тази моделна услуга, вероятно поради регионални ограничения или неактивирана услуга. Моля, проверете дали вашият регион поддържа тази услуга или опитайте да превключите към друг регион и опитайте отново.",
|
||||
"ModelNotFound": "Съжаляваме, не може да бъде намерен съответният модел, вероятно моделът не съществува или нямате достъп. Моля сменете API ключа или коригирайте правата за достъп и опитайте отново.",
|
||||
"NoOpenAIAPIKey": "OpenAI API ключът е неправилен или празен, моля добавете персонализиран OpenAI API ключ",
|
||||
"OllamaBizError": "Възникна грешка при заявка към Ollama услугата, моля проверете информацията по-долу или опитайте отново",
|
||||
"OllamaServiceUnavailable": "Неуспешно свързване с Ollama услугата, моля проверете дали Ollama работи правилно и дали е конфигурирана правилно за кросдомейн достъп",
|
||||
"PermissionDenied": "Съжаляваме, нямате права за достъп до тази услуга, моля проверете дали вашият ключ има необходимите права",
|
||||
"PluginApiNotFound": "Съжаляваме, API-то не съществува в описанието на плъгина, моля проверете дали методът на заявката съвпада с API-то в плъгин описанието",
|
||||
"PluginApiParamsError": "Съжаляваме, проверката на входните параметри за този плъгин не е успешна, моля проверете дали параметрите съвпадат с описанието на API-то",
|
||||
"PluginFailToTransformArguments": "Съжаляваме, неуспешен анализ на параметрите за плъгина, моля опитайте да генерирате съобщението на асистента отново или използвайте AI модел с по-добри възможности за Tools Calling и опитайте пак",
|
||||
"PluginGatewayError": "Съжаляваме, възникна грешка в шлюза на плъгина, моля проверете дали конфигурацията на шлюза е правилна",
|
||||
"PluginManifestInvalid": "Съжаляваме, проверката на описанието на плъгина не е успешна, моля проверете дали форматът на описанието е валиден",
|
||||
"PluginManifestNotFound": "Съжаляваме, сървърът не намери описанието на плъгина (manifest.json), моля проверете дали адресът на описанието е правилен",
|
||||
"PluginMarketIndexInvalid": "Съжаляваме, проверката на индекса на плъгина не е успешна, моля проверете дали форматът на индексния файл е валиден",
|
||||
"PluginMarketIndexNotFound": "Съжаляваме, сървърът не намери индексния файл на плъгина, моля проверете дали адресът на индекса е правилен",
|
||||
"PluginMetaInvalid": "Съжаляваме, проверката на метаинформацията на плъгина не е успешна, моля проверете дали форматът на метаинформацията е валиден",
|
||||
"PluginMetaNotFound": "Съжаляваме, плъгинът не е намерен в индекса, моля проверете конфигурацията на плъгина в индекса",
|
||||
"PluginOpenApiInitError": "Съжаляваме, инициализацията на OpenAPI клиента не бе успешна, моля проверете конфигурацията на OpenAPI",
|
||||
"PluginServerError": "Възникна грешка при заявка към сървъра на плъгина, моля проверете описанието на плъгина, конфигурацията или сървърната реализация според съобщението за грешка по-долу",
|
||||
"PluginSettingsInvalid": "Този плъгин изисква правилна конфигурация, за да бъде използван, моля проверете дали настройките са коректни",
|
||||
"ProviderBizError": "Възникна грешка при заявка към услугата {{provider}}, моля проверете информацията по-долу или опитайте отново",
|
||||
"QuotaLimitReached": "Съжаляваме, текущата употреба на токени или брой заявки е достигнала квотата на този ключ, моля увеличете квотата или опитайте по-късно",
|
||||
"StreamChunkError": "Грешка при анализ на блокове от съобщения в поточна заявка, моля проверете дали API интерфейсът отговаря на стандартите или се свържете с доставчика на API",
|
||||
"SubscriptionKeyMismatch": "Съжаляваме, поради временна системна грешка текущата абонаментна употреба е невалидна, моля натиснете бутона по-долу за възстановяване на абонамента или се свържете с нас по имейл за поддръжка",
|
||||
"SubscriptionPlanLimit": "Вашите абонаментни точки са изчерпани и не можете да използвате тази функция, моля надградете до по-висок план или конфигурирайте персонализиран модел API, за да продължите",
|
||||
"SystemTimeNotMatchError": "Съжаляваме, системното ви време не съвпада с това на сървъра, моля проверете системното време и опитайте отново",
|
||||
"UnknownChatFetchError": "Съжаляваме, възникна неизвестна грешка при заявката, моля проверете информацията по-долу или опитайте отново"
|
||||
},
|
||||
"sessionExpired": {
|
||||
"desc": "За да защитим вашия акаунт, моля влезте отново",
|
||||
"login": "Влезте сега",
|
||||
"title": "Сесията е изтекла"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"ai21": {
|
||||
"description": "AI21 Labs изгражда основни модели и системи за изкуствен интелект за предприятия, ускорявайки приложението на генеративния изкуствен интелект в производството."
|
||||
},
|
||||
"ai302": {
|
||||
"description": "302.AI е платформа за AI приложения с плащане според нуждите, предлагаща най-пълния набор от AI API и онлайн AI приложения на пазара."
|
||||
},
|
||||
"ai360": {
|
||||
"description": "360 AI е платформа за AI модели и услуги, разработена от компанията 360, предлагаща разнообразни усъвършенствани модели за обработка на естествен език, включително 360GPT2 Pro, 360GPT Pro, 360GPT Turbo и 360GPT Turbo Responsibility 8K. Тези модели съчетават голям брой параметри и мултимодални възможности, широко използвани в генериране на текст, семантично разбиране, диалогови системи и генериране на код. С гъвкава ценова политика 360 AI отговаря на разнообразните нужди на потребителите, поддържа интеграция за разработчици и стимулира иновациите и развитието на интелигентни приложения."
|
||||
},
|
||||
"aihubmix": {
|
||||
"description": "AiHubMix предоставя достъп до множество AI модели чрез унифициран API интерфейс."
|
||||
},
|
||||
"anthropic": {
|
||||
"description": "Anthropic е компания, фокусирана върху изследвания и разработка на изкуствен интелект, предлагаща серия от усъвършенствани езикови модели като Claude 3.5 Sonnet, Claude 3 Sonnet, Claude 3 Opus и Claude 3 Haiku. Тези модели постигат идеален баланс между интелигентност, скорост и разходи, подходящи за различни приложения от корпоративни натоварвания до бързи отговори. Claude 3.5 Sonnet, като най-нов модел, показва отлични резултати в множество оценки, като същевременно поддържа висока ефективност на разходите."
|
||||
},
|
||||
"azure": {
|
||||
"description": "Azure предлага множество усъвършенствани AI модели, включително GPT-3.5 и най-новата серия GPT-4, поддържащи различни типове данни и сложни задачи, с ангажимент към сигурни, надеждни и устойчиви AI решения."
|
||||
},
|
||||
"azureai": {
|
||||
"description": "Azure предлага множество усъвършенствани AI модели, включително GPT-3.5 и най-новата серия GPT-4, поддържащи различни типове данни и сложни задачи, с ангажимент към сигурни, надеждни и устойчиви AI решения."
|
||||
},
|
||||
"baichuan": {
|
||||
"description": "Baichuan Intelligent е компания, специализирана в разработката на големи AI модели, чиито модели превъзхождат водещите чуждестранни модели в задачи на китайски език като енциклопедични знания, обработка на дълги текстове и творческо генериране. Baichuan Intelligent също така притежава водещи в индустрията мултимодални възможности и постига отлични резултати в множество авторитетни оценки. Моделите включват Baichuan 4, Baichuan 3 Turbo и Baichuan 3 Turbo 128k, оптимизирани за различни приложения и предлагат решения с висока ефективност на разходите."
|
||||
},
|
||||
"bedrock": {
|
||||
"description": "Bedrock е услуга на Amazon AWS, фокусирана върху предоставянето на усъвършенствани AI езикови и визуални модели за предприятия. Семейството от модели включва серията Claude на Anthropic, серията Llama 3.1 на Meta и други, обхващащи от леки до високопроизводителни опции, поддържащи задачи като генериране на текст, диалог и обработка на изображения, подходящи за предприятия с различен мащаб и нужди."
|
||||
},
|
||||
"cloudflare": {
|
||||
"description": "Изпълнявайте машинно обучение, задвижвано от безсървърни GPU модели, в глобалната мрежа на Cloudflare."
|
||||
},
|
||||
"cohere": {
|
||||
"description": "Cohere предлага най-съвременни многоезични модели, усъвършенствани функции за търсене и AI работно пространство, специално създадено за съвременни предприятия — всичко интегрирано в една сигурна платформа."
|
||||
},
|
||||
"deepseek": {
|
||||
"description": "DeepSeek е компания, специализирана в изследвания и приложения на изкуствен интелект, чиито най-нови модели DeepSeek-V3 превъзхождат отворените модели като Qwen2.5-72B и Llama-3.1-405B и се представят наравно с водещите затворени модели GPT-4o и Claude-3.5-Sonnet."
|
||||
},
|
||||
"fal": {
|
||||
"description": "Платформа за генеративни медии, насочена към разработчици."
|
||||
},
|
||||
"fireworksai": {
|
||||
"description": "Fireworks AI е водещ доставчик на усъвършенствани езикови модели, специализиран в извикване на функции и мултимодална обработка. Най-новият им модел Firefunction V2, базиран на Llama-3, е оптимизиран за извикване на функции, диалог и следване на инструкции. Визуалният езиков модел FireLLaVA-13B поддържа смесен вход от изображения и текст. Други забележителни модели включват серията Llama и Mixtral, които предлагат ефективна многоезична поддръжка за следване на инструкции и генериране."
|
||||
},
|
||||
"giteeai": {
|
||||
"description": "Serverless API на Gitee AI предоставя готови за използване API услуги за големи модели за AI разработчици."
|
||||
},
|
||||
"github": {
|
||||
"description": "С моделите на GitHub разработчиците могат да станат AI инженери и да изграждат с водещи в индустрията AI модели."
|
||||
},
|
||||
"google": {
|
||||
"description": "Серията Gemini на Google е най-усъвършенстваният и универсален AI модел, разработен от Google DeepMind, специално проектиран за мултимодалност, поддържащ безпроблемно разбиране и обработка на текст, код, изображения, аудио и видео. Подходящ за различни среди от центрове за данни до мобилни устройства, значително повишава ефективността и приложимостта на AI моделите."
|
||||
},
|
||||
"groq": {
|
||||
"description": "LPU изчислителният двигател на Groq постига изключителни резултати в най-новите независими тестове за големи езикови модели (LLM), преосмисляйки стандартите за AI решения с невероятна скорост и ефективност. Groq е символ на мигновена скорост на изчисление и показва отлична производителност при облачни внедрявания."
|
||||
},
|
||||
"higress": {
|
||||
"description": "Higress е облачен API шлюз, създаден вътрешно в Alibaba за решаване на проблеми с Tengine reload, които вредят на дългосрочните връзки, както и за подобряване на балансирането на натоварването при gRPC/Dubbo."
|
||||
},
|
||||
"huggingface": {
|
||||
"description": "HuggingFace Inference API предлага бърз и безплатен начин да изследвате хиляди модели за различни задачи. Независимо дали прототипирате ново приложение или експериментирате с машинно обучение, този API ви дава незабавен достъп до високопроизводителни модели в множество области."
|
||||
},
|
||||
"hunyuan": {
|
||||
"description": "Голям езиков модел, разработен от Tencent, с мощни способности за създаване на съдържание на китайски, логическо разсъждение в сложни контексти и надеждно изпълнение на задачи."
|
||||
},
|
||||
"infiniai": {
|
||||
"description": "Предоставя на разработчиците на приложения високопроизводителни, лесни за използване, сигурни и надеждни услуги с големи модели, покриващи целия процес от разработка до внедряване на модели като услуга."
|
||||
},
|
||||
"internlm": {
|
||||
"description": "Отворена организация, посветена на изследвания и разработка на големи модели и инструменти за разработка. Предоставя ефективна и лесна за използване отворена платформа за всички AI разработчици, правейки най-съвременните големи модели и алгоритми достъпни."
|
||||
},
|
||||
"jina": {
|
||||
"description": "Jina AI, основана през 2020 г., е водеща компания в областта на търсещия AI. Платформата им включва векторни модели, пренареждачи и малки езикови модели, които помагат на предприятията да изграждат надеждни и висококачествени генеративни AI и мултимодални търсещи приложения."
|
||||
},
|
||||
"lmstudio": {
|
||||
"description": "LM Studio е настолно приложение за разработка и експериментиране с големи езикови модели (LLM) на вашия компютър."
|
||||
},
|
||||
"minimax": {
|
||||
"description": "MiniMax е универсална компания за изкуствен интелект, основана през 2021 г., посветена на съвместното създаване на интелигентност с потребителите. MiniMax разработва собствени универсални големи модели с различни модалности, включително MoE текстов модел с трилиони параметри, големи модели за реч и изображения, и предлага приложения като Conch AI."
|
||||
},
|
||||
"mistral": {
|
||||
"description": "Mistral предлага усъвършенствани универсални, професионални и изследователски модели, широко използвани в сложни разсъждения, многоезични задачи и генериране на код. Чрез интерфейс за извикване на функции потребителите могат да интегрират персонализирани функции за специфични приложения."
|
||||
},
|
||||
"modelscope": {
|
||||
"description": "ModelScope е платформа за модели като услуга, пусната от Alibaba Cloud, предлагаща богати AI модели и услуги за извод."
|
||||
},
|
||||
"moonshot": {
|
||||
"description": "Moonshot е отворена платформа, разработена от Beijing Moon's Dark Side Technology Co., Ltd., предлагаща множество модели за обработка на естествен език с широко приложение, включително, но не само, създаване на съдържание, академични изследвания, интелигентни препоръки и медицинска диагностика, поддържаща обработка на дълги текстове и сложни задачи за генериране."
|
||||
},
|
||||
"novita": {
|
||||
"description": "Novita AI е платформа за API услуги, предлагаща множество големи езикови модели и AI генерация на изображения, гъвкава, надеждна и икономична. Поддържа най-новите отворени модели като Llama3 и Mistral и предоставя цялостни, удобни за потребителя и автоматично мащабируеми API решения за разработка на генеративни AI приложения, подходящи за бърз растеж на AI стартиращи компании."
|
||||
},
|
||||
"nvidia": {
|
||||
"description": "NVIDIA NIM™ предоставя контейнери за самостоятелно хостване на GPU-ускорени микросервизи за извод, поддържащи внедряване на предварително обучени и персонализирани AI модели в облака, центрове за данни, RTX™ AI персонални компютри и работни станции."
|
||||
},
|
||||
"ollama": {
|
||||
"description": "Ollama предлага модели, обхващащи генериране на код, математически изчисления, многоезична обработка и диалогови взаимодействия, поддържащи разнообразни нужди за корпоративно и локално внедряване."
|
||||
},
|
||||
"openai": {
|
||||
"description": "OpenAI е водеща световна изследователска институция в областта на изкуствения интелект, чиито модели като серията GPT движат напредъка в обработката на естествен език. OpenAI се стреми да трансформира множество индустрии чрез иновативни и ефективни AI решения. Техните продукти се отличават с висока производителност и икономичност, широко използвани в изследвания, бизнес и иновации."
|
||||
},
|
||||
"openrouter": {
|
||||
"description": "OpenRouter е платформа, предлагаща интерфейси към множество водещи големи модели, поддържащи OpenAI, Anthropic, LLaMA и други, подходяща за разнообразни нужди на разработка и приложения. Потребителите могат гъвкаво да избират оптимални модели и цени според своите изисквания, подобрявайки AI изживяването."
|
||||
},
|
||||
"perplexity": {
|
||||
"description": "Perplexity е водещ доставчик на модели за генериране на диалог, предлагащ множество усъвършенствани Llama 3.1 модели, поддържащи онлайн и офлайн приложения, особено подходящи за сложни задачи в обработката на естествен език."
|
||||
},
|
||||
"ppio": {
|
||||
"description": "PPIO предоставя стабилни и икономични API услуги за отворени модели, поддържащи пълната серия DeepSeek, Llama, Qwen и други водещи в индустрията големи модели."
|
||||
},
|
||||
"qiniu": {
|
||||
"description": "Qiniu, като утвърден доставчик на облачни услуги, предлага икономични и стабилни услуги за реално време и пакетно AI извод, лесни за използване."
|
||||
},
|
||||
"qwen": {
|
||||
"description": "Tongyi Qianwen е голям езиков модел, разработен от Alibaba Cloud, с мощни способности за разбиране и генериране на естествен език. Той може да отговаря на различни въпроси, да създава текстово съдържание, да изразява мнения и да пише код, като играе роля в множество области."
|
||||
},
|
||||
"sambanova": {
|
||||
"description": "SambaNova Cloud позволява на разработчиците лесно да използват най-добрите отворени модели и да се възползват от най-бързата скорост на извод."
|
||||
},
|
||||
"search1api": {
|
||||
"description": "Search1API предоставя достъп до DeepSeek серия модели, които могат да се свързват с интернет по желание, включително стандартни и бързи версии, поддържащи избор на модели с различни параметри."
|
||||
},
|
||||
"sensenova": {
|
||||
"description": "SenseNova, базирана на мощната инфраструктура на SenseTime, предлага ефективни и лесни за използване пълноценни услуги с големи модели."
|
||||
},
|
||||
"siliconcloud": {
|
||||
"description": "SiliconCloud е икономична GenAI облачна услуга, базирана на отлични отворени основни модели."
|
||||
},
|
||||
"spark": {
|
||||
"description": "Големият модел Spark на iFlytek предоставя мощни AI възможности в множество области и езици, използвайки усъвършенствани технологии за обработка на естествен език, за да създаде иновативни приложения в интелигентен хардуер, умна медицина, интелигентни финанси и други вертикални сектори."
|
||||
},
|
||||
"stepfun": {
|
||||
"description": "Големият модел Star of Classes притежава водещи в индустрията мултимодални и сложни разсъждаващи способности, поддържа разбиране на много дълги текстове и мощни функции за самостоятелно управление на търсещ двигател."
|
||||
},
|
||||
"taichu": {
|
||||
"description": "Новото поколение мултимодален голям модел, разработен от Института по автоматизация на Китайската академия на науките и Института за изкуствен интелект в Ухан, поддържа многократни въпроси и отговори, създаване на текст, генериране на изображения, 3D разбиране, анализ на сигнали и други комплексни задачи, с по-силни когнитивни, разбиращи и творчески способности, предоставяйки ново интерактивно изживяване."
|
||||
},
|
||||
"tencentcloud": {
|
||||
"description": "Атомната способност на Knowledge Engine (LLM Knowledge Engine Atomic Power) е цялостна способност за въпроси и отговори, разработена на базата на Knowledge Engine, насочена към предприятия и разработчици, предоставяйки гъвкави възможности за изграждане и разработка на модели и приложения. Можете да създадете персонализирани AI услуги чрез множество атомни способности, включително анализ на документи, разделяне, embedding и многократна пренаписване, за да персонализирате AI бизнес за вашето предприятие."
|
||||
},
|
||||
"togetherai": {
|
||||
"description": "Together AI се стреми да постигне водещи резултати чрез иновативни AI модели, предоставяйки широки възможности за персонализация, включително бързо мащабиране и интуитивни процеси на внедряване, за да отговори на разнообразните нужди на предприятията."
|
||||
},
|
||||
"upstage": {
|
||||
"description": "Upstage се фокусира върху разработването на AI модели за различни бизнес нужди, включително Solar LLM и Document AI, с цел постигане на изкуствен общ интелект (AGI). Създавайте лесни диалогови агенти чрез Chat API и поддържайте извикване на функции, превод, embedding и специфични за домейна приложения."
|
||||
},
|
||||
"v0": {
|
||||
"description": "v0 е асистент за програмиране в двойка, който генерира код и потребителски интерфейс (UI) за вашите проекти само чрез описание на идеите с естествен език."
|
||||
},
|
||||
"vertexai": {
|
||||
"description": "Серията Gemini на Google е най-усъвършенстваният и универсален AI модел, разработен от Google DeepMind, специално проектиран за мултимодалност, поддържащ безпроблемно разбиране и обработка на текст, код, изображения, аудио и видео. Подходящ за различни среди от центрове за данни до мобилни устройства, значително повишава ефективността и приложимостта на AI моделите."
|
||||
},
|
||||
"vllm": {
|
||||
"description": "vLLM е бърза и лесна за използване библиотека за извод и обслужване на големи езикови модели (LLM)."
|
||||
},
|
||||
"volcengine": {
|
||||
"description": "Платформа за разработка на услуги с големи модели, пусната от ByteDance, предлагаща богати функции, сигурност и конкурентни цени за извикване на модели, както и пълна функционалност за данни, фина настройка, извод и оценка, осигурявайки цялостна подкрепа за разработка и внедряване на AI приложения."
|
||||
},
|
||||
"wenxin": {
|
||||
"description": "Корпоративна платформа за разработка и услуги на големи модели и AI родни приложения, предлагаща най-пълния и лесен за използване инструментариум за разработка на генеративни AI модели и приложения."
|
||||
},
|
||||
"xai": {
|
||||
"description": "xAI е компания, посветена на изграждането на изкуствен интелект за ускоряване на човешките научни открития. Нашата мисия е да насърчим общото ни разбиране за Вселената."
|
||||
},
|
||||
"xinference": {
|
||||
"description": "Xorbits Inference (Xinference) е отворена платформа за опростяване на изпълнението и интеграцията на различни AI модели. С Xinference можете да изпълнявате извод на всякакви отворени LLM, embedding и мултимодални модели в облак или локална среда и да създавате мощни AI приложения."
|
||||
},
|
||||
"zeroone": {
|
||||
"description": "ZeroOne AllThings се стреми да води революцията на AI 2.0 с човекоцентричен подход, целейки да създаде огромна икономическа и социална стойност чрез големи езикови модели и да открие нови AI екосистеми и бизнес модели."
|
||||
},
|
||||
"zhipu": {
|
||||
"description": "Zhipu AI предоставя отворена платформа за мултимодални и езикови модели, поддържаща широк спектър от AI приложения, включително обработка на текст, разбиране на изображения и помощ при програмиране."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
{
|
||||
"about": "Относно LobeHub",
|
||||
"account": {
|
||||
"group": "Акаунт",
|
||||
"profile": {
|
||||
"email": "Имейл",
|
||||
"name": "Потребителско име",
|
||||
"status": "Състояние на акаунта",
|
||||
"unverified": "Непотвърден",
|
||||
"verified": "Потвърден"
|
||||
},
|
||||
"signOut": {
|
||||
"confirm": "Сигурни ли сте, че искате да излезете?",
|
||||
"label": "Изход"
|
||||
},
|
||||
"switchAccount": {
|
||||
"action": "Смяна на акаунт",
|
||||
"confirm": "Сигурни ли сте, че искате да смените акаунта? Това ще ви изведе от текущия акаунт и ще трябва да влезете отново.",
|
||||
"error": "Неуспешна смяна на акаунт. Моля, опитайте отново.",
|
||||
"label": "Смяна на акаунт"
|
||||
},
|
||||
"title": "Настройки на акаунта"
|
||||
},
|
||||
"advanced": {
|
||||
"group": "Разширени"
|
||||
},
|
||||
"aiProviders": {
|
||||
"configuration": {
|
||||
"apiKey": {
|
||||
"description": "Моля, въведете API ключа за {{name}}",
|
||||
"label": "API ключ",
|
||||
"placeholder": "Въведете API ключа за {{name}}"
|
||||
},
|
||||
"proxyUrl": {
|
||||
"desc": "Трябва да започва с http(s)://",
|
||||
"invalid": "Моля, въведете валиден URL, започващ с http:// или https://",
|
||||
"placeholder": "https://api.example.com/v1",
|
||||
"title": "API прокси адрес"
|
||||
},
|
||||
"saving": "Запазване на конфигурацията...",
|
||||
"title": "Конфигурация",
|
||||
"updateFailedDesc": "Неуспешно запазване. Моля, опитайте отново.",
|
||||
"updateFailedTitle": "Неуспешно запазване"
|
||||
},
|
||||
"detail": {
|
||||
"loadFailed": "Неуспешно зареждане на конфигурацията на доставчика",
|
||||
"loading": "Зареждане на конфигурацията на доставчика..."
|
||||
},
|
||||
"info": {
|
||||
"builtIn": "Вграден доставчик",
|
||||
"custom": "Потребителски доставчик"
|
||||
},
|
||||
"list": {
|
||||
"disabled": "Деактивиран",
|
||||
"emptySearch": "Няма намерени съвпадащи доставчици",
|
||||
"enabled": "Активиран",
|
||||
"loadFailed": "Неуспешно зареждане на списъка с доставчици"
|
||||
},
|
||||
"models": {
|
||||
"allLoaded": "Всички модели са показани",
|
||||
"copySuccess": "Успешно копирано",
|
||||
"disableFailed": "Неуспешно деактивиране на модела",
|
||||
"emptyNoSearch": "Няма намерени модели, опитайте да ги изтеглите от сървъра",
|
||||
"emptyWithSearch": "Няма модели, отговарящи на търсенето",
|
||||
"enableFailed": "Неуспешно активиране на модела",
|
||||
"fetch": "Изтегляне на модели",
|
||||
"fetchFailed": "Неуспешно изтегляне на модели. Моля, опитайте отново.",
|
||||
"fetchSuccess": "Списъкът с модели е успешно изтеглен!",
|
||||
"fetching": "Изтегляне...",
|
||||
"loading": "Зареждане...",
|
||||
"loadingMore": "Зареждане на още...",
|
||||
"modelsAvailable": "Общо {{count}} налични модела",
|
||||
"searchPlaceholder": "Търсене на модели...",
|
||||
"title": "Модели"
|
||||
},
|
||||
"skeleton": {
|
||||
"disabled": "Деактивиран",
|
||||
"enabled": "Активиран"
|
||||
}
|
||||
},
|
||||
"cache": {
|
||||
"clear": {
|
||||
"confirm": {
|
||||
"action": "Изчистване на кеша",
|
||||
"description": "Това ще премахне локално съхранените кеширани данни. При следващото отваряне на приложението съдържанието ще се зареди отново.",
|
||||
"title": "Потвърждавате ли изчистването на кеша?"
|
||||
},
|
||||
"failure": "Неуспешно изчистване на кеша",
|
||||
"success": "Кешът е изчистен"
|
||||
},
|
||||
"description": "Кешът ускорява стартирането. Можете да го изчистите, когато е необходимо да освободите място.",
|
||||
"title": "Изчистване на кеша"
|
||||
},
|
||||
"changelog": "Дневник на промените",
|
||||
"color": {
|
||||
"neutral": {
|
||||
"description": "Изберете неутралния тон на приложението",
|
||||
"title": "Конфигурация на неутралния цвят"
|
||||
},
|
||||
"preview": "Преглед",
|
||||
"previewMessages": {
|
||||
"botGreat": "Радваме се, че ви харесва! Тази функция за преглед ви позволява да видите визуално темата преди да я приложите.",
|
||||
"botHowToUse": "Можете да използвате селектора по-долу, за да промените основния и неутралния цвят. Прегледът ще се обновява в реално време.",
|
||||
"userGreat": "Страхотно!",
|
||||
"userHowToUse": "Как да използвам прегледа на темата?"
|
||||
},
|
||||
"primary": {
|
||||
"description": "Изберете основния цвят на приложението",
|
||||
"title": "Конфигурация на основния цвят"
|
||||
},
|
||||
"title": "Настройки на цветовете"
|
||||
},
|
||||
"developer": {
|
||||
"auth": {
|
||||
"accessToken": {
|
||||
"expire": {
|
||||
"success": "Достъпният токен е изтекъл незабавно",
|
||||
"title": "Изтичане на достъпния токен"
|
||||
},
|
||||
"invalidate": {
|
||||
"success": "Невалиден достъпен токен е записан",
|
||||
"title": "Невалиден достъпен токен"
|
||||
}
|
||||
},
|
||||
"clearAuthData": {
|
||||
"success": "Данните за удостоверяване са изчистени",
|
||||
"title": "Изчистване на удостоверителни данни"
|
||||
},
|
||||
"error": {
|
||||
"noToken": "Няма наличен токен"
|
||||
},
|
||||
"group": "Конфигурация на удостоверяване",
|
||||
"refreshToken": {
|
||||
"expire": {
|
||||
"success": "Токенът за обновяване е изтекъл незабавно",
|
||||
"title": "Изтичане на токена за обновяване"
|
||||
},
|
||||
"invalidate": {
|
||||
"success": "Невалиден токен за обновяване е записан",
|
||||
"title": "Невалиден токен за обновяване"
|
||||
}
|
||||
}
|
||||
},
|
||||
"failurePrefix": "Неуспешна операция: ",
|
||||
"mode": {
|
||||
"already": "Вече сте в режим за разработчици",
|
||||
"enabled": "Режимът за разработчици е активиран",
|
||||
"remaining": "Остава още {{count}} натискания, за да активирате режима за разработчици",
|
||||
"title": "Режим за разработчици"
|
||||
},
|
||||
"selfHostedEntry": {
|
||||
"confirmAction": "Отидете на страницата за конфигурация",
|
||||
"confirmDescription": "След активиране ще се отвори страницата за конфигурация на самостоятелно хостване. Искате ли да излезете от текущия акаунт и да продължите?",
|
||||
"confirmResetAction": "Нулиране и вход",
|
||||
"confirmResetDescription": "Изключването на режима за самостоятелно хостване ще възстанови адреса на сървъра към официалния и ще излезете от акаунта. Искате ли да продължите?",
|
||||
"confirmResetTitle": "Изключване на режима за самостоятелно хостване",
|
||||
"confirmTitle": "Активиране на вход за самостоятелно хостване",
|
||||
"description": "Контролира дали на страницата за вход да се показва бутон за самостоятелно хостван екземпляр",
|
||||
"title": "Активиране на режим за самостоятелно хостване"
|
||||
},
|
||||
"server": {
|
||||
"confirmDescription": "След промяна на адреса на сървъра ще бъдете изведени от акаунта и ще трябва да влезете отново. Искате ли да продължите?",
|
||||
"confirmTitle": "Потвърждение за смяна на сървъра",
|
||||
"current": "Текущ адрес",
|
||||
"description": "След конфигуриране всички заявки ще използват този адрес. Оставете празно, за да се върнете към официалния сървър.",
|
||||
"group": "Конфигурация на сървъра",
|
||||
"hint": "Трябва да започва с http:// или https://. Може да се наложи повторно влизане.",
|
||||
"invalid": "Моля, въведете валиден адрес, започващ с http:// или https://",
|
||||
"notice": "Персонализираният сървър ще замени стандартния API адрес. Уверете се, че е съвместим с LobeChat API. Може да се наложи повторно влизане или рестартиране на приложението.",
|
||||
"noticeTitle": "Внимание преди смяна",
|
||||
"placeholder": "https://your-server.example.com",
|
||||
"reset": "Възстановяване по подразбиране",
|
||||
"resetSuccess": "Официалният адрес на сървъра е възстановен",
|
||||
"save": "Запази",
|
||||
"title": "Самостоятелно хостван екземпляр",
|
||||
"updated": "Персонализираният адрес на сървъра е актуализиран"
|
||||
},
|
||||
"title": "Опции за разработчици"
|
||||
},
|
||||
"feedback": {
|
||||
"email": {
|
||||
"body": {
|
||||
"description": "Описание на проблема:",
|
||||
"footer": "Изпратено от моето {{device}}",
|
||||
"frequency": "Честота на възникване:",
|
||||
"screenshots": "Свързани екранни снимки:",
|
||||
"template": "Моля, опишете подробно проблема, за да можем да ви помогнем по-добре."
|
||||
},
|
||||
"subject": "Обратна връзка - LobeChat - {{version}}"
|
||||
},
|
||||
"error": "Неуспешно отваряне на имейл клиента. Моля, опитайте отново по-късно.",
|
||||
"saved": "Обратната връзка е запазена в чернови",
|
||||
"sent": "Имейлът беше изпратен. Благодарим ви за обратната връзка!",
|
||||
"title": "Обратна връзка",
|
||||
"unavailable": "Функцията за имейл не е налична. Моля, проверете дали устройството е конфигурирано с имейл акаунт или поддържа имейл функции."
|
||||
},
|
||||
"fontSize": {
|
||||
"preview": {
|
||||
"botAnswer": "**Как да променя размера на шрифта?**\n\nИзползвайте плъзгача по-долу, за да регулирате размера на шрифта: наляво за по-малък, надясно за по-голям. Прегледът ще се обновява в реално време.\n\nСъвет: Изберете \"Стандартен\", за да възстановите по подразбиране.",
|
||||
"botGreat": "Радваме се, че ви харесва! Тази функция за преглед ви позволява да видите как ще изглежда текстът в чата преди да приложите настройката.",
|
||||
"userGreat": "Страхотно!",
|
||||
"userQuestion": "Искам да увелича шрифта в чата. Как да го направя?"
|
||||
},
|
||||
"standard": "Стандартен",
|
||||
"text": "Забележка: Тази настройка влияе само на размера на шрифта в съобщенията",
|
||||
"title": "Размер на шрифта"
|
||||
},
|
||||
"general": {
|
||||
"group": "Общи"
|
||||
},
|
||||
"help": "Помощ",
|
||||
"info": {
|
||||
"group": "Информация"
|
||||
},
|
||||
"locale": {
|
||||
"auto": {
|
||||
"description": "Следване на езиковите настройки на системата",
|
||||
"title": "Следване на системата"
|
||||
},
|
||||
"title": "Езикови настройки"
|
||||
},
|
||||
"openai": "OpenAI настройки",
|
||||
"openaiSettings": {
|
||||
"apiKey": "API ключ",
|
||||
"apiKeyPlaceholder": "Моля, въведете вашия OpenAI API ключ",
|
||||
"checkApiKey": "Моля, проверете дали API ключът е правилен",
|
||||
"checkProxyAddress": "Неуспешна връзка със сървъра. Моля, проверете прокси адреса",
|
||||
"connectionSuccess": "Успешна връзка. API ключът и прокси адресът са правилни",
|
||||
"connectivityHint": "След тестване на свързаността ще се провери дали API ключът и прокси адресът са правилно въведени",
|
||||
"pleaseEnterApiKey": "Моля, въведете API ключ",
|
||||
"proxyAddress": "API прокси адрес",
|
||||
"proxyPlaceholder": "Трябва да съдържа http(s)://",
|
||||
"testConnectivity": "Тест на свързаността",
|
||||
"validationFailed": "Проверката не бе успешна",
|
||||
"validationSuccess": "Проверката е успешна"
|
||||
},
|
||||
"providerModels": {
|
||||
"config": {
|
||||
"aesGcm": "Вашият ключ и прокси адрес ще бъдат криптирани с <1>AES-GCM</1> алгоритъм",
|
||||
"checker": {
|
||||
"button": "Тест на връзката",
|
||||
"desc": "Проверете дали API ключът и прокси адресът са правилно въведени",
|
||||
"pass": "Проверката е успешна",
|
||||
"selectModel": "Изберете модел за тестване на връзката",
|
||||
"title": "Проверка на свързаността"
|
||||
}
|
||||
}
|
||||
},
|
||||
"providers": "AI доставчици",
|
||||
"providersDetail": {
|
||||
"tabs": {
|
||||
"configuration": "Конфигурация",
|
||||
"models": "Модели"
|
||||
}
|
||||
},
|
||||
"providersSearchPlaceholder": "Търсене на доставчици по ключова дума...",
|
||||
"support": "Имейл поддръжка",
|
||||
"themeMode": {
|
||||
"auto": "Следване на системата",
|
||||
"dark": "Тъмен режим",
|
||||
"light": "Светъл режим",
|
||||
"title": "Режим на тема"
|
||||
},
|
||||
"title": "Настройки",
|
||||
"update": {
|
||||
"check": {
|
||||
"applyAction": "Рестартиране сега",
|
||||
"applyDescription": "Необходимо е рестартиране, за да се приложи последната актуализация. Искате ли да рестартирате сега?",
|
||||
"applyError": "Неуспешно прилагане на актуализацията. Моля, опитайте отново по-късно.",
|
||||
"applyTitle": "Прилагане на актуализация",
|
||||
"applying": "Рестартиране за прилагане на актуализацията...",
|
||||
"checking": "Проверка за актуализации...",
|
||||
"downloaded": "Актуализацията е изтеглена",
|
||||
"downloading": "Открита е нова версия. Изтегляне на актуализацията...",
|
||||
"error": "Неуспешна проверка за актуализации. Моля, опитайте отново по-късно.",
|
||||
"none": "Вече използвате последната версия",
|
||||
"title": "Проверка за актуализации",
|
||||
"unavailable": "Текущата версия не поддържа проверка за актуализации. Моля, използвайте официалната версия."
|
||||
}
|
||||
},
|
||||
"version": "Текуща версия"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"localSystem": {
|
||||
"apiName": {
|
||||
"listLocalFiles": "Преглед на списъка с файлове",
|
||||
"moveLocalFiles": "Преместване на файлове",
|
||||
"readLocalFile": "Прочитане на съдържанието на файл",
|
||||
"renameLocalFile": "Преименуване",
|
||||
"searchLocalFiles": "Търсене на файлове",
|
||||
"writeLocalFile": "Записване на файл"
|
||||
},
|
||||
"title": "Локална система"
|
||||
},
|
||||
"mobileNotSupported": "Този инструмент не се поддържа на мобилни устройства. Моля, използвайте настолен компютър, за да видите подробностите.",
|
||||
"search": {
|
||||
"apiName": {
|
||||
"crawlMultiPages": "Прочитане на съдържание от няколко страници",
|
||||
"crawlSinglePage": "Прочитане на съдържание от страница",
|
||||
"search": "Търсене в страница"
|
||||
},
|
||||
"crawPages": {
|
||||
"crawling": "Обхождане...",
|
||||
"meta": {
|
||||
"crawler": "Обхождащ бот",
|
||||
"words": "Брой думи"
|
||||
}
|
||||
},
|
||||
"emptyResult": "Няма намерени резултати",
|
||||
"title": "Търсене в мрежата"
|
||||
},
|
||||
"title": "Извикване на инструменти",
|
||||
"unknown": "Неизвестен инструмент"
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"actions": {
|
||||
"confirmRemoveAll": "Всички теми ще бъдат изтрити и няма да могат да бъдат възстановени. Моля, действайте внимателно.",
|
||||
"confirmRemoveUnstarred": "Нестартираните теми ще бъдат изтрити и няма да могат да бъдат възстановени. Моля, действайте внимателно.",
|
||||
"favorite": "Добавяне в любими",
|
||||
"removeAll": "Изтрий всички теми",
|
||||
"removeUnstarred": "Изтрий нестартираните теми",
|
||||
"unfavorite": "Премахване от любими"
|
||||
},
|
||||
"confirmRemoveTopicItemAlert": "Темата ще бъде изтрита и няма да може да бъде възстановена. Моля, потвърдете действието си.",
|
||||
"defaultTitle": "По подразбиране тема",
|
||||
"empty": "Няма теми",
|
||||
"favorite": "Любими",
|
||||
"groupTitle": {
|
||||
"byTime": {
|
||||
"favorite": "Любими",
|
||||
"month": "Този месец",
|
||||
"today": "Днес",
|
||||
"week": "Тази седмица",
|
||||
"yesterday": "Вчера"
|
||||
}
|
||||
},
|
||||
"guide": {
|
||||
"desc": "Кликнете върху бутона вляво за изпращане, за да запазите текущия разговор като историческа тема и да започнете нов разговор",
|
||||
"title": "Списък с теми"
|
||||
},
|
||||
"loading": "Зареждане...",
|
||||
"newTopic": "Нова тема",
|
||||
"rename": {
|
||||
"action": "Преименуване",
|
||||
"done": "Готово",
|
||||
"emptyTitle": "Името на темата не може да бъде празно",
|
||||
"error": "Неуспешно преименуване",
|
||||
"placeholder": "Въведете име на тема",
|
||||
"success": "Успешно преименуване",
|
||||
"title": "Преименувай тема",
|
||||
"tooLong": "Името на темата е твърде дълго"
|
||||
},
|
||||
"search": {
|
||||
"emptyResult": "Няма намерени съвпадащи теми",
|
||||
"placeholder": "Търсене на теми...",
|
||||
"recentSearches": "Скорошни търсения",
|
||||
"title": "Търсене на теми"
|
||||
},
|
||||
"searchPlaceholder": "Търсене на тема...",
|
||||
"temp": "Временен",
|
||||
"title": "Тема"
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"guide": {
|
||||
"agents": {
|
||||
"replaceBtn": "Смени група",
|
||||
"title": "Препоръки за нови асистенти:"
|
||||
},
|
||||
"defaultMessage": "Аз съм вашият личен интелигентен асистент {{appName}}, с какво мога да ви помогна сега?<br />Ако искате по-професионален или персонализиран асистент, можете да кликнете <plus /> за да създадете персонализиран асистент",
|
||||
"defaultMessageWithoutCreate": "Аз съм вашият личен интелигентен асистент {{appName}}, с какво мога да ви помогна сега?",
|
||||
"qa": {
|
||||
"q01": "Какво е LobeHub?",
|
||||
"q02": "Какво е {{appName}}?",
|
||||
"q03": "Има ли {{appName}} поддръжка от общността?",
|
||||
"q04": "Какви функции поддържа {{appName}}?",
|
||||
"q05": "Как се инсталира и използва {{appName}}?",
|
||||
"q06": "Каква е ценовата политика на {{appName}}?",
|
||||
"q07": "Безплатен ли е {{appName}}?",
|
||||
"q08": "Има ли версия с облачна услуга?",
|
||||
"q09": "Поддържа ли локални езикови модели?",
|
||||
"q10": "Поддържа ли разпознаване и генериране на изображения?",
|
||||
"q11": "Поддържа ли синтез и разпознаване на реч?",
|
||||
"q12": "Поддържа ли система с плъгини?",
|
||||
"q13": "Има ли собствен пазар за получаване на GPT-та?",
|
||||
"q14": "Поддържа ли множество доставчици на AI услуги?",
|
||||
"q15": "Какво да направя, ако имам проблеми при използване?"
|
||||
},
|
||||
"questions": {
|
||||
"moreBtn": "Научете повече",
|
||||
"title": "Всички питат:"
|
||||
},
|
||||
"topics": {
|
||||
"title": "Последни теми:"
|
||||
},
|
||||
"welcome": {
|
||||
"afternoon": "Добър следобед",
|
||||
"morning": "Добро утро",
|
||||
"night": "Добър вечер",
|
||||
"noon": "Добър ден"
|
||||
}
|
||||
},
|
||||
"header": "Добре дошли",
|
||||
"pickAgent": "Или изберете от следните шаблони за асистенти",
|
||||
"skip": "Пропусни създаването",
|
||||
"slogan": {
|
||||
"desc1": "Активирайте мозъчния клъстер, вдъхновете мисловния пламък. Вашият интелигентен асистент винаги е с вас.",
|
||||
"desc2": "Създайте първия си асистент, нека започнем~",
|
||||
"title": "Дайте си по-умен мозък"
|
||||
},
|
||||
"title": "Добре дошли"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"login": {
|
||||
"button": "Bei {{appName}} anmelden",
|
||||
"cancel": "Abbrechen",
|
||||
"loginWithLobeHub": "Mit dem {{appName}}-Konto anmelden",
|
||||
"privacyPolicy": "Datenschutzrichtlinie",
|
||||
"processing": "Anmeldung läuft, bitte warten...",
|
||||
"securityNote": "Durch die Anmeldung stimmen Sie unseren",
|
||||
"selfHostedButton": "Eigenen Server verwenden",
|
||||
"selfHostedContinue": "Fortfahren",
|
||||
"selfHostedDescription": "Verbinde dich mit deinem selbst gehosteten LobeChat-Server.",
|
||||
"selfHostedHint": "Wir merken uns diese Serveradresse, bis du in den Einstellungen wieder zur offiziellen Instanz wechselst.",
|
||||
"selfHostedInvalid": "Bitte gib eine gültige HTTP- oder HTTPS-Adresse ein.",
|
||||
"selfHostedPlaceholder": "https://deine-lobechat-instanz.de",
|
||||
"selfHostedRequired": "Bitte gib die Serveradresse ein.",
|
||||
"selfHostedTitle": "Gib die Adresse des selbst gehosteten Servers ein",
|
||||
"subtitle": "Willkommen zurück! Bitte melden Sie sich an, um fortzufahren",
|
||||
"usePolicy": "Nutzungsbedingungen"
|
||||
},
|
||||
"logout": {
|
||||
"button": "Abmelden",
|
||||
"confirm": {
|
||||
"cancel": "Abbrechen",
|
||||
"message": "Möchten Sie sich wirklich abmelden?",
|
||||
"ok": "OK",
|
||||
"title": "Abmeldung bestätigen"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"verified": "Verifiziert"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"agentDefaultMessage": "Hallo, ich bin **{{name}}**. Du kannst sofort mit mir chatten oder unter [Assistenteneinstellungen]({{url}}) meine Informationen vervollständigen.",
|
||||
"agentDefaultMessageWithSystemRole": "Hallo, ich bin **{{name}}**, {{systemRole}}. Lass uns das Gespräch beginnen!",
|
||||
"agentDefaultMessageWithoutEdit": "Hallo, ich bin **{{name}}**. Lass uns das Gespräch beginnen!",
|
||||
"agentList": "Assistentenliste",
|
||||
"agentRoleEdit": {
|
||||
"cancel": "Abbrechen",
|
||||
"confirm": "Bestätigen",
|
||||
"edit": "Bearbeiten",
|
||||
"editButton": "Rollen-Einstellungen bearbeiten",
|
||||
"placeholder": "Bitte gib den Rollen-Prompt ein",
|
||||
"roleSetting": "Rollen-Einstellung",
|
||||
"title": "Rollen-Einstellung"
|
||||
},
|
||||
"confirmDelete": "Löschen bestätigen",
|
||||
"confirmRemoveSessionItemAlert": "Dieser Assistent wird gelöscht und kann nicht wiederhergestellt werden. Bitte bestätige deine Aktion.",
|
||||
"copyFailed": "Kopieren fehlgeschlagen",
|
||||
"defaultAgent": "Benutzerdefinierter Assistent",
|
||||
"defaultList": "Standardliste",
|
||||
"deleteMessageConfirm": "Möchten Sie diese Nachricht wirklich löschen?",
|
||||
"history": "Chatverlauf",
|
||||
"inbox": {
|
||||
"desc": "Aktiviere das Gehirnnetzwerk und entfalte kreative Gedanken. Dein intelligenter Assistent ist hier, um mit dir über alles zu sprechen.",
|
||||
"title": "Einfach plaudern"
|
||||
},
|
||||
"messageCopied": "Nachricht kopiert",
|
||||
"messageEdit": {
|
||||
"placeholder": "Bitte Nachrichtentext eingeben",
|
||||
"title": "Nachricht bearbeiten"
|
||||
},
|
||||
"newAgent": "Neuer Assistent",
|
||||
"newChat": "Neues Gespräch",
|
||||
"pin": "Anheften",
|
||||
"pinOff": "Anheften aufheben",
|
||||
"placeholder": "Gib deine Nachricht ein...",
|
||||
"reasoning": {
|
||||
"thinking": "Tiefes Nachdenken...",
|
||||
"thought": "Tief nachgedacht (Dauer: {{duration}} Sekunden)",
|
||||
"thoughtWithoutDuration": "Tief nachgedacht"
|
||||
},
|
||||
"regenerateFailed": "Erneutes Generieren fehlgeschlagen, bitte versuche es später erneut",
|
||||
"send": "Senden",
|
||||
"session": {
|
||||
"createFirst": "Erstelle deine erste Chat-Sitzung",
|
||||
"empty": "Keine Sitzungen vorhanden",
|
||||
"search": {
|
||||
"discoverAssistants": "Marktplatz-Assistenten",
|
||||
"emptyResult": "Keine passenden Assistenten gefunden",
|
||||
"myAssistants": "Meine Assistenten",
|
||||
"placeholder": "Finde deinen Lieblingsassistenten...",
|
||||
"recentSearches": "Kürzliche Suchanfragen",
|
||||
"title": "Suche"
|
||||
},
|
||||
"title": "Einfach plaudern"
|
||||
},
|
||||
"sessionGroup": {
|
||||
"config": "Gruppenverwaltung",
|
||||
"confirmRemoveGroupAlert": "Diese Gruppe wird gelöscht. Die darin enthaltenen Assistenten werden in die Standardliste verschoben. Bitte bestätigen Sie Ihre Aktion.",
|
||||
"createGroup": "Gruppe erstellen",
|
||||
"createSuccess": "Gruppe erfolgreich erstellt",
|
||||
"emptyGroup": "Keine Gruppen vorhanden",
|
||||
"inputPlaceholder": "Bitte Gruppennamen eingeben",
|
||||
"moveGroup": "In Gruppe verschieben",
|
||||
"moveSuccess": "Erfolgreich verschoben",
|
||||
"newGroup": "Neue Gruppe",
|
||||
"removeSuccess": "Erfolgreich gelöscht",
|
||||
"rename": "Umbenennen",
|
||||
"renameSuccess": "Erfolgreich umbenannt",
|
||||
"tooLong": "Der Gruppenname muss zwischen 1 und 20 Zeichen lang sein"
|
||||
},
|
||||
"setting": {
|
||||
"avatar": "Avatar",
|
||||
"description": "Beschreibung",
|
||||
"done": "Fertig",
|
||||
"name": "Name",
|
||||
"title": "Konversationseinstellungen"
|
||||
},
|
||||
"share": "Teilen",
|
||||
"stop": "Stopp",
|
||||
"thinking": "Denke nach..."
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"actions": {
|
||||
"add": "Hinzufügen",
|
||||
"cancel": "Abbrechen",
|
||||
"clear": "Löschen",
|
||||
"confirm": "Bestätigen",
|
||||
"continue": "Fortsetzen",
|
||||
"copy": "Kopieren",
|
||||
"delete": "Löschen",
|
||||
"edit": "Bearbeiten",
|
||||
"more": "Mehr",
|
||||
"notNow": "Nicht jetzt",
|
||||
"regenerate": "Erneut generieren",
|
||||
"retry": "Erneut versuchen",
|
||||
"save": "Speichern",
|
||||
"saveImage": "Bild speichern"
|
||||
},
|
||||
"and": "und",
|
||||
"assistant": {
|
||||
"fetchError": "Fehler beim Abrufen der Assistentenliste, bitte versuchen Sie es später erneut",
|
||||
"noData": "Keine Assistentendaten vorhanden",
|
||||
"noMatch": "Kein passender Assistent gefunden",
|
||||
"recentSearches": "Kürzliche Suchen",
|
||||
"search": "Assistent suchen...",
|
||||
"searchNoResult": "Kein passender Assistent gefunden",
|
||||
"searchPlaceholder": "Bitte Suchbegriff eingeben"
|
||||
},
|
||||
"defaultSession": "Benutzerdefinierter Assistent",
|
||||
"image": {
|
||||
"permissionDenied": "Zugriff auf das Album erforderlich, um das Bild zu speichern",
|
||||
"permissionRequest": "Bitte erlauben Sie den Zugriff auf das Album in den Einstellungen",
|
||||
"saveFailed": "Speichern fehlgeschlagen, bitte erneut versuchen",
|
||||
"saveSuccess": "Bild wurde im Album gespeichert"
|
||||
},
|
||||
"navigation": {
|
||||
"goToHomeScreen": "Zur Startseite zurückkehren"
|
||||
},
|
||||
"or": "oder",
|
||||
"search": {
|
||||
"placeholder": "Suchen"
|
||||
},
|
||||
"status": {
|
||||
"error": "Fehler",
|
||||
"info": "Information",
|
||||
"loading": "Wird geladen...",
|
||||
"networkRetryTip": "Bitte überprüfen Sie Ihre Netzwerkverbindung oder versuchen Sie es erneut",
|
||||
"success": "Erfolg",
|
||||
"warning": "Warnung"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"Highlighter": {
|
||||
"cancel": "Abbrechen",
|
||||
"selectLanguage": "Sprache auswählen"
|
||||
},
|
||||
"ModelSwitchPanel": {
|
||||
"chooseModel": "Modell auswählen",
|
||||
"emptyModel": "Keine aktivierten Modelle, bitte aktivieren Sie welche in den Einstellungen",
|
||||
"emptyProvider": "Keine aktivierten Anbieter, bitte aktivieren Sie welche in den Einstellungen",
|
||||
"goToSettings": "Zu den Einstellungen",
|
||||
"provider": "Anbieter",
|
||||
"title": "Modell"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"assistant": {
|
||||
"detail": {
|
||||
"addAndChat": "Assistent hinzufügen und chatten",
|
||||
"addFailed": "Assistent hinzufügen fehlgeschlagen",
|
||||
"addFailedMessage": "Das Hinzufügen des Assistenten ist fehlgeschlagen, bitte versuchen Sie es später erneut",
|
||||
"assistantSettings": "Assistenteneinstellungen",
|
||||
"loadFailed": "Fehler beim Laden der Assistentendetails, bitte versuchen Sie es später erneut",
|
||||
"notFoundIdentifier": "Assistentenkennung nicht gefunden",
|
||||
"share": "Teilen",
|
||||
"shareFailed": "Teilen fehlgeschlagen",
|
||||
"title": "Assistent Details"
|
||||
}
|
||||
},
|
||||
"category": {
|
||||
"assistant": {
|
||||
"academic": "Akademisch",
|
||||
"all": "Alle",
|
||||
"career": "Beruf",
|
||||
"copywriting": "Textgestaltung",
|
||||
"design": "Design",
|
||||
"education": "Bildung",
|
||||
"emotions": "Emotionen",
|
||||
"entertainment": "Unterhaltung",
|
||||
"games": "Spiele",
|
||||
"general": "Allgemein",
|
||||
"life": "Leben",
|
||||
"marketing": "Marketing",
|
||||
"office": "Büro",
|
||||
"programming": "Programmierung",
|
||||
"translation": "Übersetzung"
|
||||
}
|
||||
},
|
||||
"title": "Entdecken"
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"error": {
|
||||
"title": "Fehler"
|
||||
},
|
||||
"http": {
|
||||
"forbidden": "Zugriff verweigert",
|
||||
"networkError": "Netzwerkfehler",
|
||||
"notFound": "Nicht gefunden",
|
||||
"serverError": "Serverfehler",
|
||||
"timeout": "Anfragezeitüberschreitung",
|
||||
"unauthorized": "Nicht autorisiert"
|
||||
},
|
||||
"login": {
|
||||
"accessDenied": "Entschuldigung, die Anmeldung wurde abgelehnt. Bitte versuchen Sie es später erneut.",
|
||||
"cancelled": "Sie haben die Anmeldung abgebrochen.",
|
||||
"invalidGrant": "Entschuldigung, Ihre Sitzung ist abgelaufen. Bitte versuchen Sie es später erneut.",
|
||||
"invalidIdToken": "Entschuldigung, wir können Ihre Kontoinformationen derzeit nicht abrufen. Bitte versuchen Sie es später erneut.",
|
||||
"invalidRequest": "Entschuldigung, es gab ein Problem mit Ihrer Anmeldeanfrage. Bitte versuchen Sie es später erneut.",
|
||||
"invalidState": "Entschuldigung, die Anmeldeüberprüfung ist fehlgeschlagen. Bitte versuchen Sie es später erneut.",
|
||||
"missingCodeOrState": "Entschuldigung, erforderliche Anmeldeinformationen fehlen. Bitte versuchen Sie es später erneut.",
|
||||
"missingPkce": "Entschuldigung, Anmeldeprüfinformationen fehlen. Bitte versuchen Sie es später erneut.",
|
||||
"networkError": "Entschuldigung, während der Anmeldung gab es ein Netzwerkproblem. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.",
|
||||
"noIdToken": "Entschuldigung, Anmeldeinformationen konnten nicht abgerufen werden. Bitte versuchen Sie es später erneut.",
|
||||
"serverError": "Entschuldigung, der Anmeldedienst hat einen Fehler. Bitte versuchen Sie es später erneut.",
|
||||
"temporarilyUnavailable": "Entschuldigung, der Anmeldedienst ist vorübergehend nicht verfügbar. Bitte versuchen Sie es später erneut.",
|
||||
"tokenEndpointNonJson": "Entschuldigung, der Anmeldedienst hat eine unerwartete Antwort zurückgegeben. Bitte versuchen Sie es später erneut.",
|
||||
"tokenExchangeFailed": "Entschuldigung, es gab ein Problem bei der Anmeldung. Bitte versuchen Sie es später erneut.",
|
||||
"unknown": "Entschuldigung, die Anmeldung ist fehlgeschlagen. Bitte versuchen Sie es später erneut.",
|
||||
"unsupportedResponseType": "Entschuldigung, diese Anmeldemethode wird derzeit nicht unterstützt. Bitte versuchen Sie es später erneut."
|
||||
},
|
||||
"page": {
|
||||
"notFoundMessage": "Diese Seite existiert nicht.",
|
||||
"notFoundTitle": "Hoppla!"
|
||||
},
|
||||
"response": {
|
||||
"400": "Entschuldigung, der Server versteht Ihre Anfrage nicht. Bitte überprüfen Sie Ihre Anfrageparameter.",
|
||||
"401": "Entschuldigung, der Server hat Ihre Anfrage abgelehnt. Möglicherweise fehlen Ihnen die erforderlichen Berechtigungen oder eine gültige Authentifizierung.",
|
||||
"403": "Entschuldigung, der Server hat Ihre Anfrage abgelehnt. Sie haben keine Berechtigung, auf diesen Inhalt zuzugreifen.",
|
||||
"404": "Entschuldigung, die angeforderte Seite oder Ressource wurde nicht gefunden. Bitte überprüfen Sie die URL.",
|
||||
"405": "Entschuldigung, der Server unterstützt die verwendete Anfragemethode nicht. Bitte überprüfen Sie Ihre Methode.",
|
||||
"406": "Entschuldigung, der Server kann die Anfrage basierend auf den angeforderten Inhaltseigenschaften nicht erfüllen.",
|
||||
"407": "Entschuldigung, Sie müssen sich über einen Proxy authentifizieren, um fortzufahren.",
|
||||
"408": "Entschuldigung, der Server hat zu lange auf die Anfrage gewartet. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.",
|
||||
"409": "Entschuldigung, die Anfrage kann aufgrund eines Konflikts nicht verarbeitet werden. Möglicherweise ist der Ressourcenstatus nicht kompatibel.",
|
||||
"410": "Entschuldigung, die angeforderte Ressource wurde dauerhaft entfernt und ist nicht mehr verfügbar.",
|
||||
"411": "Entschuldigung, der Server kann Anfragen ohne gültige Inhaltslänge nicht verarbeiten.",
|
||||
"412": "Entschuldigung, Ihre Anfrage erfüllt nicht die vom Server geforderten Bedingungen und kann nicht abgeschlossen werden.",
|
||||
"413": "Entschuldigung, Ihre Anfrage ist zu umfangreich und kann vom Server nicht verarbeitet werden.",
|
||||
"414": "Entschuldigung, die URI Ihrer Anfrage ist zu lang und kann vom Server nicht verarbeitet werden.",
|
||||
"415": "Entschuldigung, der Server kann das angegebene Medienformat der Anfrage nicht verarbeiten.",
|
||||
"416": "Entschuldigung, der Server kann den angeforderten Bereich nicht erfüllen.",
|
||||
"417": "Entschuldigung, der Server kann Ihre Erwartungen nicht erfüllen.",
|
||||
"422": "Entschuldigung, die Anfrage ist syntaktisch korrekt, enthält jedoch semantische Fehler und kann nicht beantwortet werden.",
|
||||
"423": "Entschuldigung, die angeforderte Ressource ist gesperrt.",
|
||||
"424": "Entschuldigung, die aktuelle Anfrage kann aufgrund eines vorherigen Fehlers nicht abgeschlossen werden.",
|
||||
"426": "Entschuldigung, der Server verlangt ein Upgrade Ihres Clients auf eine höhere Protokollversion.",
|
||||
"428": "Entschuldigung, der Server verlangt eine Vorbedingung. Ihre Anfrage muss die korrekten Bedingungskopfzeilen enthalten.",
|
||||
"429": "Entschuldigung, Sie haben zu viele Anfragen gesendet. Der Server ist überlastet. Bitte versuchen Sie es später erneut.",
|
||||
"431": "Entschuldigung, die Kopfzeilen Ihrer Anfrage sind zu groß und können vom Server nicht verarbeitet werden.",
|
||||
"451": "Entschuldigung, aus rechtlichen Gründen verweigert der Server den Zugriff auf diese Ressource.",
|
||||
"499": "Entschuldigung, Ihre Anfrage wurde unerwartet unterbrochen, möglicherweise durch Abbruch oder instabile Netzwerkverbindung. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.",
|
||||
"500": "Entschuldigung, der Server hat ein Problem und kann Ihre Anfrage derzeit nicht bearbeiten. Bitte versuchen Sie es später erneut.",
|
||||
"501": "Entschuldigung, der Server weiß nicht, wie er diese Anfrage verarbeiten soll. Bitte überprüfen Sie Ihre Aktion.",
|
||||
"502": "Entschuldigung, der Server ist vorübergehend nicht erreichbar. Bitte versuchen Sie es später erneut.",
|
||||
"503": "Entschuldigung, der Server kann Ihre Anfrage derzeit nicht bearbeiten, möglicherweise wegen Überlastung oder Wartung. Bitte versuchen Sie es später erneut.",
|
||||
"504": "Entschuldigung, der Server hat keine Antwort vom Upstream-Server erhalten. Bitte versuchen Sie es später erneut.",
|
||||
"505": "Entschuldigung, der Server unterstützt die von Ihnen verwendete HTTP-Version nicht. Bitte aktualisieren Sie Ihren Client.",
|
||||
"506": "Entschuldigung, es gibt ein Serverkonfigurationsproblem. Bitte kontaktieren Sie den Administrator.",
|
||||
"507": "Entschuldigung, der Serverspeicher ist voll und kann Ihre Anfrage nicht verarbeiten. Bitte versuchen Sie es später erneut.",
|
||||
"509": "Entschuldigung, die Serverbandbreite ist erschöpft. Bitte versuchen Sie es später erneut.",
|
||||
"510": "Entschuldigung, der Server unterstützt die angeforderte Erweiterung nicht. Bitte kontaktieren Sie den Administrator.",
|
||||
"520": "Entschuldigung, der Server hat ein unerwartetes Problem festgestellt und kann Ihre Anfrage nicht abschließen. Wir arbeiten an einer Lösung. Bitte versuchen Sie es später erneut.",
|
||||
"522": "Entschuldigung, die Serververbindung ist zeitlich überschritten und konnte Ihre Anfrage nicht rechtzeitig beantworten. Möglicherweise ist das Netzwerk instabil oder der Server vorübergehend nicht erreichbar. Bitte versuchen Sie es später erneut.",
|
||||
"524": "Entschuldigung, der Server hat beim Warten auf eine Antwort eine Zeitüberschreitung festgestellt. Bitte versuchen Sie es später erneut.",
|
||||
"AgentRuntimeError": "Lobe AI Runtime Fehler. Bitte prüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
|
||||
"ConnectionCheckFailed": "Leere Antwort erhalten. Bitte prüfen Sie, ob die API-Proxy-Adresse mit '/v1' endet.",
|
||||
"CreateMessageError": "Entschuldigung, die Nachricht konnte nicht gesendet werden. Bitte kopieren Sie den Inhalt und senden Sie ihn erneut. Nach dem Aktualisieren der Seite wird diese Nachricht nicht gespeichert.",
|
||||
"ExceededContextWindow": "Die Anfrage überschreitet die vom Modell verarbeitbare Länge. Bitte reduzieren Sie den Inhalt und versuchen Sie es erneut.",
|
||||
"FreePlanLimit": "Sie sind derzeit ein kostenloser Nutzer und können diese Funktion nicht verwenden. Bitte wechseln Sie zu einem kostenpflichtigen Plan.",
|
||||
"InsufficientQuota": "Entschuldigung, das Kontingent für diesen Schlüssel ist erschöpft. Bitte prüfen Sie Ihr Guthaben oder erhöhen Sie das Kontingent und versuchen Sie es erneut.",
|
||||
"InvalidAccessCode": "Das Passwort ist falsch oder leer. Bitte geben Sie das korrekte Zugangspasswort ein oder fügen Sie einen benutzerdefinierten API-Schlüssel hinzu.",
|
||||
"InvalidBedrockCredentials": "Bedrock-Authentifizierung fehlgeschlagen. Bitte überprüfen Sie AccessKeyId/SecretAccessKey und versuchen Sie es erneut.",
|
||||
"InvalidClerkUser": "Entschuldigung, Sie sind derzeit nicht angemeldet. Bitte melden Sie sich an oder registrieren Sie sich, um fortzufahren.",
|
||||
"InvalidGithubToken": "Github PAT ist falsch oder leer. Bitte überprüfen Sie den Github PAT und versuchen Sie es erneut.",
|
||||
"InvalidOllamaArgs": "Ollama-Konfiguration ist fehlerhaft. Bitte überprüfen Sie die Konfiguration und versuchen Sie es erneut.",
|
||||
"InvalidProviderAPIKey": "{{provider}} API-Schlüssel ist falsch oder leer. Bitte überprüfen Sie den {{provider}} API-Schlüssel und versuchen Sie es erneut.",
|
||||
"InvalidVertexCredentials": "Vertex-Authentifizierung fehlgeschlagen. Bitte überprüfen Sie die Anmeldeinformationen und versuchen Sie es erneut.",
|
||||
"LocationNotSupportError": "Entschuldigung, Ihr Standort unterstützt diesen Modellservice nicht, möglicherweise aufgrund von regionalen Beschränkungen oder fehlender Freischaltung. Bitte prüfen Sie, ob Ihr Gebiet den Service unterstützt, oder wechseln Sie die Region und versuchen Sie es erneut.",
|
||||
"ModelNotFound": "Entschuldigung, das angeforderte Modell ist nicht verfügbar oder Sie haben keine Zugriffsrechte. Bitte wechseln Sie den API-Schlüssel oder passen Sie die Zugriffsrechte an und versuchen Sie es erneut.",
|
||||
"NoOpenAIAPIKey": "OpenAI API-Schlüssel ist falsch oder leer. Bitte fügen Sie einen benutzerdefinierten OpenAI API-Schlüssel hinzu.",
|
||||
"OllamaBizError": "Fehler bei der Anfrage an den Ollama-Dienst. Bitte prüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
|
||||
"OllamaServiceUnavailable": "Verbindung zum Ollama-Dienst fehlgeschlagen. Bitte prüfen Sie, ob Ollama ordnungsgemäß läuft und die CORS-Konfiguration korrekt ist.",
|
||||
"PermissionDenied": "Entschuldigung, Sie haben keine Berechtigung für diesen Dienst. Bitte prüfen Sie, ob Ihr Schlüssel Zugriffsrechte besitzt.",
|
||||
"PluginApiNotFound": "Entschuldigung, die API ist im Plugin-Manifest nicht vorhanden. Bitte prüfen Sie, ob Ihre Anfrage mit der Plugin-API übereinstimmt.",
|
||||
"PluginApiParamsError": "Entschuldigung, die Eingabeparameter der Plugin-Anfrage sind ungültig. Bitte prüfen Sie die Parameter und die API-Beschreibung.",
|
||||
"PluginFailToTransformArguments": "Entschuldigung, die Parameter des Plugins konnten nicht analysiert werden. Bitte generieren Sie die Assistenten-Nachricht neu oder verwenden Sie ein KI-Modell mit besserer Tools-Calling-Fähigkeit und versuchen Sie es erneut.",
|
||||
"PluginGatewayError": "Entschuldigung, es gab einen Fehler im Plugin-Gateway. Bitte prüfen Sie die Gateway-Konfiguration.",
|
||||
"PluginManifestInvalid": "Entschuldigung, das Plugin-Manifest ist ungültig. Bitte prüfen Sie das Format des Manifests.",
|
||||
"PluginManifestNotFound": "Entschuldigung, das Plugin-Manifest (manifest.json) wurde nicht gefunden. Bitte prüfen Sie die Adresse der Plugin-Beschreibungsdatei.",
|
||||
"PluginMarketIndexInvalid": "Entschuldigung, der Plugin-Index ist ungültig. Bitte prüfen Sie das Format der Indexdatei.",
|
||||
"PluginMarketIndexNotFound": "Entschuldigung, der Plugin-Index wurde nicht gefunden. Bitte prüfen Sie die Indexadresse.",
|
||||
"PluginMetaInvalid": "Entschuldigung, die Metadaten des Plugins sind ungültig. Bitte prüfen Sie das Format der Metadaten.",
|
||||
"PluginMetaNotFound": "Entschuldigung, das Plugin wurde im Index nicht gefunden. Bitte prüfen Sie die Konfiguration im Index.",
|
||||
"PluginOpenApiInitError": "Entschuldigung, die Initialisierung des OpenAPI-Clients ist fehlgeschlagen. Bitte prüfen Sie die OpenAPI-Konfiguration.",
|
||||
"PluginServerError": "Fehler bei der Plugin-Serveranfrage. Bitte prüfen Sie anhand der Fehlermeldung Ihre Plugin-Beschreibungsdatei, Konfiguration oder Serverimplementierung.",
|
||||
"PluginSettingsInvalid": "Das Plugin muss korrekt konfiguriert sein, um verwendet zu werden. Bitte prüfen Sie Ihre Einstellungen.",
|
||||
"ProviderBizError": "Fehler bei der Anfrage an den {{provider}}-Dienst. Bitte prüfen Sie die folgenden Informationen oder versuchen Sie es erneut.",
|
||||
"QuotaLimitReached": "Entschuldigung, das Token- oder Anfragekontingent für diesen Schlüssel ist erreicht. Bitte erhöhen Sie das Kontingent oder versuchen Sie es später erneut.",
|
||||
"StreamChunkError": "Fehler beim Parsen eines Nachrichtenblocks der Streaming-Anfrage. Bitte prüfen Sie, ob die API-Schnittstelle dem Standard entspricht, oder kontaktieren Sie Ihren API-Anbieter.",
|
||||
"SubscriptionKeyMismatch": "Entschuldigung, aufgrund eines Systemfehlers ist Ihr Abonnement vorübergehend deaktiviert. Bitte klicken Sie auf die Schaltfläche unten, um das Abonnement wiederherzustellen, oder kontaktieren Sie uns per E-Mail für Unterstützung.",
|
||||
"SubscriptionPlanLimit": "Ihr Abonnementguthaben ist aufgebraucht. Bitte wechseln Sie zu einem höheren Plan oder konfigurieren Sie ein benutzerdefiniertes Modell-API, um fortzufahren.",
|
||||
"SystemTimeNotMatchError": "Entschuldigung, Ihre Systemzeit stimmt nicht mit der Serverzeit überein. Bitte überprüfen Sie Ihre Systemzeit und versuchen Sie es erneut.",
|
||||
"UnknownChatFetchError": "Entschuldigung, ein unbekannter Fehler ist aufgetreten. Bitte prüfen Sie die folgenden Informationen oder versuchen Sie es erneut."
|
||||
},
|
||||
"sessionExpired": {
|
||||
"desc": "Zum Schutz Ihres Kontos melden Sie sich bitte erneut an.",
|
||||
"login": "Jetzt anmelden",
|
||||
"title": "Sitzung abgelaufen"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"ai21": {
|
||||
"description": "AI21 Labs entwickelt Basismodelle und KI-Systeme für Unternehmen, um den Einsatz generativer KI in der Produktion zu beschleunigen."
|
||||
},
|
||||
"ai302": {
|
||||
"description": "302.AI ist eine Pay-per-Use KI-Anwendungsplattform, die die umfassendsten KI-APIs und Online-KI-Anwendungen auf dem Markt anbietet."
|
||||
},
|
||||
"ai360": {
|
||||
"description": "360 AI ist eine von 360 eingeführte Plattform für KI-Modelle und -Dienste, die verschiedene fortschrittliche Modelle für die Verarbeitung natürlicher Sprache bietet, darunter 360GPT2 Pro, 360GPT Pro, 360GPT Turbo und 360GPT Turbo Responsibility 8K. Diese Modelle kombinieren umfangreiche Parameter und multimodale Fähigkeiten und werden breit eingesetzt in Textgenerierung, semantischem Verständnis, Dialogsystemen und Codegenerierung. Durch flexible Preisgestaltung erfüllt 360 AI vielfältige Nutzerbedürfnisse, unterstützt Entwickler bei der Integration und fördert Innovation und Entwicklung intelligenter Anwendungen."
|
||||
},
|
||||
"aihubmix": {
|
||||
"description": "AiHubMix bietet über eine einheitliche API-Schnittstelle Zugang zu verschiedenen KI-Modellen."
|
||||
},
|
||||
"anthropic": {
|
||||
"description": "Anthropic ist ein auf KI-Forschung und -Entwicklung spezialisiertes Unternehmen, das eine Reihe fortschrittlicher Sprachmodelle wie Claude 3.5 Sonnet, Claude 3 Sonnet, Claude 3 Opus und Claude 3 Haiku anbietet. Diese Modelle bieten eine ideale Balance zwischen Intelligenz, Geschwindigkeit und Kosten und eignen sich für vielfältige Anwendungen von Unternehmens-Workloads bis hin zu schnellen Reaktionsszenarien. Claude 3.5 Sonnet ist das neueste Modell und überzeugt in zahlreichen Bewertungen mit hervorragender Leistung bei gleichzeitig hoher Kosteneffizienz."
|
||||
},
|
||||
"azure": {
|
||||
"description": "Azure bietet eine Vielzahl fortschrittlicher KI-Modelle, darunter GPT-3.5 und die neueste GPT-4-Serie, unterstützt verschiedene Datentypen und komplexe Aufgaben und engagiert sich für sichere, zuverlässige und nachhaltige KI-Lösungen."
|
||||
},
|
||||
"azureai": {
|
||||
"description": "Azure bietet eine Vielzahl fortschrittlicher KI-Modelle, darunter GPT-3.5 und die neueste GPT-4-Serie, unterstützt verschiedene Datentypen und komplexe Aufgaben und engagiert sich für sichere, zuverlässige und nachhaltige KI-Lösungen."
|
||||
},
|
||||
"baichuan": {
|
||||
"description": "Baichuan Intelligent ist ein Unternehmen, das sich auf die Entwicklung großer KI-Modelle spezialisiert hat. Seine Modelle zeichnen sich durch hervorragende Leistungen bei chinesischen Aufgaben wie Wissensdatenbanken, Langtextverarbeitung und kreativer Generierung aus und übertreffen internationale Modelle. Baichuan verfügt zudem über branchenführende multimodale Fähigkeiten und erzielt exzellente Ergebnisse in zahlreichen anerkannten Bewertungen. Zu den Modellen gehören Baichuan 4, Baichuan 3 Turbo und Baichuan 3 Turbo 128k, die jeweils für unterschiedliche Anwendungsfälle optimiert sind und kosteneffiziente Lösungen bieten."
|
||||
},
|
||||
"bedrock": {
|
||||
"description": "Bedrock ist ein von Amazon AWS angebotener Dienst, der sich auf fortschrittliche KI-Sprach- und Visuelle Modelle für Unternehmen spezialisiert hat. Die Modellfamilie umfasst Anthropic's Claude-Serie, Meta's Llama 3.1-Serie und weitere, die von leichtgewichtigen bis zu leistungsstarken Optionen reichen und Aufgaben wie Textgenerierung, Dialog und Bildverarbeitung unterstützen – geeignet für Unternehmen jeder Größe und Anforderung."
|
||||
},
|
||||
"cloudflare": {
|
||||
"description": "Ausführung von serverlosen, GPU-betriebenen Machine-Learning-Modellen im globalen Netzwerk von Cloudflare."
|
||||
},
|
||||
"cohere": {
|
||||
"description": "Cohere bietet modernste mehrsprachige Modelle, fortschrittliche Suchfunktionen und einen auf Unternehmen zugeschnittenen KI-Arbeitsbereich – alles integriert in einer sicheren Plattform."
|
||||
},
|
||||
"deepseek": {
|
||||
"description": "DeepSeek ist ein Unternehmen, das sich auf KI-Technologieforschung und -anwendung spezialisiert hat. Das neueste Modell DeepSeek-V3 übertrifft in mehreren Bewertungen Open-Source-Modelle wie Qwen2.5-72B und Llama-3.1-405B und erreicht eine Leistung, die führenden Closed-Source-Modellen wie GPT-4o und Claude-3.5-Sonnet entspricht."
|
||||
},
|
||||
"fal": {
|
||||
"description": "Eine generative Medienplattform für Entwickler."
|
||||
},
|
||||
"fireworksai": {
|
||||
"description": "Fireworks AI ist ein führender Anbieter fortschrittlicher Sprachmodelle, spezialisiert auf Funktionsaufrufe und multimodale Verarbeitung. Das neueste Modell Firefunction V2 basiert auf Llama-3 und ist für Funktionsaufrufe, Dialoge und Befolgung von Anweisungen optimiert. Das visuelle Sprachmodell FireLLaVA-13B unterstützt gemischte Bild- und Texteingaben. Weitere bemerkenswerte Modelle sind die Llama- und Mixtral-Serien, die effiziente mehrsprachige Anweisungsbefolgung und Generierung bieten."
|
||||
},
|
||||
"giteeai": {
|
||||
"description": "Gitee AI bietet eine Serverless-API, die Entwicklern sofort einsatzbereite große Modell-Inferenzdienste bereitstellt."
|
||||
},
|
||||
"github": {
|
||||
"description": "Mit GitHub-Modellen können Entwickler zu KI-Ingenieuren werden und mit branchenführenden KI-Modellen bauen."
|
||||
},
|
||||
"google": {
|
||||
"description": "Die Gemini-Serie von Google ist das fortschrittlichste und vielseitigste KI-Modell von Google DeepMind, speziell für multimodale Anwendungen entwickelt. Es unterstützt nahtloses Verständnis und Verarbeitung von Text, Code, Bildern, Audio und Video. Geeignet für Umgebungen von Rechenzentren bis zu mobilen Geräten, steigert es Effizienz und Anwendungsvielfalt von KI-Modellen erheblich."
|
||||
},
|
||||
"groq": {
|
||||
"description": "Der LPU-Inferenzmotor von Groq erzielt herausragende Ergebnisse in den neuesten unabhängigen Benchmarks für große Sprachmodelle (LLM) und definiert mit seiner beeindruckenden Geschwindigkeit und Effizienz neue Standards für KI-Lösungen. Groq steht für sofortige Inferenzgeschwindigkeit und zeigt in Cloud-basierten Deployments starke Leistung."
|
||||
},
|
||||
"higress": {
|
||||
"description": "Higress ist ein cloud-nativer API-Gateway, das intern bei Alibaba entwickelt wurde, um Probleme mit Tengine Reload bei Langzeitverbindungen sowie unzureichende Lastverteilung bei gRPC/Dubbo zu lösen."
|
||||
},
|
||||
"huggingface": {
|
||||
"description": "Die HuggingFace Inference API bietet eine schnelle und kostenlose Möglichkeit, Tausende von Modellen für verschiedenste Aufgaben zu erkunden. Egal, ob Sie Prototypen für neue Anwendungen erstellen oder maschinelles Lernen ausprobieren – diese API ermöglicht sofortigen Zugriff auf leistungsstarke Modelle aus vielen Bereichen."
|
||||
},
|
||||
"hunyuan": {
|
||||
"description": "Ein von Tencent entwickeltes großes Sprachmodell mit starker chinesischer Kreativitätsfähigkeit, logischem Denken in komplexen Kontexten und zuverlässiger Aufgabenausführung."
|
||||
},
|
||||
"infiniai": {
|
||||
"description": "Bietet Anwendungsentwicklern leistungsstarke, benutzerfreundliche und sichere große Modell-Dienste, die den gesamten Prozess von der Modellentwicklung bis zur serviceorientierten Bereitstellung abdecken."
|
||||
},
|
||||
"internlm": {
|
||||
"description": "Eine Open-Source-Organisation, die sich der Forschung an großen Modellen und der Entwicklung von Toolchains widmet. Sie stellt allen KI-Entwicklern eine effiziente und benutzerfreundliche Open-Source-Plattform zur Verfügung, um modernste große Modelle und Algorithmustechnologien zugänglich zu machen."
|
||||
},
|
||||
"jina": {
|
||||
"description": "Jina AI wurde 2020 gegründet und ist ein führendes Unternehmen im Bereich Such-KI. Unsere Suchplattform umfasst Vektormodelle, Re-Ranker und kleine Sprachmodelle, die Unternehmen helfen, zuverlässige und hochwertige generative KI- und multimodale Suchanwendungen zu entwickeln."
|
||||
},
|
||||
"lmstudio": {
|
||||
"description": "LM Studio ist eine Desktop-Anwendung zum Entwickeln und Experimentieren mit großen Sprachmodellen (LLMs) auf Ihrem eigenen Computer."
|
||||
},
|
||||
"minimax": {
|
||||
"description": "MiniMax ist ein 2021 gegründetes Unternehmen für allgemeine KI-Technologie, das sich der gemeinsamen Schaffung von Intelligenz mit Nutzern widmet. MiniMax hat multimodale allgemeine große Modelle eigenständig entwickelt, darunter ein Billionen-Parameter MoE-Textmodell, Sprachmodelle und Bildmodelle, und bietet Anwendungen wie Conch AI an."
|
||||
},
|
||||
"mistral": {
|
||||
"description": "Mistral bietet fortschrittliche allgemeine, professionelle und forschungsorientierte Modelle, die breit in komplexer Argumentation, mehrsprachigen Aufgaben und Codegenerierung eingesetzt werden. Über Funktionsaufruf-Schnittstellen können Nutzer benutzerdefinierte Funktionen integrieren und spezifische Anwendungen realisieren."
|
||||
},
|
||||
"modelscope": {
|
||||
"description": "ModelScope ist eine von Alibaba Cloud eingeführte Plattform für Modell-als-Service, die eine Vielzahl von KI-Modellen und Inferenzdiensten bereitstellt."
|
||||
},
|
||||
"moonshot": {
|
||||
"description": "Moonshot ist eine Open-Source-Plattform der Beijing Moon's Dark Side Technology Co., Ltd., die verschiedene Modelle für die Verarbeitung natürlicher Sprache anbietet. Die Anwendungsbereiche sind vielfältig, darunter Inhaltskreation, akademische Forschung, intelligente Empfehlungen und medizinische Diagnostik, mit Unterstützung für Langtextverarbeitung und komplexe Generierungsaufgaben."
|
||||
},
|
||||
"novita": {
|
||||
"description": "Novita AI ist eine Plattform, die APIs für verschiedene große Sprachmodelle und KI-Bildgenerierung anbietet – flexibel, zuverlässig und kosteneffizient. Sie unterstützt neueste Open-Source-Modelle wie Llama3 und Mistral und bietet umfassende, benutzerfreundliche und automatisch skalierende API-Lösungen für die Entwicklung generativer KI-Anwendungen, ideal für schnell wachsende KI-Startups."
|
||||
},
|
||||
"nvidia": {
|
||||
"description": "NVIDIA NIM™ bietet Container für selbstverwaltete GPU-beschleunigte Inferenz-Mikrodienste und unterstützt die Bereitstellung vortrainierter und kundenspezifischer KI-Modelle in der Cloud, Rechenzentren, auf RTX™ AI-PCs und Workstations."
|
||||
},
|
||||
"ollama": {
|
||||
"description": "Ollama bietet Modelle, die ein breites Spektrum abdecken, darunter Codegenerierung, mathematische Berechnungen, mehrsprachige Verarbeitung und Dialoginteraktion, und unterstützt vielfältige Anforderungen an Unternehmens- und lokale Bereitstellungen."
|
||||
},
|
||||
"openai": {
|
||||
"description": "OpenAI ist eine weltweit führende Forschungseinrichtung im Bereich künstliche Intelligenz. Ihre Modelle wie die GPT-Serie treiben die Spitzenforschung in der Verarbeitung natürlicher Sprache voran. OpenAI engagiert sich dafür, durch innovative und effiziente KI-Lösungen verschiedene Branchen zu transformieren. Ihre Produkte zeichnen sich durch herausragende Leistung und Wirtschaftlichkeit aus und werden breit in Forschung, Wirtschaft und Innovation eingesetzt."
|
||||
},
|
||||
"openrouter": {
|
||||
"description": "OpenRouter ist eine Plattform, die Schnittstellen zu verschiedenen fortschrittlichen großen Modellen bietet, darunter OpenAI, Anthropic, LLaMA und weitere, und eignet sich für vielfältige Entwicklungs- und Anwendungsbedürfnisse. Nutzer können je nach Bedarf das optimale Modell und Preismodell wählen, um das KI-Erlebnis zu verbessern."
|
||||
},
|
||||
"perplexity": {
|
||||
"description": "Perplexity ist ein führender Anbieter von dialoggenerierenden Modellen und bietet verschiedene fortschrittliche Llama 3.1-Modelle, die sowohl online als auch offline eingesetzt werden können, besonders geeignet für komplexe Aufgaben der Verarbeitung natürlicher Sprache."
|
||||
},
|
||||
"ppio": {
|
||||
"description": "PPIO bietet stabile und kosteneffiziente Open-Source-Modell-API-Dienste und unterstützt branchenführende große Modelle wie die gesamte DeepSeek-Serie, Llama und Qwen."
|
||||
},
|
||||
"qiniu": {
|
||||
"description": "Qiniu ist ein etablierter Cloud-Service-Anbieter, der kosteneffiziente und stabile Echtzeit- und Batch-KI-Inferenzdienste anbietet, die einfach zu nutzen sind."
|
||||
},
|
||||
"qwen": {
|
||||
"description": "Tongyi Qianwen ist ein von Alibaba Cloud eigenständig entwickeltes großskaliges Sprachmodell mit starker Fähigkeit zum Verstehen und Generieren natürlicher Sprache. Es kann Fragen beantworten, Texte erstellen, Meinungen ausdrücken und Code schreiben und ist in vielen Bereichen einsetzbar."
|
||||
},
|
||||
"sambanova": {
|
||||
"description": "SambaNova Cloud ermöglicht Entwicklern den einfachen Zugriff auf die besten Open-Source-Modelle und bietet die schnellste Inferenzgeschwindigkeit."
|
||||
},
|
||||
"search1api": {
|
||||
"description": "Search1API bietet Zugriff auf DeepSeek-Modelle, die bei Bedarf selbstständig online geschaltet werden können, einschließlich Standard- und Schnellversionen, mit Unterstützung für Modelle unterschiedlicher Parametergrößen."
|
||||
},
|
||||
"sensenova": {
|
||||
"description": "SenseNova bietet auf der starken Infrastruktur von SenseTime basierende effiziente und benutzerfreundliche Full-Stack-Dienste für große Modelle."
|
||||
},
|
||||
"siliconcloud": {
|
||||
"description": "SiliconCloud ist ein kosteneffizienter GenAI-Cloud-Service, der auf hervorragenden Open-Source-Basismodellen basiert."
|
||||
},
|
||||
"spark": {
|
||||
"description": "Das Spark-Großmodell von iFLYTEK bietet leistungsstarke KI-Fähigkeiten in mehreren Bereichen und Sprachen und nutzt fortschrittliche Technologien der Verarbeitung natürlicher Sprache, um innovative Anwendungen in intelligenten Geräten, intelligenter Medizin, intelligentem Finanzwesen und weiteren vertikalen Szenarien zu ermöglichen."
|
||||
},
|
||||
"stepfun": {
|
||||
"description": "Das StepFun-Großmodell verfügt über branchenführende multimodale und komplexe Argumentationsfähigkeiten, unterstützt das Verständnis sehr langer Texte und bietet eine leistungsstarke selbststeuernde Suchmaschinenfunktion."
|
||||
},
|
||||
"taichu": {
|
||||
"description": "Das neue multimodale Großmodell, entwickelt vom Institut für Automatisierung der Chinesischen Akademie der Wissenschaften und dem Wuhan AI-Institut, unterstützt mehrstufige Fragen, Textkreation, Bildgenerierung, 3D-Verständnis, Signalanalyse und weitere umfassende Aufgaben. Es bietet stärkere kognitive, Verständnis- und Kreativitätsfähigkeiten und ermöglicht ein völlig neues interaktives Erlebnis."
|
||||
},
|
||||
"tencentcloud": {
|
||||
"description": "Die atomare Fähigkeit der Wissensmaschine (LLM Knowledge Engine Atomic Power) basiert auf der Wissensmaschine und bietet Unternehmen und Entwicklern eine flexible Möglichkeit, Modellanwendungen zu erstellen und zu entwickeln. Sie können mit verschiedenen atomaren Fähigkeiten Ihren eigenen Modellservice zusammenstellen und Dienste wie Dokumentenparsing, Aufteilung, Einbettung und mehrstufige Umschreibung nutzen, um maßgeschneiderte KI-Geschäftsanwendungen zu erstellen."
|
||||
},
|
||||
"togetherai": {
|
||||
"description": "Together AI setzt auf innovative KI-Modelle für führende Leistung und bietet umfangreiche Anpassungsmöglichkeiten, einschließlich schneller Skalierung und intuitiver Bereitstellungsprozesse, um die vielfältigen Anforderungen von Unternehmen zu erfüllen."
|
||||
},
|
||||
"upstage": {
|
||||
"description": "Upstage konzentriert sich auf die Entwicklung von KI-Modellen für verschiedene geschäftliche Anforderungen, darunter Solar LLM und Dokumenten-KI, mit dem Ziel, künstliche allgemeine Intelligenz (AGI) für die Arbeit zu realisieren. Über die Chat-API können einfache Dialogagenten erstellt werden, die Funktionsaufrufe, Übersetzungen, Einbettungen und domänenspezifische Anwendungen unterstützen."
|
||||
},
|
||||
"v0": {
|
||||
"description": "v0 ist ein Pair-Programming-Assistent, der anhand natürlicher Sprache Ihre Ideen in Code und Benutzeroberflächen (UI) für Ihr Projekt umsetzt."
|
||||
},
|
||||
"vertexai": {
|
||||
"description": "Die Gemini-Serie von Google ist das fortschrittlichste und vielseitigste KI-Modell von Google DeepMind, speziell für multimodale Anwendungen entwickelt. Es unterstützt nahtloses Verständnis und Verarbeitung von Text, Code, Bildern, Audio und Video. Geeignet für Umgebungen von Rechenzentren bis zu mobilen Geräten, steigert es Effizienz und Anwendungsvielfalt von KI-Modellen erheblich."
|
||||
},
|
||||
"vllm": {
|
||||
"description": "vLLM ist eine schnelle und benutzerfreundliche Bibliothek für die Inferenz und den Betrieb großer Sprachmodelle (LLM)."
|
||||
},
|
||||
"volcengine": {
|
||||
"description": "Die von ByteDance eingeführte Entwicklungsplattform für große Modellservices bietet funktionsreiche, sichere und preislich wettbewerbsfähige Modellaufrufdienste sowie End-to-End-Funktionen wie Modelldaten, Feinabstimmung, Inferenz und Bewertung, um die Entwicklung und Umsetzung Ihrer KI-Anwendungen umfassend zu unterstützen."
|
||||
},
|
||||
"wenxin": {
|
||||
"description": "Eine unternehmensgerechte All-in-One-Plattform für die Entwicklung großer Modelle und KI-native Anwendungen, die die umfassendsten und benutzerfreundlichsten Tools für die Entwicklung generativer KI-Modelle und Anwendungen bereitstellt."
|
||||
},
|
||||
"xai": {
|
||||
"description": "xAI ist ein Unternehmen, das sich dem Aufbau von künstlicher Intelligenz widmet, um die wissenschaftliche Entdeckung der Menschheit zu beschleunigen. Unsere Mission ist es, unser gemeinsames Verständnis des Universums voranzutreiben."
|
||||
},
|
||||
"xinference": {
|
||||
"description": "Xorbits Inference (Xinference) ist eine Open-Source-Plattform zur Vereinfachung des Betriebs und der Integration verschiedener KI-Modelle. Mit Xinference können Sie beliebige Open-Source-LLMs, Einbettungsmodelle und multimodale Modelle in Cloud- oder lokalen Umgebungen für Inferenz betreiben und leistungsstarke KI-Anwendungen erstellen."
|
||||
},
|
||||
"zeroone": {
|
||||
"description": "ZeroOne widmet sich der Förderung einer menschenzentrierten KI 2.0-Technologierevolution mit dem Ziel, durch große Sprachmodelle erheblichen wirtschaftlichen und gesellschaftlichen Wert zu schaffen und neue KI-Ökosysteme und Geschäftsmodelle zu etablieren."
|
||||
},
|
||||
"zhipu": {
|
||||
"description": "Zhipu AI bietet eine offene Plattform für multimodale und Sprachmodelle, die eine breite Palette von KI-Anwendungsszenarien unterstützt, darunter Textverarbeitung, Bildverständnis und Programmierhilfe."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
{
|
||||
"about": "Über LobeHub",
|
||||
"account": {
|
||||
"group": "Konto",
|
||||
"profile": {
|
||||
"email": "E-Mail",
|
||||
"name": "Benutzername",
|
||||
"status": "Kontostatus",
|
||||
"unverified": "Nicht verifiziert",
|
||||
"verified": "Verifiziert"
|
||||
},
|
||||
"signOut": {
|
||||
"confirm": "Möchten Sie sich wirklich abmelden?",
|
||||
"label": "Abmelden"
|
||||
},
|
||||
"switchAccount": {
|
||||
"action": "Konto wechseln",
|
||||
"confirm": "Möchten Sie das Konto wirklich wechseln? Sie werden abgemeldet und müssen sich erneut anmelden.",
|
||||
"error": "Kontowechsel fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"label": "Konto wechseln"
|
||||
},
|
||||
"title": "Kontoeinstellungen"
|
||||
},
|
||||
"advanced": {
|
||||
"group": "Erweitert"
|
||||
},
|
||||
"aiProviders": {
|
||||
"configuration": {
|
||||
"apiKey": {
|
||||
"description": "Bitte geben Sie den API-Schlüssel für {{name}} ein",
|
||||
"label": "API-Schlüssel",
|
||||
"placeholder": "Bitte geben Sie den API-Schlüssel für {{name}} ein"
|
||||
},
|
||||
"proxyUrl": {
|
||||
"desc": "Muss mit http(s):// beginnen",
|
||||
"invalid": "Bitte geben Sie eine gültige URL ein, die mit http:// oder https:// beginnt",
|
||||
"placeholder": "https://api.example.com/v1",
|
||||
"title": "API-Proxy-Adresse"
|
||||
},
|
||||
"saving": "Speichere Konfiguration...",
|
||||
"title": "Konfiguration",
|
||||
"updateFailedDesc": "Speichern fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"updateFailedTitle": "Speichern fehlgeschlagen"
|
||||
},
|
||||
"detail": {
|
||||
"loadFailed": "Laden der Anbieter-Konfiguration fehlgeschlagen",
|
||||
"loading": "Lade Anbieter-Konfiguration..."
|
||||
},
|
||||
"info": {
|
||||
"builtIn": "Integrierter Anbieter",
|
||||
"custom": "Benutzerdefinierter Anbieter"
|
||||
},
|
||||
"list": {
|
||||
"disabled": "Deaktiviert",
|
||||
"emptySearch": "Kein passender Anbieter gefunden",
|
||||
"enabled": "Aktiviert",
|
||||
"loadFailed": "Laden der Anbieterliste fehlgeschlagen"
|
||||
},
|
||||
"models": {
|
||||
"allLoaded": "Alle Modelle angezeigt",
|
||||
"copySuccess": "Erfolgreich kopiert",
|
||||
"disableFailed": "Deaktivieren des Modells fehlgeschlagen",
|
||||
"emptyNoSearch": "Keine Modelle gefunden. Versuche, vom Server zu laden.",
|
||||
"emptyWithSearch": "Keine Modelle entsprechen den Suchkriterien",
|
||||
"enableFailed": "Aktivieren des Modells fehlgeschlagen",
|
||||
"fetch": "Modelle abrufen",
|
||||
"fetchFailed": "Abrufen der Modelle fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"fetchSuccess": "Modellliste erfolgreich abgerufen!",
|
||||
"fetching": "Abrufen...",
|
||||
"loading": "Lade...",
|
||||
"loadingMore": "Lade weitere...",
|
||||
"modelsAvailable": "{{count}} verfügbare Modelle",
|
||||
"searchPlaceholder": "Modelle suchen...",
|
||||
"title": "Modelle"
|
||||
},
|
||||
"skeleton": {
|
||||
"disabled": "Deaktiviert",
|
||||
"enabled": "Aktiviert"
|
||||
}
|
||||
},
|
||||
"cache": {
|
||||
"clear": {
|
||||
"confirm": {
|
||||
"action": "Cache leeren",
|
||||
"description": "Dies entfernt lokal gespeicherte Cache-Daten. Beim nächsten Start müssen Inhalte neu geladen werden.",
|
||||
"title": "Cache wirklich leeren?"
|
||||
},
|
||||
"failure": "Cache konnte nicht geleert werden",
|
||||
"success": "Cache erfolgreich geleert"
|
||||
},
|
||||
"description": "Der Cache beschleunigt den Start. Wenn Speicherplatz benötigt wird, können Sie ihn hier leeren.",
|
||||
"title": "Cache leeren"
|
||||
},
|
||||
"changelog": "Änderungsprotokoll",
|
||||
"color": {
|
||||
"neutral": {
|
||||
"description": "Wählen Sie den neutralen Farbton der App",
|
||||
"title": "Neutrale Farbkonfiguration"
|
||||
},
|
||||
"preview": "Vorschau",
|
||||
"previewMessages": {
|
||||
"botGreat": "Schön, dass es dir gefällt! Mit dieser Vorschau kannst du das Thema vor dem Anwenden sehen.",
|
||||
"botHowToUse": "Nutze den Farbwähler unten, um Primär- und Neutralfarben anzupassen. Die Vorschau wird in Echtzeit aktualisiert.",
|
||||
"userGreat": "Super!",
|
||||
"userHowToUse": "Wie funktioniert die Themenvorschau?"
|
||||
},
|
||||
"primary": {
|
||||
"description": "Wählen Sie die Primärfarbe der App",
|
||||
"title": "Primärfarbkonfiguration"
|
||||
},
|
||||
"title": "Farbeinstellungen"
|
||||
},
|
||||
"developer": {
|
||||
"auth": {
|
||||
"accessToken": {
|
||||
"expire": {
|
||||
"success": "Zugriffstoken sofort abgelaufen",
|
||||
"title": "Zugriffstoken abgelaufen"
|
||||
},
|
||||
"invalidate": {
|
||||
"success": "Ungültiger Zugriffstoken gespeichert",
|
||||
"title": "Ungültiger Zugriffstoken"
|
||||
}
|
||||
},
|
||||
"clearAuthData": {
|
||||
"success": "Authentifizierungsdaten gelöscht",
|
||||
"title": "Authentifizierungsdaten löschen"
|
||||
},
|
||||
"error": {
|
||||
"noToken": "Kein verfügbarer Token"
|
||||
},
|
||||
"group": "Authentifizierung",
|
||||
"refreshToken": {
|
||||
"expire": {
|
||||
"success": "Aktualisierungstoken sofort abgelaufen",
|
||||
"title": "Aktualisierungstoken abgelaufen"
|
||||
},
|
||||
"invalidate": {
|
||||
"success": "Ungültiger Aktualisierungstoken gespeichert",
|
||||
"title": "Ungültiger Aktualisierungstoken"
|
||||
}
|
||||
}
|
||||
},
|
||||
"failurePrefix": "Aktion fehlgeschlagen: ",
|
||||
"mode": {
|
||||
"already": "Entwicklermodus ist bereits aktiviert",
|
||||
"enabled": "Entwicklermodus aktiviert",
|
||||
"remaining": "{{count}} weitere Klicks zum Aktivieren des Entwicklermodus",
|
||||
"title": "Entwicklermodus"
|
||||
},
|
||||
"selfHostedEntry": {
|
||||
"confirmAction": "Zur Konfigurationsseite",
|
||||
"confirmDescription": "Nach Aktivierung wird die Konfigurationsseite für die Selbst-Hosting-Instanz geöffnet. Möchten Sie sich abmelden und fortfahren?",
|
||||
"confirmResetAction": "Zurücksetzen und anmelden",
|
||||
"confirmResetDescription": "Das Deaktivieren des Selbst-Hosting-Modus setzt die Serveradresse auf die offizielle Instanz zurück und meldet Sie ab. Fortfahren?",
|
||||
"confirmResetTitle": "Selbst-Hosting-Modus deaktivieren",
|
||||
"confirmTitle": "Selbst-Hosting-Login aktivieren",
|
||||
"description": "Steuert, ob auf der Login-Seite ein Button für selbst gehostete Instanzen angezeigt wird",
|
||||
"title": "Selbst-Hosting-Modus aktivieren"
|
||||
},
|
||||
"server": {
|
||||
"confirmDescription": "Nach Änderung der Serveradresse werden Sie abgemeldet und müssen sich erneut anmelden. Fortfahren?",
|
||||
"confirmTitle": "Serverwechsel bestätigen",
|
||||
"current": "Aktuelle Adresse",
|
||||
"description": "Alle Anfragen verwenden diese Serveradresse. Leer lassen, um zur offiziellen Adresse zurückzukehren.",
|
||||
"group": "Serverkonfiguration",
|
||||
"hint": "Muss mit http:// oder https:// beginnen. Möglicherweise ist eine erneute Anmeldung erforderlich.",
|
||||
"invalid": "Bitte geben Sie eine gültige Adresse ein, die mit http:// oder https:// beginnt",
|
||||
"notice": "Ein benutzerdefinierter Server ersetzt die Standard-API-Adresse. Stellen Sie sicher, dass der Dienst verfügbar und mit dem LobeChat-API-Protokoll kompatibel ist. Ein Neustart oder erneutes Anmelden kann erforderlich sein.",
|
||||
"noticeTitle": "Vor dem Wechsel beachten",
|
||||
"placeholder": "https://your-server.example.com",
|
||||
"reset": "Zurücksetzen",
|
||||
"resetSuccess": "Offizielle Serveradresse wiederhergestellt",
|
||||
"save": "Speichern",
|
||||
"title": "Selbst gehostete Instanz",
|
||||
"updated": "Benutzerdefinierte Serveradresse aktualisiert"
|
||||
},
|
||||
"title": "Entwickleroptionen"
|
||||
},
|
||||
"feedback": {
|
||||
"email": {
|
||||
"body": {
|
||||
"description": "Problembeschreibung:",
|
||||
"footer": "Gesendet von meinem {{device}}",
|
||||
"frequency": "Häufigkeit des Auftretens:",
|
||||
"screenshots": "Relevante Screenshots:",
|
||||
"template": "Bitte beschreiben Sie das Problem so detailliert wie möglich, damit wir Ihnen besser helfen können."
|
||||
},
|
||||
"subject": "Feedback - LobeChat - {{version}}"
|
||||
},
|
||||
"error": "E-Mail-Client konnte nicht geöffnet werden. Bitte versuchen Sie es später erneut.",
|
||||
"saved": "Feedback wurde im Entwurfsordner gespeichert",
|
||||
"sent": "E-Mail wurde gesendet. Vielen Dank für Ihr Feedback!",
|
||||
"title": "Feedback",
|
||||
"unavailable": "E-Mail-Funktion nicht verfügbar. Bitte überprüfen Sie, ob auf Ihrem Gerät ein E-Mail-Konto eingerichtet ist oder die E-Mail-Funktion aktiviert wurde."
|
||||
},
|
||||
"fontSize": {
|
||||
"preview": {
|
||||
"botAnswer": "**Wie ändere ich die Schriftgröße?**\n\nVerwenden Sie den Schieberegler unten, um die Schriftgröße anzupassen: nach links für kleiner, nach rechts für größer. Die Vorschau wird in Echtzeit aktualisiert.\n\nTipp: Wählen Sie \"Standard\", um zur Standardgröße zurückzukehren.",
|
||||
"botGreat": "Schön, dass es dir gefällt! Mit dieser Vorschau kannst du sehen, wie der Text im Chat aussehen wird.",
|
||||
"userGreat": "Super!",
|
||||
"userQuestion": "Wie kann ich die Schriftgröße im Chat vergrößern?"
|
||||
},
|
||||
"standard": "Standard",
|
||||
"text": "Diese Einstellung beeinflusst nur die Schriftgröße der Nachrichteninhalte",
|
||||
"title": "Schriftgröße"
|
||||
},
|
||||
"general": {
|
||||
"group": "Allgemein"
|
||||
},
|
||||
"help": "Hilfe",
|
||||
"info": {
|
||||
"group": "Information"
|
||||
},
|
||||
"locale": {
|
||||
"auto": {
|
||||
"description": "Systemsprache verwenden",
|
||||
"title": "Systemsprache"
|
||||
},
|
||||
"title": "Spracheinstellungen"
|
||||
},
|
||||
"openai": "OpenAI-Einstellungen",
|
||||
"openaiSettings": {
|
||||
"apiKey": "API-Schlüssel",
|
||||
"apiKeyPlaceholder": "Bitte geben Sie Ihren OpenAI API-Schlüssel ein",
|
||||
"checkApiKey": "Bitte überprüfen Sie den API-Schlüssel",
|
||||
"checkProxyAddress": "Verbindung zum Server fehlgeschlagen. Bitte überprüfen Sie die Proxy-Adresse.",
|
||||
"connectionSuccess": "Verbindung erfolgreich. API-Schlüssel und Proxy-Adresse sind korrekt.",
|
||||
"connectivityHint": "Nach dem Verbindungstest wird überprüft, ob API-Schlüssel und Proxy-Adresse korrekt sind.",
|
||||
"pleaseEnterApiKey": "Bitte geben Sie den API-Schlüssel ein",
|
||||
"proxyAddress": "API-Proxy-Adresse",
|
||||
"proxyPlaceholder": "Muss mit http(s):// beginnen",
|
||||
"testConnectivity": "Verbindung testen",
|
||||
"validationFailed": "Validierung fehlgeschlagen",
|
||||
"validationSuccess": "Validierung erfolgreich"
|
||||
},
|
||||
"providerModels": {
|
||||
"config": {
|
||||
"aesGcm": "Ihr Schlüssel und die Proxy-Adresse werden mit dem <1>AES-GCM</1>-Algorithmus verschlüsselt",
|
||||
"checker": {
|
||||
"button": "Verbindung testen",
|
||||
"desc": "Testet, ob API-Schlüssel und Proxy-Adresse korrekt sind",
|
||||
"pass": "Überprüfung bestanden",
|
||||
"selectModel": "Modell für Verbindungstest auswählen",
|
||||
"title": "Verbindungsprüfung"
|
||||
}
|
||||
}
|
||||
},
|
||||
"providers": "KI-Anbieter",
|
||||
"providersDetail": {
|
||||
"tabs": {
|
||||
"configuration": "Konfiguration",
|
||||
"models": "Modelle"
|
||||
}
|
||||
},
|
||||
"providersSearchPlaceholder": "Anbieter nach Stichwort suchen...",
|
||||
"support": "E-Mail-Support",
|
||||
"themeMode": {
|
||||
"auto": "Systemeinstellung",
|
||||
"dark": "Dunkelmodus",
|
||||
"light": "Hellmodus",
|
||||
"title": "Designmodus"
|
||||
},
|
||||
"title": "Einstellungen",
|
||||
"update": {
|
||||
"check": {
|
||||
"applyAction": "Jetzt neu starten",
|
||||
"applyDescription": "Die App muss neu gestartet werden, um das Update anzuwenden. Jetzt neu starten?",
|
||||
"applyError": "Update konnte nicht angewendet werden. Bitte versuchen Sie es später erneut.",
|
||||
"applyTitle": "Update anwenden",
|
||||
"applying": "Neustart zur Anwendung des Updates...",
|
||||
"checking": "Suche nach Updates...",
|
||||
"downloaded": "Update heruntergeladen",
|
||||
"downloading": "Neue Version gefunden. Update wird heruntergeladen...",
|
||||
"error": "Updateprüfung fehlgeschlagen. Bitte versuchen Sie es später erneut.",
|
||||
"none": "Sie verwenden bereits die neueste Version",
|
||||
"title": "Nach Updates suchen",
|
||||
"unavailable": "Diese Funktion ist in dieser Version nicht verfügbar. Bitte verwenden Sie die offizielle Version."
|
||||
}
|
||||
},
|
||||
"version": "Aktuelle Version"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"localSystem": {
|
||||
"apiName": {
|
||||
"listLocalFiles": "Dateiliste anzeigen",
|
||||
"moveLocalFiles": "Dateien verschieben",
|
||||
"readLocalFile": "Dateiinhalt lesen",
|
||||
"renameLocalFile": "Datei umbenennen",
|
||||
"searchLocalFiles": "Dateien durchsuchen",
|
||||
"writeLocalFile": "In Datei schreiben"
|
||||
},
|
||||
"title": "Lokales System"
|
||||
},
|
||||
"mobileNotSupported": "Dieses Tool wird auf Mobilgeräten derzeit nicht unterstützt. Bitte verwenden Sie einen Desktop-Computer, um alle Inhalte anzuzeigen.",
|
||||
"search": {
|
||||
"apiName": {
|
||||
"crawlMultiPages": "Mehrere Seiteninhalte abrufen",
|
||||
"crawlSinglePage": "Seiteninhalt abrufen",
|
||||
"search": "Seite durchsuchen"
|
||||
},
|
||||
"crawPages": {
|
||||
"crawling": "Wird gecrawlt...",
|
||||
"meta": {
|
||||
"crawler": "Crawler",
|
||||
"words": "Wörter"
|
||||
}
|
||||
},
|
||||
"emptyResult": "Keine Suchergebnisse gefunden",
|
||||
"title": "Websuche"
|
||||
},
|
||||
"title": "Werkzeugaufruf",
|
||||
"unknown": "Unbekanntes Tool"
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"actions": {
|
||||
"confirmRemoveAll": "Alle Themen werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden. Bitte seien Sie vorsichtig.",
|
||||
"confirmRemoveUnstarred": "Alle nicht markierten Themen werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden. Bitte seien Sie vorsichtig.",
|
||||
"favorite": "Favorisieren",
|
||||
"removeAll": "Alle Themen löschen",
|
||||
"removeUnstarred": "Nicht markierte Themen löschen",
|
||||
"unfavorite": "Favorisierung aufheben"
|
||||
},
|
||||
"confirmRemoveTopicItemAlert": "Dieses Thema wird gelöscht und kann danach nicht wiederhergestellt werden. Bitte bestätigen Sie Ihre Aktion.",
|
||||
"defaultTitle": "Standardthema",
|
||||
"empty": "Keine Themen vorhanden",
|
||||
"favorite": "Favorisieren",
|
||||
"groupTitle": {
|
||||
"byTime": {
|
||||
"favorite": "Favoriten",
|
||||
"month": "Diesen Monat",
|
||||
"today": "Heute",
|
||||
"week": "Diese Woche",
|
||||
"yesterday": "Gestern"
|
||||
}
|
||||
},
|
||||
"guide": {
|
||||
"desc": "Klicken Sie auf die linke Schaltfläche zum Senden, um die aktuelle Unterhaltung als Verlaufsthema zu speichern und eine neue Unterhaltung zu starten",
|
||||
"title": "Themenliste"
|
||||
},
|
||||
"loading": "Wird geladen...",
|
||||
"newTopic": "Neues Thema",
|
||||
"rename": {
|
||||
"action": "Umbenennen",
|
||||
"done": "Fertig",
|
||||
"emptyTitle": "Thementitel darf nicht leer sein",
|
||||
"error": "Umbenennen fehlgeschlagen",
|
||||
"placeholder": "Thementitel eingeben",
|
||||
"success": "Erfolgreich umbenannt",
|
||||
"title": "Thema umbenennen",
|
||||
"tooLong": "Thementitel ist zu lang"
|
||||
},
|
||||
"search": {
|
||||
"emptyResult": "Keine passenden Themen gefunden",
|
||||
"placeholder": "Themen suchen...",
|
||||
"recentSearches": "Kürzliche Suchen",
|
||||
"title": "Themen suchen"
|
||||
},
|
||||
"searchPlaceholder": "Themen suchen...",
|
||||
"temp": "Temporär",
|
||||
"title": "Thema"
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"guide": {
|
||||
"agents": {
|
||||
"replaceBtn": "Ersetze eine Gruppe",
|
||||
"title": "Empfohlene neue Assistenten:"
|
||||
},
|
||||
"defaultMessage": "Ich bin Ihr persönlicher intelligenter Assistent {{appName}}. Wie kann ich Ihnen jetzt helfen?<br />Wenn Sie einen professionelleren oder maßgeschneiderten Assistenten wünschen, klicken Sie auf <plus />, um einen benutzerdefinierten Assistenten zu erstellen.",
|
||||
"defaultMessageWithoutCreate": "Ich bin Ihr persönlicher intelligenter Assistent {{appName}}. Wie kann ich Ihnen jetzt helfen?",
|
||||
"qa": {
|
||||
"q01": "Was ist LobeHub?",
|
||||
"q02": "Was ist {{appName}}?",
|
||||
"q03": "Gibt es eine Community-Unterstützung für {{appName}}?",
|
||||
"q04": "Welche Funktionen unterstützt {{appName}}?",
|
||||
"q05": "Wie wird {{appName}} bereitgestellt und verwendet?",
|
||||
"q06": "Wie gestaltet sich die Preisgestaltung von {{appName}}?",
|
||||
"q07": "Ist {{appName}} kostenlos?",
|
||||
"q08": "Gibt es eine Cloud-Service-Version?",
|
||||
"q09": "Wird ein lokales Sprachmodell unterstützt?",
|
||||
"q10": "Unterstützt es Bilderkennung und -erzeugung?",
|
||||
"q11": "Unterstützt es Sprachsynthese und Spracherkennung?",
|
||||
"q12": "Gibt es ein Pluginsystem?",
|
||||
"q13": "Gibt es einen eigenen Marktplatz für GPTs?",
|
||||
"q14": "Unterstützt es mehrere KI-Dienstanbieter?",
|
||||
"q15": "Was soll ich tun, wenn ich bei der Nutzung auf Probleme stoße?"
|
||||
},
|
||||
"questions": {
|
||||
"moreBtn": "Mehr erfahren",
|
||||
"title": "Häufig gestellte Fragen:"
|
||||
},
|
||||
"topics": {
|
||||
"title": "Aktuelle Themen:"
|
||||
},
|
||||
"welcome": {
|
||||
"afternoon": "Guten Nachmittag",
|
||||
"morning": "Guten Morgen",
|
||||
"night": "Guten Abend",
|
||||
"noon": "Guten Tag"
|
||||
}
|
||||
},
|
||||
"header": "Willkommen",
|
||||
"pickAgent": "Oder wählen Sie aus den folgenden Assistentenvorlagen",
|
||||
"skip": "Erstellung überspringen",
|
||||
"slogan": {
|
||||
"desc1": "Aktivieren Sie ein Gehirnnetzwerk und entfachen Sie Funken des Denkens. Ihr intelligenter Assistent ist immer für Sie da.",
|
||||
"desc2": "Erstellen Sie Ihren ersten Assistenten, lassen Sie uns anfangen~",
|
||||
"title": "Geben Sie sich ein klügeres Gehirn"
|
||||
},
|
||||
"title": "Willkommen"
|
||||
}
|
||||