Idioma
createLocale, loadLocaleTexts, LOCALE_CONVAR y LangTexts: los textos locales/*.json de tu recurso en el juego y en su página NUI.
Cada recurso ai-* guarda los textos que ve el jugador en locales/<language>.json: en.json es la base completa, y los demás idiomas sobrescriben lo que traducen. El servidor elige el idioma con una única convar replicada para todos los recursos (la plantilla de servidor de ai-core la fija en misc.cfg):
setr ai:locale "tr"Un texto puede usar {0}, {1}... para valores ("You paid ${0}") y ${OTHER_KEY} para incluir otro texto del mismo archivo (se rellena una vez al cargar).
{
"SHOP_NAME": "24/7",
"BOUGHT": "You bought {0}x {1} at ${SHOP_NAME}",
"NOT_ENOUGH_MONEY": "You do not have enough money"
}import { createLocale, loadLocaleTexts, LOCALE_CONVAR } from "@aicore-fivem/lib/fivem"; // también en /client y /server
import { LangTexts } from "@aicore-fivem/lib/shared"; // para código NUIcreateLocale
Carga los textos de idioma de tu recurso y devuelve una función de traducción t(key, ...values). Con el argumento de tipo, tu editor comprueba cada clave contra en.json. Créala una sola vez (los scripts ai-* lo hacen en resource/common/locale.ts y la importan como Locale).
Lado: Cliente y servidor · Espera: no
createLocale<T extends Record<string, string>>(): (key: keyof T & string, ...args: Array<string | number>) => stringlocal t, texts = aiLib.locale(resource) -- resource es por defecto el recurso que llamaParámetros
TypeScript no acepta argumentos: siempre lee el recurso en el que se ejecuta el código.
Prop
Type
Devuelve
TypeScript: la función de traducción. Lua: dos valores, la función de traducción y la tabla fusionada de textos (para una NUI).
La función de traducción t(key, ...values) devuelve el texto con {0}, {1}... rellenados. Una clave que falta en ambos archivos devuelve la propia clave, así que un texto que falta se ve en el juego en lugar de quedar vacío.
Ejemplo
import { createLocale } from "@aicore-fivem/lib/fivem";
/** This resource's lang texts: Locale("BOUGHT", 2, "Water"); keys typed from locales/en.json. */
const Locale = createLocale<typeof import("../../locales/en.json")>();
export default Locale;import { notify } from "@aicore-fivem/lib/server";
import Locale from "../common/locale";
export function tellBought(source: number, count: number, label: string): void {
notify(source, Locale("BOUGHT", count, label), "success"); // "You bought 2x Water at 24/7"
}Los textos se leen una sola vez, cuando se crea la función de traducción. Cambiar ai:locale o un archivo de idioma necesita reiniciar el recurso. Los textos se rellenan en el lado que llama a t: traduce en el cliente para la interfaz del cliente, en el servidor para un notify del servidor.
loadLocaleTexts
La tabla de idioma fusionada de un recurso (en.json con el idioma de ai:locale por encima y las referencias ${KEY} rellenadas). Úsala para entregar todos los textos a tu página NUI de una vez; la página rellena ella misma los marcadores {0} con LangTexts.
Lado: Cliente y servidor · Espera: no
loadLocaleTexts(resource?: string): Record<string, string>local _, texts = aiLib.locale(resource)Parámetros
Prop
Type
Devuelve
Record<string, string>: de clave a texto. Los archivos que faltan dan una tabla vacía; los valores que no son strings se omiten.
Ejemplo
import { loadLocaleTexts } from "@aicore-fivem/lib/client";
const texts = loadLocaleTexts();
RegisterCommand("myshop", () => {
SendNUIMessage({ action: "open", texts });
SetNuiFocus(true, true);
}, false);LOCALE_CONVAR
El nombre de la convar de idioma: "ai:locale". Está replicada (setr), así que los clientes también la leen. Léela cuando tu script necesite el propio código de idioma (un formato de fecha).
Lado: Cliente y servidor · Espera: no
const LOCALE_CONVAR: "ai:locale"Lua: sin equivalente; lee GetConvar('ai:locale', 'en').
Ejemplo
import { LOCALE_CONVAR } from "@aicore-fivem/lib/client";
const language = GetConvar(LOCALE_CONVAR, "en"); // "en", "tr", ...LangTexts
Los textos de idioma de una página NUI: guarda la tabla que envió el cliente y traduce claves con marcadores {0}. Sus subscribe y snapshot encajan con useSyncExternalStore de React, así que los componentes se vuelven a renderizar cuando llegan textos nuevos. Cada método está enlazado, así que puedes pasar lang.translate como una función simple.
Lado: NUI (funciona en cualquier sitio) · Espera: no
new LangTexts()Lua: sin equivalente (el código NUI es TypeScript o JavaScript).
Métodos
Prop
Type
Ejemplo
import { useSyncExternalStore } from "react";
import { LangTexts } from "@aicore-fivem/lib/shared";
export const lang = new LangTexts();
window.addEventListener("message", (event: MessageEvent<{ action?: string; texts?: Record<string, string> }>) => {
if (event.data.action === "open" && event.data.texts) lang.set(event.data.texts);
});
/** Re-renders the component when the texts change. */
export function useLang() {
useSyncExternalStore(lang.subscribe, lang.snapshot);
return lang.translate;
}import { useLang } from "./lang";
export function Title({ count }: { count: number }) {
const t = useLang();
return <h1>{t("BOUGHT", count, "Water")}</h1>;
}Acceso, blips y NPC de lugares
readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields y readPlacePed: las partes del panel que comparten todos los lugares.
Logging
createLogger, logSafe y previewJson: líneas de consola con el nombre de tu recurso, y texto no fiable preparado para imprimirse sin riesgo.