TTs whisper
This commit is contained in:
@@ -1,15 +1,19 @@
|
||||
import AsyncStorage from "@react-native-async-storage/async-storage";
|
||||
|
||||
import type { Locale } from "./translations";
|
||||
|
||||
export const STORAGE_KEYS = {
|
||||
authToken: "recorder.authToken",
|
||||
backendUrl: "recorder.backendUrl",
|
||||
fieldName: "recorder.fieldName",
|
||||
language: "recorder.language",
|
||||
};
|
||||
|
||||
export type RecorderSettings = {
|
||||
authToken: string;
|
||||
backendUrl: string;
|
||||
fieldName: string;
|
||||
language: Locale;
|
||||
};
|
||||
|
||||
export async function loadRecorderSettings(): Promise<RecorderSettings> {
|
||||
@@ -17,6 +21,7 @@ export async function loadRecorderSettings(): Promise<RecorderSettings> {
|
||||
STORAGE_KEYS.backendUrl,
|
||||
STORAGE_KEYS.authToken,
|
||||
STORAGE_KEYS.fieldName,
|
||||
STORAGE_KEYS.language,
|
||||
]);
|
||||
|
||||
const values = Object.fromEntries(entries);
|
||||
@@ -25,6 +30,7 @@ export async function loadRecorderSettings(): Promise<RecorderSettings> {
|
||||
authToken: values[STORAGE_KEYS.authToken] ?? "",
|
||||
backendUrl: values[STORAGE_KEYS.backendUrl] ?? "",
|
||||
fieldName: values[STORAGE_KEYS.fieldName] ?? "file",
|
||||
language: (values[STORAGE_KEYS.language] as Locale) ?? "ca",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -33,5 +39,6 @@ export async function saveRecorderSettings(settings: RecorderSettings) {
|
||||
[STORAGE_KEYS.backendUrl, settings.backendUrl],
|
||||
[STORAGE_KEYS.authToken, settings.authToken],
|
||||
[STORAGE_KEYS.fieldName, settings.fieldName || "file"],
|
||||
[STORAGE_KEYS.language, settings.language],
|
||||
]);
|
||||
}
|
||||
|
||||
100
apk/lib/translations/index.ts
Normal file
100
apk/lib/translations/index.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
export type TranslationKeys = ReturnType<typeof getStrings>;
|
||||
|
||||
export function en() {
|
||||
return {
|
||||
appTitle: "Quibot Control",
|
||||
settingsTitle: "Settings",
|
||||
back: "Back",
|
||||
save: "Save",
|
||||
backendUrl: "Backend URL",
|
||||
bearerToken: "Bearer token",
|
||||
formFieldName: "Form field name",
|
||||
tokenOptional: "Optional",
|
||||
fieldNamePlaceholder: "file",
|
||||
urlPlaceholder: "https://api.example.com/upload",
|
||||
helperText: `The recording is uploaded as multipart field '{field}'.`,
|
||||
savedAlert: "Settings saved.",
|
||||
loadError: "Could not load backend settings.",
|
||||
saveError: "Could not save backend settings.",
|
||||
languageTitle: "Language",
|
||||
recorderTitle: "Voice recorder",
|
||||
readyToRecord: "Ready to record.",
|
||||
recording: "Recording...",
|
||||
micPermissionDenied: "Microphone permission was denied.",
|
||||
micAccessRequiredTitle: "Microphone access required",
|
||||
micAccessRequiredMsg: "Enable microphone access to record audio.",
|
||||
couldNotStartRecording: "Could not start recording.",
|
||||
recordingFailedTitle: "Recording failed",
|
||||
finishedUpload: "Recording finished. Uploading...",
|
||||
voiceMessageSent: "Voice message sent.",
|
||||
uploadFailed: "Upload failed.",
|
||||
noBackendUrl: "Recording finished. No backend URL set.",
|
||||
stopFailedTitle: "Stop failed",
|
||||
missingBackendUrlTitle: "Missing backend URL",
|
||||
missingBackendUrlMsg: "Enter the backend endpoint first.",
|
||||
uploadingRecording: "Uploading recording.",
|
||||
uploadComplete: "Upload complete.",
|
||||
serverResponse: "Server response",
|
||||
releaseToStop: "Release your finger to stop recording and send the audio.",
|
||||
holdToRecord: "Hold the microphone button to record a voice message. Release to send it immediately.",
|
||||
openSettingsHint: "Open settings to add your backend URL before sending voice messages.",
|
||||
};
|
||||
}
|
||||
|
||||
export function ca() {
|
||||
return {
|
||||
appTitle: "Quibot Control",
|
||||
settingsTitle: "Configuraci\u00f3",
|
||||
back: "Enrere",
|
||||
save: "Desa",
|
||||
backendUrl: "URL del servidor",
|
||||
bearerToken: "Bearer token",
|
||||
formFieldName: "Nom del camp del formulari",
|
||||
tokenOptional: "Opcional",
|
||||
fieldNamePlaceholder: "file",
|
||||
urlPlaceholder: "https://api.example.com/upload",
|
||||
helperText: `La gravaci\u00f3 es penja com el camp multipart '{field}'.`,
|
||||
savedAlert: "Configuraci\u00f3 desada.",
|
||||
loadError: "No s'han pogut carregar les configuracions.",
|
||||
saveError: "No s'han pogut desar les configuracions.",
|
||||
languageTitle: "Llenguatge",
|
||||
recorderTitle: "Enregistrador de veu",
|
||||
readyToRecord: "Preparat per enregistrar.",
|
||||
recording: "Enregistrant...",
|
||||
micPermissionDenied: "S'ha denegat el perm\u00eds del micr\u00f2fon.",
|
||||
micAccessRequiredTitle: "Acc\u00e9s al micr\u00f2fon necess\u00e0ri",
|
||||
micAccessRequiredMsg: "Activa l'acc\u00e9s al micr\u00f2fon per enregistrar \u00e0udio.",
|
||||
couldNotStartRecording: "No s'ha pogut iniciar l'enregistrament.",
|
||||
recordingFailedTitle: "L'enregistrament ha fallat",
|
||||
finishedUpload: "Gravaci\u00f3 finalitzada. S'est\u00e0 penjant...",
|
||||
voiceMessageSent: "Missatge de veu enviat.",
|
||||
uploadFailed: "No s'ha pogut penjar.",
|
||||
noBackendUrl: "Gravaci\u00f3 finalitzada. No hi ha URL configurada.",
|
||||
stopFailedTitle: "S'ha aturat",
|
||||
missingBackendUrlTitle: "Falta la URL del servidor",
|
||||
missingBackendUrlMsg: "Introdueix primer l'URL del servidor.",
|
||||
uploadingRecording: "S'est\u00e0 penjant la gravaci\u00f3.",
|
||||
uploadComplete: "Penjada completada.",
|
||||
serverResponse: "Resposta del servidor",
|
||||
releaseToStop: "Allibera el dit per aturar l'enregistrament i enviar l'\u00e0udio.",
|
||||
holdToRecord: "Mant\u00e9s premut el micr\u00f2fon per enregistrar un missatge de veu. Allibera'l per enviar-lo immediatament.",
|
||||
openSettingsHint: "Obre la configuraci\u00f3 per afegir l'URL del servidor abans d'enviar missatges de veu.",
|
||||
};
|
||||
}
|
||||
|
||||
const translations = { en, ca };
|
||||
export type Locale = keyof typeof translations;
|
||||
const DEFAULT_LOCALE: Locale = "ca";
|
||||
export const AVAILABLE_LOCALES: readonly Locale[] = Object.keys(translations) as Locale[];
|
||||
|
||||
export function getStrings(locale: Locale) {
|
||||
const fn = translations[locale] ?? en;
|
||||
return fn();
|
||||
}
|
||||
|
||||
export function t(key: keyof ReturnType<typeof ca>, locale: Locale, field?: string) {
|
||||
const strings = getStrings(locale);
|
||||
const value = strings[key as keyof typeof strings];
|
||||
if (typeof value !== "string") return String(value);
|
||||
return field ? value.replace("{field}", field) : value;
|
||||
}
|
||||
Reference in New Issue
Block a user