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
{
"server": {
"running": "成功运行由 node.js 强力驱动的 omp 服务器",
"connection": "连接信息: %s - %s : %s"
}
}
Paquete en inglés
{
"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.
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.
- Si intercepta una cadena válida en un arreglo de bytes, se encuentra el primer
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:
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.
// 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.
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.
$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
Para los usuarios cmd
, use el siguiente comando para ejecutar su servidor omp
.
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.