285 lines
5.5 KiB
Markdown
285 lines
5.5 KiB
Markdown
# @coze-arch/i18n
|
|
|
|
A comprehensive internationalization (i18n) solution for the Coze platform, providing unified text localization and language management across all applications in the monorepo.
|
|
|
|
## Features
|
|
|
|
- **🌍 Multi-language Support**: Built-in support for English and Chinese (Simplified) with easy extensibility
|
|
- **🎯 Type-safe Translations**: Full TypeScript support with auto-generated types for translation keys
|
|
- **⚡ Multiple Integration Modes**: Support for both Eden.js projects and standalone applications
|
|
- **🔌 Plugin Architecture**: Extensible plugin system with language detection and ICU formatting
|
|
- **📱 React Integration**: Built-in React provider and context for seamless component integration
|
|
- **🛡️ Fallback Handling**: Robust fallback mechanisms for missing translations
|
|
- **🎨 Design System Integration**: Seamless integration with Coze Design components
|
|
|
|
## Get Started
|
|
|
|
### Installation
|
|
|
|
Add the package to your project:
|
|
|
|
```json
|
|
{
|
|
"dependencies": {
|
|
"@coze-arch/i18n": "workspace:*"
|
|
}
|
|
}
|
|
```
|
|
|
|
Then run:
|
|
|
|
```bash
|
|
rush update
|
|
```
|
|
|
|
### Basic Usage
|
|
|
|
#### For Eden.js Projects
|
|
|
|
Configure in your `edenx.config.ts`:
|
|
|
|
```typescript
|
|
import { locale } from '@coze-arch/i18n/locales';
|
|
|
|
export default {
|
|
intl: {
|
|
mode: 'offline',
|
|
clientOptions: {
|
|
namespace: 'i18n',
|
|
},
|
|
intlOptions: {
|
|
fallbackLng: 'en',
|
|
ns: 'i18n',
|
|
lng: 'en',
|
|
resources: locale,
|
|
},
|
|
},
|
|
};
|
|
```
|
|
|
|
Use in your components:
|
|
|
|
```typescript
|
|
import { I18n } from '@coze-arch/i18n';
|
|
|
|
function MyComponent() {
|
|
const title = I18n.t('common.title');
|
|
const greeting = I18n.t('common.greeting', { name: 'User' });
|
|
|
|
return <h1>{title}</h1>;
|
|
}
|
|
```
|
|
|
|
#### For Standalone Applications
|
|
|
|
Initialize before rendering:
|
|
|
|
```typescript
|
|
import { initI18nInstance, I18n } from '@coze-arch/i18n/raw';
|
|
import { createRoot } from 'react-dom/client';
|
|
|
|
initI18nInstance({
|
|
lng: 'en',
|
|
ns: 'i18n'
|
|
}).then(() => {
|
|
const root = createRoot(document.getElementById('root'));
|
|
root.render(<App />);
|
|
});
|
|
```
|
|
|
|
Use translations:
|
|
|
|
```typescript
|
|
import { I18n } from '@coze-arch/i18n/raw';
|
|
|
|
function App() {
|
|
const message = I18n.t('welcome.message');
|
|
return <div>{message}</div>;
|
|
}
|
|
```
|
|
|
|
#### React Provider Integration
|
|
|
|
```typescript
|
|
import { I18nProvider } from '@coze-arch/i18n/i18n-provider';
|
|
import { I18n } from '@coze-arch/i18n';
|
|
|
|
function App() {
|
|
return (
|
|
<I18nProvider i18n={I18n}>
|
|
<YourComponents />
|
|
</I18nProvider>
|
|
);
|
|
}
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### Core I18n Instance
|
|
|
|
#### `I18n.t(key, options?, fallback?)`
|
|
|
|
Translate a text key with optional interpolation and fallback.
|
|
|
|
```typescript
|
|
// Basic translation
|
|
I18n.t('common.save')
|
|
|
|
// With interpolation
|
|
I18n.t('user.greeting', { name: 'John' })
|
|
|
|
// With fallback
|
|
I18n.t('missing.key', {}, 'Default text')
|
|
```
|
|
|
|
#### `I18n.setLang(language, callback?)`
|
|
|
|
Change the current language.
|
|
|
|
```typescript
|
|
I18n.setLang('zh-CN', () => {
|
|
console.log('Language changed');
|
|
});
|
|
```
|
|
|
|
#### `I18n.setLangWithPromise(language)`
|
|
|
|
Change language with Promise-based API.
|
|
|
|
```typescript
|
|
await I18n.setLangWithPromise('en');
|
|
```
|
|
|
|
#### `I18n.language`
|
|
|
|
Get the current language.
|
|
|
|
```typescript
|
|
const currentLang = I18n.language; // 'en' | 'zh-CN'
|
|
```
|
|
|
|
#### `I18n.getLanguages()`
|
|
|
|
Get available languages.
|
|
|
|
```typescript
|
|
const languages = I18n.getLanguages(); // ['zh-CN', 'zh', 'en-US']
|
|
```
|
|
|
|
#### `I18n.dir()`
|
|
|
|
Get text direction for current language.
|
|
|
|
```typescript
|
|
const direction = I18n.dir(); // 'ltr' | 'rtl'
|
|
```
|
|
|
|
### Initialization Functions
|
|
|
|
#### `initI18nInstance(config?)`
|
|
|
|
Initialize i18n for standalone applications.
|
|
|
|
```typescript
|
|
interface I18nConfig {
|
|
lng: 'en' | 'zh-CN';
|
|
ns?: string;
|
|
// Additional i18next options
|
|
}
|
|
|
|
await initI18nInstance({
|
|
lng: 'en',
|
|
ns: 'i18n'
|
|
});
|
|
```
|
|
|
|
### React Components
|
|
|
|
#### `I18nProvider`
|
|
|
|
React context provider for i18n integration.
|
|
|
|
```typescript
|
|
interface I18nProviderProps {
|
|
children?: ReactNode;
|
|
i18n: Intl;
|
|
}
|
|
```
|
|
|
|
### Type Utilities
|
|
|
|
#### `I18nKeysNoOptionsType`
|
|
|
|
Type for translation keys that don't require interpolation options.
|
|
|
|
#### `I18nKeysHasOptionsType`
|
|
|
|
Type for translation keys that require interpolation options.
|
|
|
|
## Development
|
|
|
|
### Updating Translations
|
|
|
|
Pull the latest translations from the remote source:
|
|
|
|
```bash
|
|
rush pull-i18n
|
|
```
|
|
|
|
This will update the locale files in `src/resource/locales/`.
|
|
|
|
### Adding New Locale Keys
|
|
|
|
1. Add new keys to the remote translation system
|
|
2. Run `rush pull-i18n` to sync locally
|
|
3. The TypeScript types will be automatically updated
|
|
|
|
### Testing
|
|
|
|
Run the test suite:
|
|
|
|
```bash
|
|
rushx test
|
|
```
|
|
|
|
Run tests with coverage:
|
|
|
|
```bash
|
|
rushx test:cov
|
|
```
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
src/
|
|
├── index.ts # Main export for Eden.js projects
|
|
├── raw/ # Standalone application exports
|
|
├── i18n-provider/ # React context provider
|
|
├── intl/ # Core i18n implementation
|
|
├── resource/ # Locale data and resources
|
|
└── global.d.ts # Global type definitions
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
### Core Dependencies
|
|
|
|
- **i18next**: Core internationalization framework
|
|
- **i18next-browser-languagedetector**: Automatic language detection in browsers
|
|
- **i18next-icu**: ICU message formatting support
|
|
- **@coze-studio/studio-i18n-resource-adapter**: Internal resource adapter for locale data
|
|
- **@coze-arch/coze-design**: Design system integration
|
|
|
|
### Peer Dependencies
|
|
|
|
- **react**: React framework support
|
|
- **react-dom**: React DOM rendering
|
|
|
|
## License
|
|
|
|
Internal package - ByteDance Ltd.
|
|
|
|
---
|
|
|
|
For questions or support, please contact the Coze Architecture team.
|