# Localization Editor API

## 快速开始

### [核心功能 `l10n`](#l10n)

l10n提供了核心翻译功能以及icu功能，同时也提供的切换语言的功能。

我们会将切换后的目标语言存储于`localStorage`中，同时也会自动重启项目运行时，并在下次启动时读取`localStorage`配置以完成整个语言切换流程。

> ***因此我们希望用户在切换语言之前务必处理好数据持久化工作***

### 导入[`l10n`](#l10n)模块

localization-editor所提供的所有api都将从db://localization-editor/l10n进行具名导入

```typescript
import { l10n } from 'db://localization-editor/l10n'
```

### 使用翻译api

```typescript
// 任意component组件代码中

// l10n是localization的核心功能
import { l10n } from 'db://localization-editor/l10n'
import { _decorator, Label, Component } from 'cc';

@ccclass('SomeComponent')
class SomeComponent extends Component {
    // ......
    someMethod() {
        // 将返回this_is_an_apple所对应文案
        const text = l10n.t("this_is_an_apple")
    }
    // ......
}
```

### API详细说明

- 类:[`L10nManager`](#l10nmanager)

---

- 接口:[`ResourceList`](#resourcelist)

- 接口:[`ResourceBundle`](#resourcebundle)

- 接口:[`ResourceData`](#resourcedata)

- 接口:[`ResourceItem`](#resourceitem)

- 接口:[`FallbackLanguageObjectList`](#fallbacklanguageobjectlist)

- 接口:[`L10nOptions`](#l10noptions)

- 接口:[`StandardOption`](#standardoption)

---

- 枚举:[`L10nListenEvent`](#l10nlistenevent)

---

- 别名:[`L10nKey`](#别名)

- 别名:[`L10nValue`](#别名)

- 别名:[`TextInfoDirection`](#别名)

- 别名:[`FallbackLanguage`](#别名)

---

# `L10nManager`

导入示例：

```ts
import { L10nManager } from 'db://localization-editor/l10n'
```

描述：

通常我们不建议您自行使用或构造该类型。

而我们提供了[`l10n`](#l10n)作为全局单例以使用翻译功能。

---

## 索引

### 构造函数

- `L10nManager` **private**

---

### 全局变量

#### `l10n`

定义: `const l10n: L10nManager`

---

### 静态属性

#### `LOCAL_STORAGE_LANGUAGE_KEY`

定义: `static LOCAL_STORAGE_LANGUAGE_KEY: string`

描述: 当调用[`changeLanguage`](#changelanguage)切换游戏语言时，将使用`localStorage`
存储所切换的目标语言标记，并且使用[`LOCAL_STORAGE_LANGUAGE_KEY`](#localstoragelanguagekey)作为`localStorage`的key

备注：

| 默认值 | localization-editor/language |
|-----|------------------------------|
---

### 实例方法

#### `config`

定义: `config(options: L10nOptions): void`

描述: 用于配置l10n的某些设置，探索更多选项可以查看[`L10nOptions`](#l10noptions)

用例:

```ts
l10n.config({
    // 用于在默认语言没有找到相应翻译时，以该值进行补充显示
    fallbackLanguage: 'zh-Hans-CN',
    // 如果不喜欢LOCAL_STORAGE_LANGUAGE_KEY的默认值，可以在此修改，但是需要确保在changeLanguage之前
    localStorageLanguageKey: 'localization-editor/langauge'
})

```

---

#### `changeLanguage`

定义: `changeLanguage(language: Intl.BCP47LanguageTag): void`

描述: 用于动态切换语言，请查看[`BCP47 Language Tag`](https://www.techonthenet.com/js/language_tags.php)以获得更多信息

用例:

```ts
l10n.changeLanguage('zh-Hans-CN')
```

> ***注意: 在调用此方法后，会自动重启游戏，请务必做好数据持久化工作***

---

#### `t`

定义: `t(key: L10nKey, options?: StandardOption): L10nValue`

描述: 根据传入的L10nKey，返回当前语言数据中所对应的L10nValue，探索更多选项可以查看[`StandardOption`](#standardoption)

用例:

```ts
console.log(l10n.t('this_is_apple'))
// 这是一个苹果
```

> ***注意: 语言数据需要配合Localization Editor插件在编译后生成。***
>
> ***无法在静态初始化中使用l10n.t， 比如`static name = l10n.t('xxx_name')`***
>
> ***变量作为参数时无法扫描，比如`let name = 'this_is_apple'; l10n.t(name)`***

---

#### `exists`

定义: `exists(key: L10nKey): boolean`

描述: 返回是否存在key

用例:

```ts
console.log(l10n.exists('test_key'))
```

---

#### `currentLanguage`

定义: `get currentLanguage(): Intl.BCP47LanguageTag`

描述: 返回当前语言的[`BCP47 Language Tag`](https://www.techonthenet.com/js/language_tags.php)

用例:

```ts
console.log(l10n.currentLanguage)
// 'zh-Hans-CN'
```

---

#### `languages`

定义: `get languages(): readonly Intl.BCP47LanguageTag[]`

描述: 返回当前可用语言的[`BCP47 Language Tag`](https://www.techonthenet.com/js/language_tags.php)数组，可利用该方法作为切换语言下拉框的数据源

用例:

```ts
console.log(l10n.languages)
// ['zh-Hans-CN', 'en-US']
```

---

#### `direction`

定义: `direction(language?: Intl.BCP47LanguageTag): TextInfoDirection`

描述: 绝大多数语言都尊崇从左到右的阅读习惯，但某些语言却例外比如阿拉伯语，此方法可以得知所传入语言的[TextInfoDirection](#textinfodirection)

用例:

```ts
console.log(l10n.direction('ar'))
// 'rtl'
```

---

#### `on`

定义: `on(event: L10nListenEvent, callback: (...args: any[]) => void)`

描述: 用于注册[l10n](#l10n)的[L10nListenEvent](#l10nlistenevent)事件回调，比如`languageChanged`

用例:

```ts
l10n.on(L10nListenEvent.languageChanged, (...args: any[]) => {
    //在切换语言后的一些操作，某些数据可以放在这里持久化，之后便会重启整个游戏场景
})
```

---

#### `off`

定义: `off(event: L10nListenEvent, callback: (...args: any[]) => void)`

描述: 用于反注册[l10n](#l10n)的[L10nListenEvent](#L10nListenEvent)事件回调

> ***请务必使on与off成对出现，确保正确的销毁无用数据***

---

# 别名

| 别名                  | 原类型                                                                                                                                                       |
|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| `L10nKey`           | `string`                                                                                                                                                  |
| `L10nValue`         | `string`                                                                                                                                                  |
| `TextInfoDirection` | `'ltr' / 'rtl'`                                                                                                                                           |
| `FallbackLanguage`  | `string / readonly string[] / FallbackLanguageObjectList / ((language: Intl.BCP47LanguageTag) => string / readonly string[] / FallbackLanguageObjectList` |
---

# 接口

## `L10nOptions`

| 函数/变量名                    | 类型                                  | 可选  |
|---------------------------|-------------------------------------|-----|
| `fallbackLanguage`        | `false` / [`FallbackLanguage`](#别名) | 是   |
| `localStorageLanguageKey` | `string`                            | 是   |
| `beforeTranslate`         | `(key: L10nKey) => L10nValue`       | 是   |
| `afterTranslate`          | `(key: L10nKey) => L10nValue`       | 是   |
| `returnNull`              | `boolean`                           | 是   |
| `returnEmptyString`       | `boolean`                           | 是   |

---

## `ResourceList`

| 函数/变量名             | 类型                        | 可选  |
|--------------------|---------------------------|-----|
| `defaultLanguage`  | `Intl.BCP47LanguageTag`   | 是   |
| `fallbackLanguage` | `Intl.BCP47LanguageTag`   | 是   |
| `languages`        | `Intl.BCP47LanguageTag[]` | 否   |

## `ResourceBundle`

| 函数/变量名                              | 类型                              | 可选  |
|-------------------------------------|---------------------------------|-----|
| `[language: Intl.BCP47LanguageTag]` | [`ResourceData`](#resourcedata) | 否   |

---

## `ResourceData`

| 函数/变量名                | 类型                              | 可选  |
|-----------------------|---------------------------------|-----|
| `[namespace: string]` | [`ResourceItem`](#resourceitem) | 否   |

---

## `ResourceItem`

| 函数/变量名          | 类型    | 可选  |
|-----------------|-------|-----|
| `[key: string]` | `any` | 否   |

---

## `FallbackLanguageObjectList`

| 函数/变量名               | 类型                  | 可选  |
|----------------------|---------------------|-----|
| `[language: string]` | `readonly string[]` | 否   |

---

## `StandardOption`

| 函数/变量名             | 类型                        | 可选  |
|--------------------|---------------------------|-----|
| `count`            | `number`                  | 是   |
| `defaultValue`     | `L10nValue`               | 是   |
| `language`         | `Intl.BCP47LanguageTag`   | 是   |
| `fallbackLanguage` | [`FallbackLanguage`](#别名) | 是   |

---

# 枚举

## `L10nListenEvent`

| 函数/变量名            | 类型                |
|-------------------|-------------------|
| `languageChanged` | `languageChanged` |
| `onMissingKey`    | `missingKey`      |
