Skip to content

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, de lo contrario puedes encontrarte con situaciones comunes como códigos ilegibles.

VSCode plugin

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.

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.