-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
238 additions
and
150 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,143 +1,166 @@ | ||
# Internacionalización | ||
|
||
La internacionalización es una función central muy importante de `Infernus`. Incluso si no la tienes en cuenta en el proceso de desarrollo de un script, necesitas conocer al menos la sección [internacionalización de jugadores](#player-internationalization), de lo contrario puedes encontrarte con situaciones comunes como códigos ilegibles. | ||
|
||
## VSCode plugin | ||
|
||
[infernus-starter](https://github.com/dockfries/infernus-starter) proporciona el archivo de recomendación de instalación del plugin `.vscode/ extensions.json`. Se recomienda encarecidamente que haga clic en instalar en el prompt en la esquina inferior derecha de `VSCode`, para que pueda ver fácilmente y de forma intuitiva los datos internacionales durante el desarrollo. | ||
|
||
`i18n-ally-custom-framework.yml` y `settings.json` El archivo de configuración relacionado con el plugin ha sido configurado para ti. | ||
|
||
## Ejemplo | ||
|
||
### Definir paquete de idiomas | ||
|
||
El paquete de idioma consiste en los datos del archivo `.json`. **la estructura de árbol se utiliza como `clave` de datos del paquete de idioma**. | ||
|
||
La cadena de datos definida puede contener `%s` como palabra clave para rellenar los datos. | ||
|
||
#### Paquete de idioma chino | ||
|
||
```json | ||
{ | ||
"server": { | ||
"running": "成功运行由 node.js 强力驱动的 omp 服务器", | ||
"connection": "连接信息: %s - %s : %s" | ||
} | ||
} | ||
``` | ||
|
||
#### Paquete en inglés | ||
|
||
```json | ||
{ | ||
"server": { | ||
"running": "Successfully running an omp server powered by node.js", | ||
"connection": "connection information: %s - %s : %s" | ||
} | ||
} | ||
``` | ||
|
||
### Instancia | ||
|
||
Obtener un ejemplo de internacionalización a través de `new I18n(«clave de región por defecto», «paquete de idioma»)`. | ||
|
||
Normalmente sólo necesitamos utilizar la función `$t`. | ||
|
||
La función `$t(«clave de datos del paquete de idioma», [arreglo de marcadores de posición], clave de región)` puede obtener el texto del paquete de idioma correspondiente. | ||
|
||
En lugar de pasar un arreglo de marcadores de posición, puede sustituirla por `null` o `undefined` o un arreglo vacía cuando la cadena no tenga un marcador de posición. | ||
|
||
No pasar el tercer parámetro significa obtener los datos de la configuración regional por defecto. | ||
|
||
```ts | ||
import { I18n } from "@infernus/core"; | ||
|
||
// Paquete de idiomas internacionalizado en json | ||
import zh_CN from "./locales/zh_CN.json"; | ||
import en_US from "./locales/en_US.json"; | ||
|
||
const locales = { | ||
zh_CN, | ||
en_US, | ||
}; | ||
|
||
export const { $t } = new I18n("en_US", locales); | ||
|
||
console.log($t("server.running")); | ||
console.log($t("server.connection", ["127.0.0.1", "8080", "123456"])); | ||
console.log($t("server.connection", ["127.0.0.1", "8080", "123456"], "zh_CN")); | ||
``` | ||
|
||
### Funciones prácticas | ||
|
||
La clase `I18n` también tiene varias prácticas **funciones estáticas** que puedes probar cuando te encuentres con conversiones entre internacionalizaciones. | ||
|
||
- encodeToBuf | ||
- Un arreglo de bytes utilizada para convertir una subcadena a un conjunto de caracteres especificado. | ||
- decodeFromBuf | ||
- Una cadena utilizada para convertir un arreglo de bytes a un conjunto de caracteres especificado. | ||
- getValidStr | ||
- Si intercepta una cadena válida en un arreglo de bytes, se encuentra el primer `0`, que se considera el final de la cadena. | ||
|
||
## Internacionalización del jugador | ||
|
||
Existen dos atributos en la instancia del jugador para controlar la internacionalización, a saber, `charset` y `locale`, que corresponden al conjunto de caracteres y a la región, respectivamente. Los valores por defecto son los siguientes: | ||
```ts | ||
class Player { | ||
charset = "ISO-8859-1"; | ||
locale = "en_US"; | ||
} | ||
``` | ||
|
||
Normalmente `$t` combina la región del jugador para obtener los datos del paquete de idioma correspondiente. | ||
|
||
```ts | ||
// Supongamos que tiene una instancia de jugador | ||
console.log( | ||
$t("server.incoming", ["127.0.0.1", "8080", "123456"], player.locale) | ||
); | ||
``` | ||
|
||
Si desea modificar el idioma o la configuración regional del jugador, debe modificar los atributos `charset` y `locale` del jugador. Asegúrese siempre de que el `charset` del jugador es correcto. Puedes utilizar la dirección `ip` para adivinar la zona del jugador, y dejar que el mismo introduzca una cadena concreta y comparar bytes para averiguar de qué juego de caracteres se trata. | ||
|
||
### Soportar todos los nombres | ||
|
||
::: tip | ||
Por defecto, el servidor del juego sólo permite letras, números y nombres de usuario subrayados para conectarse al juego. | ||
::: | ||
|
||
Debido a que `omp` proporciona algunos nuevos `api`, puede deshabilitar / habilitar ciertos caracteres (bytes decimales 0-255) para los nombres de usuario para conectarse al servidor. | ||
|
||
El método `GameMode.supportAllNickname()` **hace uso de la nueva api para conectar todos los nombres de usuario internacionales, incluyendo caracteres como los chinos, al juego.** | ||
|
||
```ts | ||
import { GameMode } from "@infernus/core"; | ||
|
||
GameMode.onInit(({ next }) => { | ||
GameMode.supportAllNickname(); | ||
return next(); | ||
}); | ||
``` | ||
|
||
## Principio | ||
|
||
:::warning | ||
El intercambio bidireccional de datos de conjunto de caracteres es normal si se parte de la premisa de que el conjunto de caracteres del jugador es correcto. | ||
|
||
Si se establece un conjunto de caracteres incorrecto, tanto el servidor como el cliente recibirán código confuso. | ||
::: | ||
|
||
En `Infernus` se utiliza `iconv-lite` para convertir el conjunto de caracteres, se utiliza `polyfill.amx` para interceptar la parte `gamemode` de la llamada de retorno que se devuelve como un arreglo de bytes decimales. | ||
|
||
El servidor convierte el conjunto de caracteres a las funciones del lado del cliente como `SendClientMessage`, `SendClientMessageToAll`, `ShowPlayerDialog` y `CreateDynamic3DTextLabel`, es decir, los datos `utf8` se convierten en los datos del conjunto de caracteres del jugador para garantizar que el jugador pueda mostrar los datos con normalidad. | ||
|
||
La conversión del juego de caracteres del cliente al servidor, como `OnText`, `OnPlayerCommandText`, `OnDialogResponse`, se ha realizado para garantizar que el intercambio de datos entre el servidor y el cliente sea correcto. | ||
|
||
::: tip | ||
Aunque el conjunto de caracteres se haya convertido, los caracteres de `utf8` que no estén incluidos en el conjunto de caracteres del jugador seguirán mostrándose en forma de códigos ilegibles, como `?`, que está limitado por el código subyacente del juego `sa` primitivo. Por ejemplo, sólo el conjunto de caracteres de las fuentes occidentales `emoji` o los caracteres chinos serán ilegibles cuando los reciba `emoji`. | ||
::: | ||
|
||
Para `Infernus`, la capa subyacente de `Infernus` siempre intercambia datos en el formato de `utf8`, porque la implementación de los dos se basa en el algoritmo existente de mapeo de archivos, que es similar al concepto de imagen sprite en el front-end, en lugar de los datos de texto reales. Algunos módulos cliente, como los parches chinos, utilizan `utf8` en la parte inferior para mostrar palabras de uso común, pero todas las fuentes `utf8` no pueden ser listadas en un mapa. Esto es muy poco razonable y, desde luego, el efecto no es tan bueno como el de los datos de texto. | ||
|
||
Para la edición definitiva de `sa`, debe implementarse internamente utilizando `utf8`. Si `omp` lanza la edición definitiva en línea en el futuro, no debería ser necesario ningún procesamiento adicional. | ||
# Internacionalización | ||
|
||
La internacionalización es una función central muy importante de `Infernus`. Incluso si no la tienes en cuenta en el proceso de desarrollo de un script, necesitas conocer al menos la sección [internacionalización de jugadores](#player-internationalization), de lo contrario puedes encontrarte con situaciones comunes como códigos ilegibles. | ||
|
||
## VSCode plugin | ||
|
||
[infernus-starter](https://github.com/dockfries/infernus-starter) proporciona el archivo de recomendación de instalación del plugin `.vscode/ extensions.json`. Se recomienda encarecidamente que haga clic en instalar en el prompt en la esquina inferior derecha de `VSCode`, para que pueda ver fácilmente y de forma intuitiva los datos internacionales durante el desarrollo. | ||
|
||
`i18n-ally-custom-framework.yml` y `settings.json` El archivo de configuración relacionado con el plugin ha sido configurado para ti. | ||
|
||
## Ejemplo | ||
|
||
### Definir paquete de idiomas | ||
|
||
El paquete de idioma consiste en los datos del archivo `.json`. **la estructura de árbol se utiliza como `clave` de datos del paquete de idioma**. | ||
|
||
La cadena de datos definida puede contener `%s` como palabra clave para rellenar los datos. | ||
|
||
#### Paquete de idioma chino | ||
|
||
```json | ||
{ | ||
"server": { | ||
"running": "成功运行由 node.js 强力驱动的 omp 服务器", | ||
"connection": "连接信息: %s - %s : %s" | ||
} | ||
} | ||
``` | ||
|
||
#### Paquete en inglés | ||
|
||
```json | ||
{ | ||
"server": { | ||
"running": "Successfully running an omp server powered by node.js", | ||
"connection": "connection information: %s - %s : %s" | ||
} | ||
} | ||
``` | ||
|
||
### Instancia | ||
|
||
Obtener un ejemplo de internacionalización a través de `new I18n(«clave de región por defecto», «paquete de idioma»)`. | ||
|
||
Normalmente sólo necesitamos utilizar la función `$t`. | ||
|
||
La función `$t(«clave de datos del paquete de idioma», [arreglo de marcadores de posición], clave de región)` puede obtener el texto del paquete de idioma correspondiente. | ||
|
||
En lugar de pasar un arreglo de marcadores de posición, puede sustituirla por `null` o `undefined` o un arreglo vacía cuando la cadena no tenga un marcador de posición. | ||
|
||
No pasar el tercer parámetro significa obtener los datos de la configuración regional por defecto. | ||
|
||
```ts | ||
import { I18n } from "@infernus/core"; | ||
|
||
// Paquete de idiomas internacionalizado en json | ||
import zh_CN from "./locales/zh_CN.json"; | ||
import en_US from "./locales/en_US.json"; | ||
|
||
const locales = { | ||
zh_CN, | ||
en_US, | ||
}; | ||
|
||
export const { $t } = new I18n("en_US", locales); | ||
|
||
console.log($t("server.running")); | ||
console.log($t("server.connection", ["127.0.0.1", "8080", "123456"])); | ||
console.log($t("server.connection", ["127.0.0.1", "8080", "123456"], "zh_CN")); | ||
``` | ||
|
||
### Funciones prácticas | ||
|
||
La clase `I18n` también tiene varias prácticas **funciones estáticas** que puedes probar cuando te encuentres con conversiones entre internacionalizaciones. | ||
|
||
- encodeToBuf | ||
- Un arreglo de bytes utilizada para convertir una subcadena a un conjunto de caracteres especificado. | ||
- decodeFromBuf | ||
- Una cadena utilizada para convertir un arreglo de bytes a un conjunto de caracteres especificado. | ||
- getValidStr | ||
- Si intercepta una cadena válida en un arreglo de bytes, se encuentra el primer `0`, que se considera el final de la cadena. | ||
|
||
## Internacionalización del jugador | ||
|
||
Existen dos atributos en la instancia del jugador para controlar la internacionalización, a saber, `charset` y `locale`, que corresponden al conjunto de caracteres y a la región, respectivamente. Los valores por defecto son los siguientes: | ||
|
||
```ts | ||
class Player { | ||
charset = "ISO-8859-1"; | ||
locale = "en_US"; | ||
} | ||
``` | ||
|
||
Normalmente `$t` combina la región del jugador para obtener los datos del paquete de idioma correspondiente. | ||
|
||
```ts | ||
// Supongamos que tiene una instancia de jugador | ||
console.log( | ||
$t("server.incoming", ["127.0.0.1", "8080", "123456"], player.locale), | ||
); | ||
``` | ||
|
||
Si desea modificar el idioma o la configuración regional del jugador, debe modificar los atributos `charset` y `locale` del jugador. Asegúrese siempre de que el `charset` del jugador es correcto. Puedes utilizar la dirección `ip` para adivinar la zona del jugador, y dejar que el mismo introduzca una cadena concreta y comparar bytes para averiguar de qué juego de caracteres se trata. | ||
|
||
### Soportar todos los nombres | ||
|
||
::: tip | ||
Por defecto, el servidor del juego sólo permite letras, números y nombres de usuario subrayados para conectarse al juego. | ||
::: | ||
|
||
Debido a que `omp` proporciona algunos nuevos `api`, puede deshabilitar / habilitar ciertos caracteres (bytes decimales 0-255) para los nombres de usuario para conectarse al servidor. | ||
|
||
El método `GameMode.supportAllNickname()` **hace uso de la nueva api para conectar todos los nombres de usuario internacionales, incluyendo caracteres como los chinos, al juego.** | ||
|
||
```ts | ||
import { GameMode } from "@infernus/core"; | ||
|
||
GameMode.onInit(({ next }) => { | ||
GameMode.supportAllNickname(); | ||
return next(); | ||
}); | ||
``` | ||
|
||
## Principio | ||
|
||
:::warning | ||
El intercambio bidireccional de datos de conjunto de caracteres es normal si se parte de la premisa de que el conjunto de caracteres del jugador es correcto. | ||
|
||
Si se establece un conjunto de caracteres incorrecto, tanto el servidor como el cliente recibirán código confuso. | ||
::: | ||
|
||
En `Infernus` se utiliza `iconv-lite` para convertir el conjunto de caracteres, se utiliza `polyfill.amx` para interceptar la parte `gamemode` de la llamada de retorno que se devuelve como un arreglo de bytes decimales. | ||
|
||
El servidor convierte el conjunto de caracteres a las funciones del lado del cliente como `SendClientMessage`, `SendClientMessageToAll`, `ShowPlayerDialog` y `CreateDynamic3DTextLabel`, es decir, los datos `utf8` se convierten en los datos del conjunto de caracteres del jugador para garantizar que el jugador pueda mostrar los datos con normalidad. | ||
|
||
La conversión del juego de caracteres del cliente al servidor, como `OnText`, `OnPlayerCommandText`, `OnDialogResponse`, se ha realizado para garantizar que el intercambio de datos entre el servidor y el cliente sea correcto. | ||
|
||
::: tip | ||
Aunque el conjunto de caracteres se haya convertido, los caracteres de `utf8` que no estén incluidos en el conjunto de caracteres del jugador seguirán mostrándose en forma de códigos ilegibles, como `?`, que está limitado por el código subyacente del juego `sa` primitivo. Por ejemplo, sólo el conjunto de caracteres de las fuentes occidentales `emoji` o los caracteres chinos serán ilegibles cuando los reciba `emoji`. | ||
::: | ||
|
||
Para `Infernus`, la capa subyacente de `Infernus` siempre intercambia datos en el formato de `utf8`, porque la implementación de los dos se basa en el algoritmo existente de mapeo de archivos, que es similar al concepto de imagen sprite en el front-end, en lugar de los datos de texto reales. Algunos módulos cliente, como los parches chinos, utilizan `utf8` en la parte inferior para mostrar palabras de uso común, pero todas las fuentes `utf8` no pueden ser listadas en un mapa. Esto es muy poco razonable y, desde luego, el efecto no es tan bueno como el de los datos de texto. | ||
|
||
Para la edición definitiva de `sa`, debe implementarse internamente utilizando `utf8`. Si `omp` lanza la edición definitiva en línea en el futuro, no debería ser necesario ningún procesamiento adicional. | ||
|
||
## Terminal confuso characters | ||
|
||
Si encuentras caracteres confuen en la terminal cuando usas logger como `pino.js`, puedes probar los siguientes comandos para resolver el problema. | ||
|
||
Para los usuarios `PowerShell`, ejecute el siguiente comando (efectivo sólo para la sesión terminal actual). | ||
|
||
Si desea que este cambio sea permanente, añada el comando a su [$PROFILE](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4). | ||
|
||
```powershell | ||
$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding | ||
``` | ||
|
||
Para los usuarios `cmd`, use el siguiente comando para ejecutar su servidor `omp`. | ||
|
||
```sh | ||
cmd /c "chcp 65001 > nul & omp-server" | ||
``` | ||
|
||
El comando anterior cambia el juego de caracteres de `PowerShell` o `cmd` a `UTF-8`. | ||
|
||
Para otros entornos, busque soluciones por su cuenta. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.