Tłumaczenia
createLocale, loadLocaleTexts, LOCALE_CONVAR i LangTexts: teksty locales/*.json twojego zasobu w grze i na jego stronie NUI.
Każdy zasób ai-* trzyma teksty widoczne dla graczy w locales/<language>.json: en.json to pełna baza, inne języki nadpisują to, co tłumaczą. Serwer wybiera język jednym replikowanym convarem dla wszystkich zasobów (szablon serwera ai-core ustawia go w misc.cfg):
setr ai:locale "tr"Tekst może używać {0}, {1}... dla wartości ("You paid ${0}") i ${OTHER_KEY}, żeby wstawić inny tekst z tego samego pliku (wypełniane raz przy wczytaniu).
{
"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"; // także w /client i /server
import { LangTexts } from "@aicore-fivem/lib/shared"; // dla kodu NUIcreateLocale
Wczytuje teksty językowe twojego zasobu i zwraca funkcję tłumaczącą t(key, ...values). Z argumentem typu twój edytor sprawdza każdy klucz względem en.json. Utwórz ją raz (skrypty ai-* robią to w resource/common/locale.ts i importują ją jako Locale).
Strona: Klient i serwer · Czeka: nie
createLocale<T extends Record<string, string>>(): (key: keyof T & string, ...args: Array<string | number>) => stringlocal t, texts = aiLib.locale(resource) -- resource domyślnie to wywołujący zasóbParametry
TypeScript nie przyjmuje argumentów: zawsze czyta zasób, w którym działa kod.
Prop
Type
Zwracana wartość
TypeScript: funkcja tłumacząca. Lua: dwie wartości, funkcja tłumacząca i scalona tabela tekstów (dla NUI).
Funkcja tłumacząca t(key, ...values) zwraca tekst z wypełnionymi {0}, {1}... Klucz, którego brakuje w obu plikach, zwraca sam siebie, więc brakujący tekst jest widoczny w grze zamiast pustego miejsca.
Przykład
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"
}Teksty są czytane raz, gdy tworzona jest funkcja tłumacząca. Zmiana ai:locale albo pliku językowego wymaga restartu zasobu. Teksty są wypełniane po stronie, która wywołuje t: tłumacz na kliencie dla UI klienta, na serwerze dla serwerowego notify.
loadLocaleTexts
Scalona tabela językowa zasobu (en.json nadpisany językiem z ai:locale, odwołania ${KEY} wypełnione). Używaj jej, żeby raz przekazać wszystkie teksty swojej stronie NUI; strona sama wypełnia miejsca {0} przez LangTexts.
Strona: Klient i serwer · Czeka: nie
loadLocaleTexts(resource?: string): Record<string, string>local _, texts = aiLib.locale(resource)Parametry
Prop
Type
Zwracana wartość
Record<string, string>: klucz do tekstu. Brakujące pliki dają pustą tabelę; wartości, które nie są stringami, są pomijane.
Przykład
import { loadLocaleTexts } from "@aicore-fivem/lib/client";
const texts = loadLocaleTexts();
RegisterCommand("myshop", () => {
SendNUIMessage({ action: "open", texts });
SetNuiFocus(true, true);
}, false);LOCALE_CONVAR
Nazwa convara języka: "ai:locale". Jest replikowany (setr), więc klienty też go czytają. Czytaj go, gdy twój skrypt potrzebuje samego kodu języka (format daty).
Strona: Klient i serwer · Czeka: nie
const LOCALE_CONVAR: "ai:locale"Lua: brak odpowiednika; odczytaj GetConvar('ai:locale', 'en').
Przykład
import { LOCALE_CONVAR } from "@aicore-fivem/lib/client";
const language = GetConvar(LOCALE_CONVAR, "en"); // "en", "tr", ...LangTexts
Teksty językowe strony NUI: trzyma tabelę wysłaną przez klienta i tłumaczy klucze z miejscami {0}. Jej subscribe i snapshot pasują do useSyncExternalStore z Reacta, więc komponenty renderują się ponownie, gdy przyjdą nowe teksty. Każda metoda jest powiązana, więc możesz przekazywać lang.translate jako zwykłą funkcję.
Strona: NUI (działa wszędzie) · Czeka: nie
new LangTexts()Lua: brak odpowiednika (kod NUI to TypeScript albo JavaScript).
Metody
Prop
Type
Przykład
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>;
}Dostęp, blipy i NPC miejsc
readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields i readPlacePed: części panelu wspólne dla każdego miejsca.
Logowanie
createLogger, logSafe i previewJson: linie konsoli z nazwą twojego zasobu i niezaufany tekst bezpieczny do wypisania.