Langue
createLocale, loadLocaleTexts, LOCALE_CONVAR et LangTexts : les textes locales/*.json de votre ressource en jeu et dans sa page NUI.
Chaque ressource ai-* garde les textes que voient les joueurs dans locales/<language>.json : en.json est la base complète, les autres langues remplacent ce qu’elles traduisent. Le serveur choisit la langue avec une seule convar répliquée pour toutes les ressources (le modèle de serveur d’ai-core la définit dans misc.cfg) :
setr ai:locale "tr"Un texte peut utiliser {0}, {1}... pour des valeurs ("You paid ${0}") et ${OTHER_KEY} pour inclure un autre texte du même fichier (rempli une fois au chargement).
{
"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"; // aussi sur /client et /server
import { LangTexts } from "@aicore-fivem/lib/shared"; // pour le code NUIcreateLocale
Charge les textes de langue de votre ressource et renvoie une fonction de traduction t(key, ...values). Avec l’argument de type, votre éditeur vérifie chaque clé par rapport à en.json. Créez-la une seule fois (les scripts ai-* le font dans resource/common/locale.ts et l’importent sous le nom Locale).
Côté : client et serveur · Attend : non
createLocale<T extends Record<string, string>>(): (key: keyof T & string, ...args: Array<string | number>) => stringlocal t, texts = aiLib.locale(resource) -- resource vaut par défaut la ressource appelanteParamètres
TypeScript ne prend aucun argument : il lit toujours la ressource dans laquelle le code tourne.
Prop
Type
Retour
TypeScript : la fonction de traduction. Lua : deux valeurs, la fonction de traduction et la table fusionnée des textes (pour une NUI).
La fonction de traduction t(key, ...values) renvoie le texte avec {0}, {1}... remplis. Une clé absente des deux fichiers renvoie la clé elle-même, pour qu’un texte manquant soit visible en jeu au lieu d’être vide.
Exemple
import { createLocale } from "@aicore-fivem/lib/fivem";
/** Les textes de langue de cette ressource : Locale("BOUGHT", 2, "Water") ; clés typées depuis 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"
}Les textes sont lus une seule fois, à la création de la fonction de traduction. Changer ai:locale ou un fichier de langue demande un redémarrage de la ressource. Les textes sont remplis du côté qui appelle t : traduisez sur le client pour une interface client, sur le serveur pour un notify serveur.
loadLocaleTexts
La table de langue fusionnée d’une ressource (en.json recouvert par la langue de ai:locale, références ${KEY} remplies). Utilisez-la pour donner tous les textes à votre page NUI en une fois ; la page remplit elle-même les emplacements {0} avec LangTexts.
Côté : client et serveur · Attend : non
loadLocaleTexts(resource?: string): Record<string, string>local _, texts = aiLib.locale(resource)Paramètres
Prop
Type
Retour
Record<string, string> : clé vers texte. Les fichiers manquants donnent une table vide ; les valeurs qui ne sont pas des chaînes sont ignorées.
Exemple
import { loadLocaleTexts } from "@aicore-fivem/lib/client";
const texts = loadLocaleTexts();
RegisterCommand("myshop", () => {
SendNUIMessage({ action: "open", texts });
SetNuiFocus(true, true);
}, false);LOCALE_CONVAR
Le nom de la convar de langue : "ai:locale". Elle est répliquée (setr), donc les clients la lisent aussi. Lisez-la quand votre script a besoin du code de langue lui-même (un format de date).
Côté : client et serveur · Attend : non
const LOCALE_CONVAR: "ai:locale"Lua : pas d’équivalent ; lisez GetConvar('ai:locale', 'en').
Exemple
import { LOCALE_CONVAR } from "@aicore-fivem/lib/client";
const language = GetConvar(LOCALE_CONVAR, "en"); // "en", "tr", ...LangTexts
Les textes de langue d’une page NUI : garde la table envoyée par le client et traduit les clés avec des emplacements {0}. Ses méthodes subscribe et snapshot conviennent à useSyncExternalStore de React, pour que les composants se réaffichent quand de nouveaux textes arrivent. Chaque méthode est liée, vous pouvez donc passer lang.translate comme une simple fonction.
Côté : NUI (fonctionne partout) · Attend : non
new LangTexts()Lua : pas d’équivalent (le code NUI est en TypeScript ou en JavaScript).
Méthodes
Prop
Type
Exemple
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);
});
/** Réaffiche le composant quand les textes changent. */
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>;
}Accès, blips et PNJ des lieux
readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields et readPlacePed : les parties de panneau que partagent tous les lieux.
Journalisation
createLogger, logSafe et previewJson : des lignes de console au nom de votre ressource, et du texte non fiable rendu sûr à afficher.