diff --git a/README.md b/README.md
index de557c3ea..51f1d22c4 100644
--- a/README.md
+++ b/README.md
@@ -9,10 +9,11 @@
This project includes the following apps / packages:
-### Apps
+### App
-- `guardian-ui`: Web app experience for setting up and administering fedimints. This is used by the Fedimint guardians
-- `gateway-ui`: Web app experience for managing Fedimint gateways. This is used by Gateway administrators
+We've refactored the Fedimint UI into a single client side app that can run on the browser or on desktop using Electron.
+
+- `router`: This creates a homescreen that shows all your connected services: guardians or gateways. You can connect to other guardians or gateways by entering their baseUrl. You have to authenticate each service separately because the auth for each one is done differently.
### Packages
diff --git a/apps/gateway-ui/public/index.html b/apps/gateway-ui/public/index.html
deleted file mode 100644
index d4fb061d4..000000000
--- a/apps/gateway-ui/public/index.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
- );
-});
diff --git a/apps/guardian-ui/src/AppContext.tsx b/apps/guardian-ui/src/AppContext.tsx
deleted file mode 100644
index b9f9def3e..000000000
--- a/apps/guardian-ui/src/AppContext.tsx
+++ /dev/null
@@ -1,118 +0,0 @@
-import React, {
- createContext,
- Dispatch,
- ReactNode,
- useEffect,
- useReducer,
-} from 'react';
-import { ServerStatus } from '@fedimint/types';
-import { GuardianApi } from './GuardianApi';
-import { formatApiErrorMessage } from './utils/api';
-import { APP_ACTION_TYPE, AppAction, AppState, Status } from './types';
-
-export interface AppContextValue {
- api: GuardianApi;
- state: AppState;
- dispatch: Dispatch;
-}
-
-const initialState = {
- status: Status.Loading,
- needsAuth: false,
- initServerStatus: undefined,
- appError: undefined,
-};
-
-const reducer = (state: AppState, action: AppAction): AppState => {
- switch (action.type) {
- case APP_ACTION_TYPE.SET_STATUS:
- return { ...state, status: action.payload };
- case APP_ACTION_TYPE.SET_NEEDS_AUTH:
- return { ...state, needsAuth: action.payload };
- case APP_ACTION_TYPE.SET_INIT_SERVER_STATUS:
- return { ...state, initServerStatus: action.payload };
- case APP_ACTION_TYPE.SET_ERROR:
- return { ...state, appError: action.payload };
- default:
- return state;
- }
-};
-
-const api = new GuardianApi();
-
-export const AppContext = createContext({
- api: api,
- state: initialState,
- dispatch: () => null,
-});
-
-export interface AppContextProviderProps {
- children: ReactNode;
-}
-
-export const AppContextProvider: React.FC = ({
- children,
-}: AppContextProviderProps) => {
- const [state, dispatch] = useReducer(reducer, initialState);
-
- useEffect(() => {
- const load = async () => {
- try {
- const guardianConfig = await api.getGuardianConfig();
- if (!guardianConfig?.fm_config_api) {
- dispatch({
- type: APP_ACTION_TYPE.SET_STATUS,
- payload: Status.NotConfigured,
- });
- return;
- }
- await api.connect(guardianConfig.fm_config_api);
- const server = (await api.status()).server;
-
- // If they're at a point where a password has been configured, make
- // sure they have a valid password set. If not, set needsAuth.
- if (server !== ServerStatus.AwaitingPassword) {
- const password = api.getPassword();
- const hasValidPassword = password
- ? await api.testPassword(password)
- : false;
- if (!hasValidPassword) {
- dispatch({ type: APP_ACTION_TYPE.SET_NEEDS_AUTH, payload: true });
- }
- }
-
- if (server === ServerStatus.ConsensusRunning) {
- dispatch({ type: APP_ACTION_TYPE.SET_STATUS, payload: Status.Admin });
- } else {
- dispatch({ type: APP_ACTION_TYPE.SET_STATUS, payload: Status.Setup });
- }
-
- dispatch({
- type: APP_ACTION_TYPE.SET_INIT_SERVER_STATUS,
- payload: server,
- });
- } catch (err) {
- dispatch({
- type: APP_ACTION_TYPE.SET_ERROR,
- payload: formatApiErrorMessage(err),
- });
- }
- };
-
- if (state.status === Status.Loading) {
- load().catch((err) => console.error(err));
- }
- }, [state.status]);
-
- return (
-
- {children}
-
- );
-};
diff --git a/apps/guardian-ui/src/admin/AdminContext.tsx b/apps/guardian-ui/src/admin/AdminContext.tsx
deleted file mode 100644
index b8b4e4b2f..000000000
--- a/apps/guardian-ui/src/admin/AdminContext.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import React, { createContext, ReactNode } from 'react';
-import { AdminApiInterface, GuardianApi } from '../GuardianApi';
-
-export interface AdminContextValue {
- api: AdminApiInterface;
-}
-
-export const AdminContext = createContext({
- api: new GuardianApi(),
-});
-
-export interface AdminContextProviderProps {
- api: AdminApiInterface;
- children: ReactNode;
-}
-
-export const AdminContextProvider: React.FC = ({
- api,
- children,
-}: AdminContextProviderProps) => {
- return (
-
- {children}
-
- );
-};
diff --git a/apps/guardian-ui/src/components/NotConfigured.tsx b/apps/guardian-ui/src/components/NotConfigured.tsx
deleted file mode 100644
index bf7b74c38..000000000
--- a/apps/guardian-ui/src/components/NotConfigured.tsx
+++ /dev/null
@@ -1,68 +0,0 @@
-import React, { useCallback, useState } from 'react';
-import {
- Button,
- Flex,
- Heading,
- Input,
- Text,
- FormControl,
- FormLabel,
- FormErrorMessage,
-} from '@chakra-ui/react';
-import { useTranslation } from '@fedimint/utils';
-import { GuardianApi } from '../GuardianApi';
-import { APP_ACTION_TYPE, Status, AppAction } from '../types';
-
-interface NotConfiguredProps {
- api: GuardianApi;
- dispatch: React.Dispatch;
-}
-
-export const NotConfigured: React.FC = ({
- api,
- dispatch,
-}) => {
- const { t } = useTranslation();
- const [configUrl, setConfigUrl] = useState('');
- const [error, setError] = useState(null);
-
- const handleSubmit = useCallback(
- async (e: React.FormEvent) => {
- e.preventDefault();
- setError(null);
-
- try {
- await api.setGuardianConfig({ fm_config_api: configUrl });
- dispatch({ type: APP_ACTION_TYPE.SET_STATUS, payload: Status.Loading });
- } catch (err) {
- setError(t('errors.invalidConfig'));
- }
- },
- [api, configUrl, dispatch, t]
- );
-
- return (
-
- );
-};
diff --git a/apps/guardian-ui/src/hooks/index.tsx b/apps/guardian-ui/src/hooks/index.tsx
deleted file mode 100644
index f9b035094..000000000
--- a/apps/guardian-ui/src/hooks/index.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { useContext, useEffect, useState } from 'react';
-import { AppContextValue, AppContext } from '../AppContext';
-import { SetupContext, SetupContextValue } from '../setup/SetupContext';
-import { AdminContext, AdminContextValue } from '../admin/AdminContext';
-
-export function useAppContext(): AppContextValue {
- return useContext(AppContext);
-}
-
-export function useSetupContext(): SetupContextValue {
- return useContext(SetupContext);
-}
-
-/**
- * Tells the guardian context to poll for updates. Handles turning off polling
- * on dismount.
- */
-export function useConsensusPolling(shouldPoll = true) {
- const { toggleConsensusPolling } = useSetupContext();
-
- useEffect(() => {
- if (!shouldPoll) return;
- toggleConsensusPolling(true);
- return () => toggleConsensusPolling(false);
- }, [shouldPoll, toggleConsensusPolling]);
-}
-
-export function useAdminContext(): AdminContextValue {
- return useContext(AdminContext);
-}
-
-export const useEllipsis = () => {
- const [ellipsis, setEllipsis] = useState('');
-
- useEffect(() => {
- const interval = setInterval(() => {
- setEllipsis((prev) => (prev.length < 3 ? prev + '.' : ''));
- }, 500);
- return () => clearInterval(interval);
- }, []);
-
- return ellipsis;
-};
diff --git a/apps/guardian-ui/src/index.tsx b/apps/guardian-ui/src/index.tsx
deleted file mode 100644
index 7631e69d9..000000000
--- a/apps/guardian-ui/src/index.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { ColorModeScript } from '@chakra-ui/react';
-import * as React from 'react';
-import * as ReactDOM from 'react-dom/client';
-import { AppContextProvider } from './AppContext';
-import { App } from './App';
-import { i18nProvider } from '@fedimint/utils';
-import { languages } from './languages';
-
-i18nProvider(languages);
-
-const container = document.getElementById('root');
-if (!container) throw new Error('Failed to find the root element');
-const root = ReactDOM.createRoot(container);
-
-root.render(
-
-
-
-
-
-
-);
diff --git a/apps/guardian-ui/src/languages/ca.json b/apps/guardian-ui/src/languages/ca.json
deleted file mode 100644
index fe6128798..000000000
--- a/apps/guardian-ui/src/languages/ca.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Següent",
- "back": "Enrere",
- "error": "Alguna cosa ha anat malament.",
- "unknown": "Desconegut",
- "remove": "Eliminar",
- "copy": "Copia",
- "copied": "Copiat!",
- "cancel": "Cancel·la",
- "review": "Revisió",
- "approvals": "Aprovacions",
- "approve": "Aprovar",
- "threshold": "Llimite",
- "confirm": "Confirmar",
- "you": "Tu",
- "close": "Tanca",
- "save": "Desaureta",
- "continue": "Continuar",
- "submit": "Enviar"
- },
- "notConfigured": {
- "title": "No Configurat",
- "description": "Introduïu l'URL de l'API de configuració de Fedimint per continuar."
- },
- "connect-guardians": {
- "invite-guardians": "Convida els seguidors",
- "invite-guardians-help": "Comparteix aquest enllaç amb els altres Guardians.",
- "approve": "Aprovar",
- "approved": "Aprovat",
- "pending": "Pendent",
- "not-joined": "No unitat",
- "waiting-for-guardian": "Esperant el guardian",
- "table-title": "Guardians de la Federació",
- "table-description": "Els guardians seran confirmats aquí un cop confirmin la configuració de la Federació.",
- "meta-field-key": "Camp meta - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Convida membres o autentica't com a guardian",
- "invite-members-prompt": "Comparteix això per convidar membres a unir-se a la federació.",
- "fed-info": {
- "label": "Informació de la Federació",
- "your-status-label": "Estat",
- "block-count-label": "Alçada del bloc de consens",
- "api-version-label": "versió de l'API",
- "consensus-version-label": "Versió de consens",
- "peer-id-label": "ID de companyia",
- "session-info": {
- "session-height": "Alçada de sessió",
- "latest-session": "Última sessió"
- }
- },
- "balance": {
- "label": "Balanç de situació"
- },
- "bitcoin-node": {
- "label": "Node de Bitcoin",
- "url-label": "URL",
- "network-label": "Xarxa"
- },
- "guardians": {
- "label": "Altres Guardians",
- "id-name-label": "ID: Nom",
- "status-label": "Estat de connexió",
- "health-label": "Salut",
- "health-issue": "Problema",
- "health-good": "Bé",
- "last-contribution-label": "Última contribució de sessió",
- "api-url-label": "URL de l'API",
- "fetching-announcement": "Obtenció d'anunci..."
- },
- "gateways": {
- "label": "Portes de llum",
- "node-id-label": "ID de Node Lightning",
- "gateway-id-label": "ID de passarel·la",
- "fee-label": "Quota de pas",
- "view-on-site": "Veure a {{site}}",
- "no-gateways-info-title": "Encara no hi ha passarel·les connectades!",
- "no-gateways-info-description": "Els operadors de nodes Lightning poden connectar-se a la vostra federació per proporcionar interoperabilitat de la Lightning Network. Un cop connectats, apareixeran aquí."
- },
- "api-announcements": {
- "label": "Anuncis de l'API",
- "guardian": "Guardià",
- "api-url": "URL de l'API",
- "revision": "Revisió"
- },
- "config": {
- "label": "Configuració de la Federació",
- "view-config": "Veure Configuració",
- "missing-meta-module": "No és possible editar els camps Meta. El mòdul Meta no està disponible per a aquesta federació.",
- "manage-meta": {
- "label": "Gestiona Meta",
- "cancel-button": "Cancel·la",
- "confirm-modal": {
- "title": "Confirmar aprovació",
- "description": "La teva aprovació arribarà al llindar per adoptar aquest canvi meta. La teva nova meta tindrà aquest aspecte:"
- },
- "consensus-meta-label": "Meta actual en consens.",
- "revoke-button": "Revocar",
- "no-consensus-meta-message": "no hi ha meta en el consens",
- "proposed-meta-label": "Propostes Meta",
- "propose-meta": "Proposa Meta",
- "propose-new-meta-button": "Proposar Nou Meta",
- "proposal-approved": "Has aprovat aquesta proposta",
- "no-submitted-meta-message": "no hi ha edicions meta per revisar",
- "edit-meta-label": "Edita meta",
- "edit-consensus-meta-button": "Editar Consensus Meta",
- "submit-meta-proposal": "Envia una proposta de Meta",
- "peer-approvals": "Aprovacions entre iguals",
- "actions": "Accions",
- "revision": "Revisió",
- "setup-meta-title": "Configurant un Meta per a la teva Federació",
- "setup-meta-description": "Fedimint pot proporcionar informació addicional als clients en forma de camps meta: parells de clau-valor amb informació arbitrària que podríeu voler compartir amb els clients. Tot i que aquests camps meta no són interpretats per Fedimint, són rellevants per al consens, és a dir, no poden diferir entre els membres de la federació. D'aquesta manera, els clients poden confiar en la seva correcció.",
- "propose-updates": "Com a guardià de fedimint, pots proposar actualitzacions al meta que seran acceptades pels altres guardians. Un cop l'actualització sigui acceptada per un llindar de guardians, serà adoptada com el nou meta de consens per a la federació.",
- "core-meta-fields": "Els següents camps meta s'han definit com a part del protocol bàsic de Fedimint i són útils per incloure a la meta de la vostra federació:",
- "meta-field-expiry": "Un segell de temps unix després del qual la federació es tancarà.",
- "meta-field-name": "El nom llegible per a humans de la federació",
- "meta-field-icon": "Una URL a un icona de logotip per a la federació",
- "meta-field-welcome": "Un missatge de benvinguda per als nous usuaris que s'uneixen a la federació.",
- "meta-field-gateways": "Una llista d'identificadors de passarel·la verificats per la federació",
- "your-own-fields": "També pots afegir els teus propis camps meta arbitràries a la proposta. Aquests s'afegiran a la meta de tots els clients que es connectin a la teva federació i es podran utilitzar per a qualsevol propòsit que desitgis.",
- "meta-effect-add": "Afegir",
- "meta-effect-modify": "Modificar",
- "meta-effect-unchanged": "Inalterat",
- "proposals": "Propostes"
- }
- },
- "modal": {
- "client-connect": "Connecta un Client"
- },
- "danger-zone": {
- "danger-zone-label": "Zona de perill",
- "cancel": "Cancel·la",
- "danger-zone-description": "Utilitzeu amb precaució!",
- "guardian-warning-message": "AVÍS: No comparteu aquest codi amb ningú. Qualsevol persona amb aquest codi pot autenticar-se com a Guardian. Assegureu-vos que esteu en un lloc privat i que ningú estigui mirant la vostra pantalla.",
- "guardian-acknowledge": "Reconèixer i Revelar Codi",
- "acknowledge-and-download": "Reconèixer i continuar",
- "guardian-authenticate": "Autentica't com a Guardian",
- "guardian-connect-warning": "NO COMPARTIS AIXÒ",
- "backup": {
- "label": "Còpia de seguretat",
- "title": "Descarregar còpia de seguretat",
- "warning-title": "Advertència",
- "warning-text": "La còpia de seguretat conté claus privades i material secret per al guardian de la federació i ha de ser mantinguda segura. La recuperació mitjançant aquesta còpia de seguretat requereix la teva contrasenya d'administrador!",
- "cancelButton": "Cancel·la",
- "acknowledgeButton": "Reconèixer i descarregar"
- },
- "sign-api-announcement": {
- "label": "Anunci de l'API de Sign",
- "title": "Anunci de l'API de Sign",
- "description": "Signa un nou anunci d'API.",
- "current-api-url": "La teva URL d'API de la Configuració Local",
- "announced-api-url": "La teva URL d'API dels Anuncis de Federació",
- "urls-match": "La teva URL d'API actual coincideix amb la teva URL d'API anunciada.",
- "urls-mismatch": "Has canviat l'URL de l'API a la teva configuració local i necessites fer un nou anunci de l'API.",
- "sign-button": "Anunci de nova API",
- "signing-in-progress": "Iniciant sessió...",
- "sign-tooltip": "Signa l'anunci de l'API per anunciar la teva URL de l'API a la federació."
- },
- "schedule-shutdown": {
- "label": "Programar apagada",
- "title": "Programar apagada",
- "description": "Programa el teu node guardian perquè s'apagui després d'una alçada de sessió específica per a una actualització coordinada dels teus binaris de fedimintd.",
- "current-session": "Sessió actual",
- "session-to-shutdown": "Sessió per tancar a",
- "confirm-shutdown": "Confirmar apagada",
- "session-to-shutdown-helper": "Introdueix l'altura de sessió a la qual vols apagar el teu node guardian."
- }
- }
- },
- "login": {
- "title": "Ben tornat!",
- "subtitle": "Si us plau, introdueix la teva contrasenya.",
- "password": "Contrasenya",
- "submit": "Enviar"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint és un programari beta.",
- "disclaimer-text": "Si us plau, informa de qualsevol problema a https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Configura el líder",
- "description": "Introdueix la configuració que altres Guardians aproven. Un Guardian actua com a Líder de Configuració."
- },
- "follower": {
- "label": "Seguidor",
- "description": "Un cop un Líder de Configuració estableix les configuracions, altres Guardians escullen aquesta opció per aprovar els ajustaments i crear la Federació."
- },
- "solo": {
- "label": "Solament",
- "description": "Operar Fedimint com un Guardian Sol sense consens, tolerància a fallades, còpies de seguretat federades, o altres beneficis de resiliència de Fedimint. Procediu amb precaució, no està destinat per a ús en producció."
- },
- "warning-modal": {
- "title": "Està tothom a punt?",
- "description": "Sortir de la cerimònia de configuració pot fer que la configuració falli i requerir que reinicieu el vostre guardian. Assegureu-vos que tothom estigui preparat per executar la configuració completa abans de continuar!"
- }
- },
- "run-dkg": {
- "error-config": "No s'ha pogut executar la generació de claus distribuïdes. La configuració de la federació s'ha de reiniciar.",
- "error-default": "No estàs preparat per a DKG, el teu estat actual és",
- "error-header": "Alguna cosa ha anat malament.",
- "waiting-header": "Esperant els companys...",
- "generating-header": "Generant codis..."
- },
- "set-config": {
- "bft-explanation-title": "Tolerància a fallades bizantines de la teva federació",
- "bft-explanation": "Una {{total}} Federació de Guardians crea un {{honest}}/{{total}} Llimitat.",
- "bft-faulty": "La teva Federació podrà tolerar {{faulty}} Guardians defectuosos, fora de línia o maliciosos sense afectar les operacions de la Federació.",
- "guardian-name": "Nom del guardian",
- "guardian-name-help": "Aquest nom aleatori es mostrarà a altres Guardians durant la configuració.",
- "admin-password": "Contrasenya d'administrador",
- "admin-password-generate": "Generar",
- "admin-password-set": "Fes clic a 'Generar' per crear una contrasenya segura. La pots modificar, però aquesta contrasenya ha de ser segura i estar respaldada!",
- "admin-password-help": "Fes una còpia d'aquesta contrasenya i guarda-la bé! No pots recuperar aquesta contrasenya!",
- "admin-password-backup": "Estic utilitzant una contrasenya forta i l'he fet una còpia de seguretat. (No podeu recuperar aquesta contrasenya!)",
- "confirm-password": "Confirma la contrasenya",
- "error-password-mismatch": "Les contrasenyes no coincideixen",
- "join-federation": "Uneix-te al vincle de la Federació",
- "join-federation-help": "Demana a la persona que va crear la Federació un enllaç i enganxa'l aquí.",
- "basic-settings": "Fonaments",
- "federation-settings": "Configuració de la federació",
- "federation-name": "Nom de la federació",
- "guardian-number": "Nombre de guardians",
- "guardian-number-help": "Les federacions requereixen un mínim de 4 guardians. Això no es pot canviar més tard.",
- "bitcoin-settings": "Configuració de Bitcoin",
- "block-confirmations": "Confirmacions addicionals de blocs",
- "block-confirmations-help": "Els guardians de Fedimint segueixen el bloc de la cadena amb diversos confirmacions per evitar reorganitzacions de blocs.",
- "block-confirmations-warning": "Executar Fedimint amb menys de 5 confirmacions addicionals de blocs és extremadament arriscat! Fedimint NO POT gestionar reorganitzacions de blockchain.",
- "bitcoin-network": "Xarxa Bitcoin",
- "select-network": "Selecciona una xarxa",
- "set-rpc-help": "Adreça RPC de Bitcoin configurada localment",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Si us plau, introdueix un número vàlid.",
- "error-valid-min": "Si us plau, introdueix un número d'almenys {{min}}.",
- "error-valid-max": "Si us plau, introdueix un número com a màxim {{max}}.",
- "error-valid-min-max": "Si us plau, introdueix un número entre {{min}} i {{max}}.",
- "meta-fields": "Meta camps",
- "meta-fields-description": "Vegeu documentació per a més informació.",
- "meta-fields-key": "Clau meta",
- "meta-fields-value": "Valor",
- "meta-fields-effect": "Efecte",
- "meta-fields-add-another": "Afegeix un altre",
- "meta-fields-title": "La teva proposta Meta:",
- "password-warning": "Has de fer una còpia de seguretat de la teva contrasenya i guardar-la en un lloc segur. Aquesta contrasenya és necessària per accedir al teu tauler de guardians. No pots recuperar-la si la perds!",
- "password-warning-title": "Fes una còpia de seguretat de la teva contrasenya!",
- "acknowledge-backed-up": "Jo, {{guardianName}} (el teu nom de tutor), prometo que he fet una còpia de seguretat i he assegurat la meva contrasenya:",
- "confirm-and-backup-password": "Confirma i copia la contrasenya",
- "error-guardian-name-mismatch": "El nom del guardian no coincideix.",
- "network": "Xarxa"
- },
- "setup": {
- "common": {
- "restart-setup": "Reinicia la configuració",
- "restart-setup-alert": "El líder de configuración ha reiniciado la ceremonia de configuración. Por favor, haga clic en \"Reiniciar\" a continuación para continuar.",
- "confirm-restart-setup": "Estàs segur que vols reiniciar la Cerimònia d'Instal·lació?",
- "confirm-restart-setup-alert": "Fent clic a \"Reiniciar\" es reiniciarà la cerimònia per a tots els Guardians."
- },
- "progress": {
- "tos": {
- "title": "Termes de servei"
- },
- "start": {
- "title": "Benvingut, Guardian!",
- "subtitle": "Anem a configurar la teva federació.",
- "step": "Detalls de la federació"
- },
- "set-config": {
- "title": "Necessitem establir algunes configuracions per a la teva Federació.",
- "title-solo": "Hem necessitat de configurar algunes opcions per a la teva Federació Solo.",
- "subtitle-leader": "Els teus seguidors de la Federació confirmaran aquesta informació per la seva banda.",
- "subtitle-solo": "Executar una Federació en Solitari perd molts dels beneficis de Fedimint. No tindràs tolerància a fallades en el consens si un guardian està fora de línia i no podràs fer còpies de seguretat federades. Procedeix amb precaució, no es recomana per a ús en producció ni per a l'ús amb Bitcoin de mainnet.",
- "subtitle-follower": "El teu líder de federació establirà els detalls principals de la federació. Els confirmaràs aviat.",
- "step": "Detalls de la federació"
- },
- "connect-guardians": {
- "title-leader": "Convida els teus Guardians",
- "title-follower": "Confirma la teva informació de Federació",
- "subtitle-leader": "Comparte el enlace amb els altres Guardians per fer que tothom estigui al mateix nivell. Un cop tots els Guardians s'uneixin, passaràs automàticament al següent pas.",
- "subtitle-follower": "Assegura't que la informació aquí sigui correcta i que els Guardians de la Federació ho siguin. Fes clic al botó Aprovar quan estiguis segur que tot es veu bé.",
- "step-leader": "Convida Guardians",
- "step-follower": "Confirma informació"
- },
- "run-dkg": {
- "title": "Èxit!",
- "subtitle": "Tots els Guardians han validat els detalls de configuració de la federació. Estic fent alguns càlculs..."
- },
- "verify-guardians": {
- "title": "Verifica els teus Guardians",
- "subtitle": "Demana a cada Guardian el seu codi de verificació i enganxa'ls a continuació per comprovar la validesa. Ja estem gairebé acabats!",
- "step": "Verifica guardians",
- "leader-confirm-done": "Confirmeu que tots els Guardians seguidors han fet clic a \"Següent\" i veieu els seus taulers de guardians abans de continuar.",
- "leader-confirm-done-emphasis": "Fent clic a \"Continuar\" es completarà la cerimònia de configuració."
- },
- "setup-complete": {
- "step": "Fet!"
- },
- "error": {
- "title": "Pas desconegut",
- "subtitle": "Com vas arribar aquí?!"
- }
- },
- "warning": {
- "title": "No sortiu ni actualitzeu durant la configuració!",
- "description": "Sortir durant la configuració pot fer que la configuració falli i haureu de fer un reinici complet."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Felicitats",
- "leader-message": "Tots els codis de verificació dels Guardians han estat verificats.",
- "follower-message": "Ja ho has acabat! Fes saber als altres Guardians que estàs en marxa!",
- "continue": "Continuar"
- },
- "terms-of-service": {
- "agree-and-continue": "Acceptar i continuar"
- },
- "verify-guardians": {
- "verified": "Verificat",
- "verified-placeholder": "Enganxa codi aquí",
- "error": "Alguna cosa ha anat malament.",
- "error-peer-id": "No es pot determinar quin company ets. Si us plau, actualitza i torna a provar.",
- "verification-code": "El teu codi de verificació",
- "verification-code-help": "Comparte este codi amb altres guardians",
- "table-title": "Codis de verificació del guardian",
- "table-description": "Introduïu els codis de verificació de cada Guardian a continuació.",
- "table-column-name": "Nom",
- "table-column-status": "Estat",
- "table-column-hash-input": "Enganxa el codi de verificació",
- "wait-all-guardians-verification": "Esperant que tots els Guardians verifiquin els seus codis",
- "all-guardians-verified": "Tots els Guardians han verificat els seus codis.",
- "starting-consensus": "Iniciant consens..."
- },
- "footer": {
- "docs-section-header": "Docs",
- "community-section-header": "Comunitat",
- "contribute-section-header": "Contribuir",
- "getting-started-link-text": "Començant",
- "faq-link-text": "Preguntes Freqüents",
- "blog-link-text": "Bloc",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/de.json b/apps/guardian-ui/src/languages/de.json
deleted file mode 100644
index 0f746bb4b..000000000
--- a/apps/guardian-ui/src/languages/de.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Nächste",
- "back": "Zurück",
- "error": "Etwas ist schiefgegangen.",
- "unknown": "Unbekannt",
- "remove": "Entfernen",
- "copy": "Kopieren",
- "copied": "Kopiert!",
- "cancel": "Stornieren",
- "review": "Überprüfung",
- "approvals": "Genehmigungen",
- "approve": "Genehmigen",
- "threshold": "Schwelle",
- "confirm": "Bestätigen",
- "you": "Du",
- "close": "Schließen",
- "save": "Speichern",
- "continue": "Fortsetzen",
- "submit": "Einreichen"
- },
- "notConfigured": {
- "title": "Nicht konfiguriert",
- "description": "Bitte geben Sie die CONFIG_API_URL des Fedimint-Wächter-Servers ein, um fortzufahren."
- },
- "connect-guardians": {
- "invite-guardians": "Follower einladen",
- "invite-guardians-help": "Teile diesen Link mit den anderen Wächtern.",
- "approve": "Genehmigen",
- "approved": "Genehmigt",
- "pending": "Ausstehend",
- "not-joined": "Nicht beigetreten",
- "waiting-for-guardian": "Warten auf den Vormund",
- "table-title": "Föderationswächter",
- "table-description": "Wächter werden hier bestätigt, sobald sie die Föderationseinstellungen bestätigen.",
- "meta-field-key": "Meta-Feld - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Lade Mitglieder ein oder authentifiziere dich als Wächter",
- "invite-members-prompt": "Teile dies, um Mitglieder einzuladen, der Föderation beizutreten.",
- "fed-info": {
- "label": "Föderationsinfo",
- "your-status-label": "Status",
- "block-count-label": "Konsens-Blockhöhe",
- "api-version-label": "API-Version",
- "consensus-version-label": "Konsensversion",
- "peer-id-label": "Peer-ID",
- "session-info": {
- "session-height": "Sitzungshöhe",
- "latest-session": "Neueste Sitzung"
- }
- },
- "balance": {
- "label": "Bilanz"
- },
- "bitcoin-node": {
- "label": "Bitcoin-Knoten",
- "url-label": "URL",
- "network-label": "Netzwerk"
- },
- "guardians": {
- "label": "Andere Wächter",
- "id-name-label": "ID: Name",
- "status-label": "Verbindungsstatus",
- "health-label": "Gesundheit",
- "health-issue": "Problem",
- "health-good": "Gut",
- "last-contribution-label": "Letzter Sitzungsbeitrag",
- "api-url-label": "API-URL",
- "fetching-announcement": "Abrufen der Ankündigung..."
- },
- "gateways": {
- "label": "Blitz-Gateways",
- "node-id-label": "Lightning-Knoten-ID",
- "gateway-id-label": "Gateway-ID",
- "fee-label": "Gateway-Gebühr",
- "view-on-site": "Ansicht auf {{site}}",
- "no-gateways-info-title": "Noch keine verbundenen Gateways!",
- "no-gateways-info-description": "Lightning-Node-Betreiber können sich mit Ihrer Föderation verbinden, um die Interoperabilität des Lightning-Netzwerks bereitzustellen. Sobald sie verbunden sind, werden sie hier angezeigt."
- },
- "api-announcements": {
- "label": "API-Ankündigungen",
- "guardian": "Wächter",
- "api-url": "API-URL",
- "revision": "Überarbeitung"
- },
- "config": {
- "label": "Föderationskonfiguration",
- "view-config": "Konfiguration anzeigen",
- "missing-meta-module": "Das Bearbeiten von Meta-Feldern ist nicht möglich. Das Meta-Modul ist für diese Föderation nicht verfügbar.",
- "manage-meta": {
- "label": "Meta verwalten",
- "cancel-button": "Stornieren",
- "confirm-modal": {
- "title": "Genehmigung bestätigen",
- "description": "Ihre Genehmigung wird die Schwelle erreichen, um diese Meta-Änderung anzunehmen. Ihre neue Meta wird folgendermaßen aussehen:"
- },
- "consensus-meta-label": "Aktuelles Meta im Konsens",
- "revoke-button": "Widerrufen",
- "no-consensus-meta-message": "es gibt keine Metadaten im Konsens",
- "proposed-meta-label": "Meta-Vorschläge",
- "propose-meta": "Meta vorschlagen",
- "propose-new-meta-button": "Neues Meta vorschlagen",
- "proposal-approved": "Sie haben diesen Vorschlag genehmigt.",
- "no-submitted-meta-message": "Es gibt keine Meta-Änderungen zu überprüfen.",
- "edit-meta-label": "Meta bearbeiten",
- "edit-consensus-meta-button": "Bearbeite Konsens-Meta",
- "submit-meta-proposal": "Meta-Vorschlag einreichen",
- "peer-approvals": "Peer-Genehmigungen",
- "actions": "Aktionen",
- "revision": "Überarbeitung",
- "setup-meta-title": "Ein Meta für Ihre Föderation einrichten",
- "setup-meta-description": "Fedimint kann zusätzlichen Informationen in Form von Metafeldern an Kunden bereitstellen: Schlüssel-Wert-Paare mit beliebigen Informationen, die Sie möglicherweise mit Kunden teilen möchten. Während diese Metafelder von Fedimint nicht interpretiert werden, sind sie konsensrelevant, d.h. sie dürfen zwischen den Mitgliedern der Föderation nicht abweichen. Auf diese Weise können sich die Kunden auf ihre Richtigkeit verlassen.",
- "propose-updates": "Als Fedimint-Wächter kannst du Updates für das Meta vorschlagen, die von den anderen Wächtern akzeptiert werden. Sobald das Update von einer Schwelle von Wächtern akzeptiert wird, wird es als das neue Konsens-Meta für die Föderation angenommen.",
- "core-meta-fields": "Die folgenden Metafelder wurden als Teil des Kernprotokolls von Fedimint definiert und sind nützlich, um sie in die Metadaten Ihrer Föderation aufzunehmen:",
- "meta-field-expiry": "Ein Unix-Zeitstempel, nach dem die Föderation heruntergefahren wird.",
- "meta-field-name": "Der menschenlesbare Name der Föderation",
- "meta-field-icon": "Eine URL zu einem Logo-Icon für die Föderation",
- "meta-field-welcome": "Eine Willkommensnachricht für neue Benutzer, die der Föderation beitreten.",
- "meta-field-gateways": "Eine Liste von Gateway-Identifikatoren, die von der Föderation geprüft wurden.",
- "your-own-fields": "Sie können auch Ihre eigenen beliebigen Metafelder zum Vorschlag hinzufügen. Diese werden dem Meta aller Clients hinzugefügt, die mit Ihrer Föderation verbunden sind, und können für jeden Zweck verwendet werden, den Sie wünschen.",
- "meta-effect-add": "Hinzufügen",
- "meta-effect-modify": "Ändern",
- "meta-effect-unchanged": "Unverändert",
- "proposals": "Vorschläge"
- }
- },
- "modal": {
- "client-connect": "Einen Client verbinden"
- },
- "danger-zone": {
- "danger-zone-label": "Gefahrenzone",
- "cancel": "Stornieren",
- "danger-zone-description": "Vorsicht!",
- "guardian-warning-message": "WARNUNG: Teilen Sie diesen Code nicht mit jemandem. Jeder, der diesen Code hat, kann sich als Guardian authentifizieren. Stellen Sie sicher, dass Sie sich an einem privaten Ort befinden und niemand Ihren Bildschirm beobachtet.",
- "guardian-acknowledge": "Bestätigen und Enthüllen Code",
- "acknowledge-and-download": "Bestätigen & Fortfahren",
- "guardian-authenticate": "Als Guardian authentifizieren",
- "guardian-connect-warning": "TEILEN SIE DAS NICHT",
- "backup": {
- "label": "Sicherung",
- "title": "Backup herunterladen",
- "warning-title": "Warnung",
- "warning-text": "Das Backup enthält private Schlüssel und geheime Materialien für den Föderationswächter und muss sicher aufbewahrt werden. Die Wiederherstellung mit diesem Backup erfordert Ihr Administratorkennwort!",
- "cancelButton": "Stornieren",
- "acknowledgeButton": "Annehmen & Herunterladen"
- },
- "sign-api-announcement": {
- "label": "Sign API Ankündigung",
- "title": "Sign API Ankündigung",
- "description": "Unterzeichnen Sie eine neue API-Ankündigung.",
- "current-api-url": "Ihre API-URL aus der lokalen Konfiguration",
- "announced-api-url": "Ihre API-URL von den Föderationsankündigungen",
- "urls-match": "Ihre aktuelle API-URL stimmt mit Ihrer angekündigten API-URL überein.",
- "urls-mismatch": "Sie haben die API-URL in Ihrer lokalen Konfiguration geändert und müssen eine neue API-Ankündigung verbreiten.",
- "sign-button": "Neue API-Ankündigung unterzeichnen",
- "signing-in-progress": "Anmeldung läuft...",
- "sign-tooltip": "Unterzeichnen Sie die API-Ankündigung, um Ihre API-URL an die Föderation bekannt zu geben."
- },
- "schedule-shutdown": {
- "label": "Geplante Abschaltung",
- "title": "Geplante Abschaltung",
- "description": "Planen Sie, dass Ihr Guardian-Knoten nach einer bestimmten Sitzungs-Höhe heruntergefahren wird, um ein koordiniertes Upgrade Ihrer Fedimintd-Binärdateien durchzuführen.",
- "current-session": "Aktuelle Sitzung",
- "session-to-shutdown": "Sitzung wird heruntergefahren um",
- "confirm-shutdown": "Shutdown bestätigen",
- "session-to-shutdown-helper": "Geben Sie die Sitzungsgröße ein, bei der Sie Ihren Guardian-Knoten herunterfahren möchten."
- }
- }
- },
- "login": {
- "title": "Willkommen zurück!",
- "subtitle": "Bitte geben Sie Ihr Passwort ein.",
- "password": "Passwort",
- "submit": "Einreichen"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint ist Beta-Software",
- "disclaimer-text": "Bitte melde Probleme unter https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Einrichtungsleiter",
- "description": "Geben Sie Konfigurationseinstellungen ein, die von anderen Hütern genehmigt werden. Ein Hüter fungiert als Setup-Leiter."
- },
- "follower": {
- "label": "Follower",
- "description": "Sobald ein Setup-Leiter die Konfigurationen festgelegt hat, wählen andere Wächter diese Option, um die Einstellungen zu genehmigen und die Föderation zu gründen."
- },
- "solo": {
- "label": "Allein",
- "description": "Betreiben Sie Fedimint als Solo Guardian ohne Konsens, Fehlertoleranz, föderierte Backups oder andere Resilienzvorteile von Fedimint. Gehen Sie vorsichtig vor, nicht für den produktiven Einsatz gedacht."
- },
- "warning-modal": {
- "title": "Ist jeder bereit?",
- "description": "Das Verlassen der Einrichtungszeremonie kann dazu führen, dass die Einrichtung fehlschlägt und Sie Ihren Wächter neu starten müssen. Stellen Sie sicher, dass alle bereit sind, die vollständige Einrichtung durchzuführen, bevor Sie fortfahren!"
- }
- },
- "run-dkg": {
- "error-config": "Fehler beim Ausführen der verteilten Schlüsselgenerierung. Die Federation-Konfiguration muss neu gestartet werden.",
- "error-default": "Nicht bereit für DKG, Ihr aktueller Status ist",
- "error-header": "Etwas ist schiefgelaufen.",
- "waiting-header": "Warten auf Peers...",
- "generating-header": "Codes generieren..."
- },
- "set-config": {
- "bft-explanation-title": "Byzantinische Fehlertoleranz Ihrer Föderation",
- "bft-explanation": "Eine {{total}} Wächterföderation schafft einen {{honest}}/{{total}} Schwellenwert.",
- "bft-faulty": "Ihre Föderation wird in der Lage sein, {{faulty}} fehlerhafte, offline oder böswillige Wächter zu tolerieren, ohne die Operationen der Föderation zu beeinträchtigen.",
- "guardian-name": "Wächtername",
- "guardian-name-help": "Dieser zufällige Name wird anderen Hütern während der Einrichtung angezeigt.",
- "admin-password": "Admin-Passwort",
- "admin-password-generate": "Generieren",
- "admin-password-set": "Klicken Sie auf 'Generieren', um ein sicheres Passwort zu erstellen. Sie können es ändern, aber dieses Passwort muss sicher und gesichert sein!",
- "admin-password-help": "Sichern Sie dieses Passwort und bewahren Sie es sicher auf! Sie können dieses Passwort nicht wiederherstellen!",
- "admin-password-backup": "Ich benutze ein starkes Passwort und habe es gesichert. (Sie können dieses Passwort nicht wiederherstellen!)",
- "confirm-password": "Passwort bestätigen",
- "error-password-mismatch": "Passwörter stimmen nicht überein",
- "join-federation": "Beitreten Föderationslink",
- "join-federation-help": "Frag die Person, die die Föderation erstellt hat, nach einem Link und füge ihn hier ein.",
- "basic-settings": "Grundlagen",
- "federation-settings": "Föderationseinstellungen",
- "federation-name": "Föderationsname",
- "guardian-number": "Anzahl der Wächter",
- "guardian-number-help": "Föderationen benötigen mindestens 4 Wächter. Dies kann später nicht geändert werden.",
- "bitcoin-settings": "Bitcoin-Einstellungen",
- "block-confirmations": "Zusätzliche Blockbestätigungen",
- "block-confirmations-help": "Fedimint-Wächter verfolgen die Blockchain-Spitze mit mehreren Bestätigungen, um Blockumorganisationen zu vermeiden.",
- "block-confirmations-warning": "Das Ausführen von Fedimint mit weniger als 5 zusätzlichen Blockbestätigungen ist äußerst riskant! Fedimint KANN keine Blockchain-Reorganisationen verarbeiten.",
- "bitcoin-network": "Bitcoin-Netzwerk",
- "select-network": "Wählen Sie ein Netzwerk aus",
- "set-rpc-help": "Lokal konfigurierten Bitcoin RPC-Adresse",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Bitte geben Sie eine gültige Nummer ein.",
- "error-valid-min": "Bitte geben Sie eine Zahl von mindestens {{min}} ein.",
- "error-valid-max": "Bitte geben Sie eine Zahl von höchstens {{max}} ein.",
- "error-valid-min-max": "Bitte geben Sie eine Zahl zwischen {{min}} und {{max}} ein.",
- "meta-fields": "Meta-Felder",
- "meta-fields-description": "Siehe Dokumentation für weitere Informationen.",
- "meta-fields-key": "Meta-Taste",
- "meta-fields-value": "Wert",
- "meta-fields-effect": "Effekt",
- "meta-fields-add-another": "Füge einen weiteren hinzu",
- "meta-fields-title": "Ihr Meta-Vorschlag:",
- "password-warning": "Sie müssen eine Sicherung Ihres Passworts machen und es sicher aufbewahren. Dieses Passwort ist erforderlich, um auf Ihren Wächter-Dashboard zuzugreifen. Sie können es nicht wiederherstellen, wenn Sie es verlieren!",
- "password-warning-title": "Sichern Sie Ihr Passwort!",
- "acknowledge-backed-up": "Ich, {{guardianName}} (dein Wächtername), verspreche, dass ich mein Passwort gesichert und gesichert habe:",
- "confirm-and-backup-password": "Passwort bestätigen und sichern",
- "error-guardian-name-mismatch": "Der Name des Vormunds stimmt nicht überein.",
- "network": "Netzwerk"
- },
- "setup": {
- "common": {
- "restart-setup": "Setup neu starten",
- "restart-setup-alert": "Der Setup-Leiter hat die Setup-Zeremonie neu gestartet. Bitte klicken Sie unten auf \"Neustarten\", um fortzufahren.",
- "confirm-restart-setup": "Sind Sie sicher, dass Sie die Einrichtungszeremonie neu starten möchten?",
- "confirm-restart-setup-alert": "Durch Klicken auf \"Neustart\" wird die Zeremonie für alle Wächter neu gestartet."
- },
- "progress": {
- "tos": {
- "title": "Nutzungsbedingungen"
- },
- "start": {
- "title": "Willkommen, Wächter!",
- "subtitle": "Lass uns deine Föderation einrichten.",
- "step": "Föderationsdetails"
- },
- "set-config": {
- "title": "Wir müssen einige Konfigurationen für Ihre Föderation festlegen.",
- "title-solo": "Wir müssen einige Konfigurationen für Ihre Solo-Föderation festlegen.",
- "subtitle-leader": "Ihre Föderationsanhänger werden diese Informationen auf ihrer Seite bestätigen.",
- "subtitle-solo": "Das Betreiben einer Solo-Föderation verliert viele der Vorteile von Fedimint. Sie werden keine Fehlertoleranz-Konsens haben, wenn ein Guardian offline ist, und können keine föderierten Backups durchführen. Gehen Sie vorsichtig vor, nicht empfohlen für den Produktionsgebrauch oder die Verwendung mit Mainnet Bitcoin.",
- "subtitle-follower": "Ihr Föderationsleiter wird die Hauptdetails der Föderation einrichten. Sie werden diese bald bestätigen.",
- "step": "Föderationsdetails"
- },
- "connect-guardians": {
- "title-leader": "Lade deine Wächter ein",
- "title-follower": "Bestätigen Sie Ihre Föderationsinformationen",
- "subtitle-leader": "Teile den Link mit den anderen Wächtern, um alle auf denselben Stand zu bringen. Sobald alle Wächter beitreten, wirst du automatisch zum nächsten Schritt übergehen.",
- "subtitle-follower": "Stellen Sie sicher, dass die Informationen hier korrekt sind und dass die Föderationswächter richtig sind. Klicken Sie auf die Schaltfläche Genehmigen, wenn Sie sicher sind, dass alles gut aussieht.",
- "step-leader": "Lade Wächter ein",
- "step-follower": "Bestätige Informationen"
- },
- "run-dkg": {
- "title": "Erfolg!",
- "subtitle": "Alle Wächter haben die Details zur Einrichtung der Föderation validiert. Einige Zahlen werden berechnet..."
- },
- "verify-guardians": {
- "title": "Überprüfen Sie Ihre Wächter",
- "subtitle": "Frage jeden Wächter nach seinem Verifizierungscode und füge ihn unten ein, um die Gültigkeit zu überprüfen. Wir sind fast fertig!",
- "step": "Überprüfen Sie die Vormünder",
- "leader-confirm-done": "Bestätigen Sie, dass alle nachfolgenden Wächter auf \"Weiter\" geklickt haben und sehen Sie sich ihre Wächter-Dashboards an, bevor Sie fortfahren.",
- "leader-confirm-done-emphasis": "Durch Klicken auf \"Weiter\" wird die Einrichtungszeremonie abgeschlossen."
- },
- "setup-complete": {
- "step": "Fertig!"
- },
- "error": {
- "title": "Unbekannter Schritt",
- "subtitle": "Wie bist du hierher gekommen?!"
- }
- },
- "warning": {
- "title": "Verlassen Sie nicht oder aktualisieren Sie während der Einrichtung!",
- "description": "Ein Abbruch während der Einrichtung kann dazu führen, dass die Einrichtung fehlschlägt, und Sie müssen einen neuen Neustart durchführen."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Herzlichen Glückwunsch",
- "leader-message": "Alle Verifizierungscodes der Wächter wurden überprüft.",
- "follower-message": "Du bist fertig! Lass die anderen Wächter wissen, dass du läufst!",
- "continue": "Fortsetzen"
- },
- "terms-of-service": {
- "agree-and-continue": "Zustimmen & fortfahren"
- },
- "verify-guardians": {
- "verified": "Verifiziert",
- "verified-placeholder": "Code hier einfügen",
- "error": "Etwas ist schiefgelaufen.",
- "error-peer-id": "Kann nicht bestimmt werden, welcher Peer Sie sind. Bitte aktualisieren Sie und versuchen Sie es erneut.",
- "verification-code": "Ihr Bestätigungscode",
- "verification-code-help": "Teile diesen Code mit anderen Wächtern.",
- "table-title": "Guardian-Verifizierungscodes",
- "table-description": "Geben Sie unten die Bestätigungscodes jedes Guardians ein.",
- "table-column-name": "Name",
- "table-column-status": "Status",
- "table-column-hash-input": "Überprüfungs-Code einfügen",
- "wait-all-guardians-verification": "Warten auf alle Wächter, um ihre Codes zu überprüfen",
- "all-guardians-verified": "Alle Wächter haben ihre Codes verifiziert.",
- "starting-consensus": "Konsens beginnen..."
- },
- "footer": {
- "docs-section-header": "Dokumente",
- "community-section-header": "Gemeinschaft",
- "contribute-section-header": "Beitragen",
- "getting-started-link-text": "Erste Schritte",
- "faq-link-text": "Häufig gestellte Fragen",
- "blog-link-text": "Blog",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/es.json b/apps/guardian-ui/src/languages/es.json
deleted file mode 100644
index a086aa825..000000000
--- a/apps/guardian-ui/src/languages/es.json
+++ /dev/null
@@ -1,347 +0,0 @@
-{
- "label": "Firmar anuncio de API",
- "title": "Firmar anuncio de API",
- "description": "Firme un nuevo anuncio de API.",
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Siguiente",
- "back": "Atrás",
- "error": "Algo salió mal.",
- "unknown": "Desconocido",
- "remove": "Eliminar",
- "copy": "Copiar",
- "copied": "¡Copiado!",
- "cancel": "Cancelar",
- "review": "Revisión",
- "approvals": "Aprobaciones",
- "approve": "Aprobar",
- "threshold": "Umbral",
- "confirm": "Confirmar",
- "you": "Tú",
- "close": "Cerrar",
- "save": "Guardar",
- "continue": "Continuar",
- "submit": "Enviar"
- },
- "notConfigured": {
- "title": "No configurado",
- "description": "Por favor, ingrese la URL del servidor de configuración de Fedimint para continuar."
- },
- "connect-guardians": {
- "invite-guardians": "Invitar seguidores",
- "invite-guardians-help": "Comparte este enlace con los otros Guardianes.",
- "approve": "Aprobar",
- "approved": "Aprobado",
- "pending": "Pendiente",
- "not-joined": "No unido",
- "waiting-for-guardian": "Esperando al guardián",
- "table-title": "Guardianes de la Federación",
- "table-description": "Los guardianes se confirmarán aquí una vez que confirmen la configuración de la Federación.",
- "meta-field-key": "Campo meta - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Invitar miembros o autenticar como un guardián",
- "invite-members-prompt": "Comparte esto para invitar a miembros a unirse a la federación.",
- "fed-info": {
- "label": "Información de la Federación",
- "your-status-label": "Estado",
- "block-count-label": "Altura del bloque de consenso",
- "api-version-label": "versión de la API",
- "consensus-version-label": "Versión de consenso",
- "peer-id-label": "ID de compañero",
- "session-info": {
- "session-height": "Altura de la sesión",
- "latest-session": "Última sesión"
- }
- },
- "balance": {
- "label": "Balance General"
- },
- "bitcoin-node": {
- "label": "Nodo de Bitcoin",
- "url-label": "URL",
- "network-label": "Red"
- },
- "guardians": {
- "label": "Otros Guardianes",
- "id-name-label": "ID: Nombre",
- "status-label": "Estado de conexión",
- "health-label": "Salud",
- "health-issue": "Problema",
- "health-good": "Bueno",
- "last-contribution-label": "Última contribución de sesión",
- "api-url-label": "URL de la API",
- "fetching-announcement": "Obteniendo anuncio..."
- },
- "gateways": {
- "label": "Puertas Relámpago",
- "node-id-label": "ID de Nodo Lightning",
- "gateway-id-label": "ID de puerta de enlace",
- "fee-label": "Tarifa de puerta",
- "view-on-site": "Ver en {{site}}",
- "no-gateways-info-title": "¡No hay puertas de enlace conectadas aún!",
- "no-gateways-info-description": "Los operadores de nodos Lightning pueden conectarse a tu federación para proporcionar interoperabilidad de la Lightning Network. Una vez conectados, aparecerán aquí."
- },
- "api-announcements": {
- "label": "Anuncios de API",
- "guardian": "Guardia",
- "api-url": "URL de la API",
- "revision": "Revisión"
- },
- "config": {
- "label": "Configuración de Federación",
- "view-config": "Ver configuración",
- "missing-meta-module": "No es posible editar los campos Meta. El módulo Meta no está disponible para esta federación.",
- "manage-meta": {
- "label": "Gestionar Meta",
- "cancel-button": "Cancelar",
- "confirm-modal": {
- "title": "Confirmar Aprobación",
- "description": "Su aprobación alcanzará el umbral para adoptar este cambio meta. Su nueva meta se verá así:"
- },
- "consensus-meta-label": "Meta actual en consenso",
- "revoke-button": "Revocar",
- "no-consensus-meta-message": "no hay meta en el consenso",
- "proposed-meta-label": "Propuestas Meta",
- "propose-meta": "Proponer Meta",
- "propose-new-meta-button": "Proponer nuevo meta",
- "proposal-approved": "Has aprobado esta propuesta.",
- "no-submitted-meta-message": "no hay ediciones meta para revisar",
- "edit-meta-label": "Editar meta",
- "edit-consensus-meta-button": "Editar Meta de Consenso",
- "submit-meta-proposal": "Enviar propuesta de Meta",
- "peer-approvals": "Aprobaciones de compañeros",
- "actions": "Acciones",
- "revision": "Revisión",
- "setup-meta-title": "Configurando un Meta para tu Federación",
- "setup-meta-description": "Fedimint puede proporcionar información adicional a los clientes en forma de campos meta: pares de clave-valor con información arbitraria que desees compartir con los clientes. Aunque estos campos meta no son interpretados por Fedimint, son relevantes para el consenso, es decir, no pueden diferir entre los miembros de la federación. De esta manera, los clientes pueden confiar en su corrección.",
- "propose-updates": "Como guardián de fedimint, puedes proponer actualizaciones al meta que serán aceptadas por los otros guardianes. Una vez que la actualización sea aceptada por un umbral de guardianes, se adoptará como el nuevo meta de consenso para la federación.",
- "core-meta-fields": "Los siguientes campos meta se han definido como parte del protocolo central de Fedimint y son útiles para incluir en el meta de su federación:",
- "meta-field-expiry": "Un timestamp de Unix después del cual la federación se cerrará.",
- "meta-field-name": "El nombre legible por humanos de la federación",
- "meta-field-icon": "Una URL a un ícono de logo para la federación",
- "meta-field-welcome": "Un mensaje de bienvenida para los nuevos usuarios que se unen a la federación.",
- "meta-field-gateways": "Una lista de identificadores de puerta de enlace verificados por la federación",
- "your-own-fields": "También puedes agregar tus propios campos meta arbitrarios a la propuesta. Estos se añadirán a la meta de todos los clientes que se conecten a tu federación y se pueden utilizar para cualquier propósito que desees.",
- "meta-effect-add": "Agregar",
- "meta-effect-modify": "Modificar",
- "meta-effect-unchanged": "Sin cambios",
- "proposals": "Propuestas"
- }
- },
- "modal": {
- "client-connect": "Conectar un cliente"
- },
- "danger-zone": {
- "danger-zone-label": "Zona de Peligro",
- "cancel": "Cancelar",
- "danger-zone-description": "¡Usar con precaución!",
- "guardian-warning-message": "ADVERTENCIA: No compartas este código con nadie. Cualquiera que tenga este código puede autenticarse como un Guardián. Asegúrate de estar en un lugar privado y de que nadie esté mirando tu pantalla.",
- "guardian-acknowledge": "Reconocer y Revelar Código",
- "acknowledge-and-download": "Reconocer y Proceder",
- "guardian-authenticate": "Autenticarse como Guardián",
- "guardian-connect-warning": "NO COMPARTAS ESTO",
- "backup": {
- "label": "Copia de seguridad",
- "title": "Descargar copia de seguridad",
- "warning-title": "Advertencia",
- "warning-text": "La copia de seguridad contiene claves privadas y material secreto para el guardián de la federación y debe mantenerse seguro. ¡La recuperación utilizando esta copia de seguridad requiere tu contraseña de administrador!",
- "cancelButton": "Cancelar",
- "acknowledgeButton": "Reconocer y Descargar"
- },
- "sign-api-announcement": {
- "label": "Anuncio de la API de Firmas",
- "title": "Anuncio de la API de Firmas",
- "description": "Firmar un nuevo anuncio de API.",
- "current-api-url": "Tu URL de API de Configuración Local",
- "announced-api-url": "Tu URL de API de Anuncios de Federación",
- "urls-match": "La URL de tu API actual coincide con la URL de tu API anunciada.",
- "urls-mismatch": "Has cambiado la URL de la API en tu configuración local y necesitas hacer un nuevo anuncio de la API.",
- "sign-button": "Anuncio de nueva API",
- "signing-in-progress": "Iniciando sesión...",
- "sign-tooltip": "Firma el anuncio de la API para anunciar tu URL de API a la federación."
- },
- "schedule-shutdown": {
- "label": "Programar Apagado",
- "title": "Programar Apagado",
- "description": "Programa tu nodo guardián para que se apague después de una altura de sesión específica para una actualización coordinada de tus binarios de fedimintd.",
- "current-session": "Sesión actual",
- "session-to-shutdown": "Sesión para apagar en",
- "confirm-shutdown": "Confirmar apagado",
- "session-to-shutdown-helper": "Ingresa la altura de la sesión en la que deseas apagar tu nodo guardián."
- }
- }
- },
- "login": {
- "title": "¡Bienvenido de nuevo!",
- "subtitle": "Por favor, introduce tu contraseña.",
- "password": "Contraseña",
- "submit": "Enviar"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint es un software beta.",
- "disclaimer-text": "Por favor, informe de los problemas en https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Configuración de líder",
- "description": "Ingrese la configuración que otros Guardianes aprueban. Un Guardián actúa como Líder de Configuración."
- },
- "follower": {
- "label": "Seguidor",
- "description": "Una vez que un Líder de Configuración establece las configuraciones, otros Guardianes eligen esta opción para aprobar los ajustes y crear la Federación."
- },
- "solo": {
- "label": "Solo",
- "description": "Opera Fedimint como un Guardián Solo sin consenso, tolerancia a fallos, copias de seguridad federadas u otros beneficios de resiliencia de Fedimint. Procede con precaución, no está destinado para uso en producción."
- },
- "warning-modal": {
- "title": "¿Está todo el mundo listo?",
- "description": "Salir de la ceremonia de configuración puede hacer que la configuración falle y requerir que reinicies tu guardián. ¡Asegúrate de que todos estén listos para ejecutar la configuración completa antes de continuar!"
- }
- },
- "run-dkg": {
- "error-config": "Error al ejecutar la generación de claves distribuida. La configuración de la federación debe reiniciarse.",
- "error-default": "No estás listo para DKG, tu estado actual es",
- "error-header": "Algo salió mal.",
- "waiting-header": "Esperando a los compañeros...",
- "generating-header": "Generando códigos..."
- },
- "set-config": {
- "bft-explanation-title": "Tolerancia a fallos bizantinos de su federación",
- "bft-explanation": "Una {{total}} Federación de Guardianes crea un {{honesto}}/{{total}} Umbral.",
- "bft-faulty": "Tu Federación podrá tolerar {{faulty}} Guardianes defectuosos, fuera de línea o maliciosos sin afectar las operaciones de la Federación.",
- "guardian-name": "Nombre del guardián",
- "guardian-name-help": "Este nombre aleatorio se mostrará a otros Guardianes durante la configuración.",
- "admin-password": "Contraseña de administrador",
- "admin-password-generate": "Generar",
- "admin-password-set": "Haz clic en 'Generar' para crear una contraseña segura. Puedes modificarla, pero esta contraseña debe ser segura y estar respaldada.",
- "admin-password-help": "¡Haz una copia de esta contraseña y guárdala en un lugar seguro! ¡No puedes recuperar esta contraseña!",
- "admin-password-backup": "Estoy usando una contraseña fuerte y la he respaldado. (¡No puedes recuperar esta contraseña!)",
- "confirm-password": "Confirmar contraseña",
- "error-password-mismatch": "Las contraseñas no coinciden",
- "join-federation": "Unirse al enlace de la Federación",
- "join-federation-help": "Pide a la persona que creó la Federación un enlace y pégalo aquí.",
- "basic-settings": "Conceptos básicos",
- "federation-settings": "Configuraciones de la federación",
- "federation-name": "Nombre de la federación",
- "guardian-number": "Número de guardianes",
- "guardian-number-help": "Las federaciones requieren un mínimo de 4 guardianes. Esto no se puede cambiar más tarde.",
- "bitcoin-settings": "Configuraciones de Bitcoin",
- "block-confirmations": "Confirmaciones de Bloque Adicionales",
- "block-confirmations-help": "Los Guardianes de Fedimint siguen la punta de la blockchain por varias confirmaciones para evitar reorganizaciones de bloques.",
- "block-confirmations-warning": "¡Ejecutar Fedimint con menos de 5 confirmaciones adicionales de bloque es extremadamente arriesgado! Fedimint NO PUEDE manejar reorganizaciones de blockchain.",
- "bitcoin-network": "Red de Bitcoin",
- "select-network": "Selecciona una red",
- "set-rpc-help": "Dirección RPC de Bitcoin configurada localmente",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Por favor, introduce un número válido.",
- "error-valid-min": "Por favor, introduce un número de al menos {{min}}.",
- "error-valid-max": "Por favor, introduce un número de como máximo {{max}}.",
- "error-valid-min-max": "Por favor, introduce un número entre {{min}} y {{max}}.",
- "meta-fields": "Campos meta",
- "meta-fields-description": "Consulta la documentación para más información.",
- "meta-fields-key": "Clave meta",
- "meta-fields-value": "Valor",
- "meta-fields-effect": "Efecto",
- "meta-fields-add-another": "Agregar otro",
- "meta-fields-title": "Tu Propuesta Meta:",
- "password-warning": "Debes hacer una copia de seguridad de tu contraseña y guardarla en un lugar seguro. Esta contraseña es necesaria para acceder a tu tablero de guardianes. ¡No puedes recuperarla si la pierdes!",
- "password-warning-title": "¡Haz una copia de seguridad de tu contraseña!",
- "acknowledge-backed-up": "Yo, {{guardianName}} (tu nombre de guardián), prometo que he respaldado y asegurado mi contraseña:",
- "confirm-and-backup-password": "Confirmar y respaldar contraseña",
- "error-guardian-name-mismatch": "El nombre del guardián no coincide.",
- "network": "Red"
- },
- "setup": {
- "common": {
- "restart-setup": "Reiniciar configuración",
- "restart-setup-alert": "El Líder de Configuración ha reiniciado la Ceremonia de Configuración. Por favor, haga clic en \"Reiniciar\" a continuación para continuar.",
- "confirm-restart-setup": "¿Estás seguro de que quieres reiniciar la Ceremonia de Configuración?",
- "confirm-restart-setup-alert": "Hacer clic en \"Reiniciar\" reiniciará la ceremonia para todos los Guardianes."
- },
- "progress": {
- "tos": {
- "title": "Términos de servicio"
- },
- "start": {
- "title": "¡Bienvenido, Guardián!",
- "subtitle": "Vamos a configurar tu federación.",
- "step": "Detalles de la federación"
- },
- "set-config": {
- "title": "Necesitamos establecer algunas configuraciones para tu Federación.",
- "title-solo": "Necesitamos establecer algunas configuraciones para tu Federación Solo.",
- "subtitle-leader": "Sus seguidores de la Federación confirmarán esta información por su parte.",
- "subtitle-solo": "Ejecutar una Federación en solitario pierde muchos de los beneficios de Fedimint. No tendrás tolerancia a fallos en el consenso si un guardián está fuera de línea y no podrás realizar copias de seguridad federadas. Procede con precaución, no se recomienda para uso en producción o uso con Bitcoin en la red principal.",
- "subtitle-follower": "Tu líder de Federación estará configurando los detalles principales de la Federación. Los confirmarás pronto.",
- "step": "Detalles de la federación"
- },
- "connect-guardians": {
- "title-leader": "Invita a tus Guardianes",
- "title-follower": "Confirma tu información de la Federación",
- "subtitle-leader": "Comparte el enlace con los otros Guardianes para que todos estén en la misma página. Una vez que todos los Guardianes se unan, pasarás automáticamente al siguiente paso.",
- "subtitle-follower": "Asegúrate de que la información aquí sea correcta y de que los Guardianes de la Federación estén correctos. Haz clic en el botón Aprobar cuando estés seguro de que se ve bien.",
- "step-leader": "Invitar a los Guardianes",
- "step-follower": "Confirmar información"
- },
- "run-dkg": {
- "title": "¡Éxito!",
- "subtitle": "Todos los Guardianes han validado los detalles de configuración de la federación. Ejecutando algunos números..."
- },
- "verify-guardians": {
- "title": "Verifica tus Guardianes",
- "subtitle": "Pide a cada Guardián su código de verificación y pégalo a continuación para comprobar su validez. ¡Estamos casi listos!",
- "step": "Verificar tutores",
- "leader-confirm-done": "Confirma que todos los Guardianes seguidores han hecho clic en \"Siguiente\" y ve sus paneles de control de guardianes antes de continuar.",
- "leader-confirm-done-emphasis": "Hacer clic en \"Continuar\" completará la ceremonia de configuración."
- },
- "setup-complete": {
- "step": "¡Hecho!"
- },
- "error": {
- "title": "Paso desconocido",
- "subtitle": "¿Cómo llegaste aquí?!"
- }
- },
- "warning": {
- "title": "¡No salgas ni actualices durante la configuración!",
- "description": "Salir durante la configuración puede hacer que la configuración falle y tendrás que reiniciar desde cero."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Felicidades",
- "leader-message": "Todos los códigos de verificación de los Guardianes han sido verificados.",
- "follower-message": "¡Ya has terminado! ¡Avisa a los otros Guardianes que estás en marcha!",
- "continue": "Continuar"
- },
- "terms-of-service": {
- "agree-and-continue": "Aceptar y continuar"
- },
- "verify-guardians": {
- "verified": "Verificado",
- "verified-placeholder": "Pega el código aquí",
- "error": "Algo salió mal.",
- "error-peer-id": "No se puede determinar qué par eres. Por favor, actualiza y vuelve a intentarlo.",
- "verification-code": "Tu código de verificación",
- "verification-code-help": "Comparte este código con otros guardianes.",
- "table-title": "Códigos de verificación del guardián",
- "table-description": "Ingresa los códigos de verificación de cada Guardián a continuación.",
- "table-column-name": "Nombre",
- "table-column-status": "Estado",
- "table-column-hash-input": "Pegar el código de verificación",
- "wait-all-guardians-verification": "Esperando a que todos los Guardianes verifiquen sus códigos",
- "all-guardians-verified": "Todos los Guardianes han verificado sus códigos.",
- "starting-consensus": "Iniciando consenso..."
- },
- "footer": {
- "docs-section-header": "Documentos",
- "community-section-header": "Comunidad",
- "contribute-section-header": "Contribuir",
- "getting-started-link-text": "Comenzando",
- "faq-link-text": "Preguntas Frecuentes",
- "blog-link-text": "Blog",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/fr.json b/apps/guardian-ui/src/languages/fr.json
deleted file mode 100644
index ddf84e5e6..000000000
--- a/apps/guardian-ui/src/languages/fr.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Suivant",
- "back": "Retour",
- "error": "Quelque chose a mal tourné.",
- "unknown": "Inconnu",
- "remove": "Retirer",
- "copy": "Copier",
- "copied": "Copié !",
- "cancel": "Annuler",
- "review": "Révision",
- "approvals": "Approbations",
- "approve": "Approuver",
- "threshold": "Seuil",
- "confirm": "Confirmer",
- "you": "Vous",
- "close": "Fermer",
- "save": "Sauvegarder",
- "continue": "Continuer",
- "submit": "Envoyer"
- },
- "notConfigured": {
- "title": "Non configuré",
- "description": "Veuillez entrer l'URL du serveur de configuration Fedimint pour continuer."
- },
- "connect-guardians": {
- "invite-guardians": "Inviter des abonnés",
- "invite-guardians-help": "Partagez ce lien avec les autres Gardiens.",
- "approve": "Approuver",
- "approved": "Approuvé",
- "pending": "En attente",
- "not-joined": "Non rejoint",
- "waiting-for-guardian": "En attente du gardien",
- "table-title": "Gardiens de la Fédération",
- "table-description": "Les gardiens seront confirmés ici une fois qu'ils auront confirmé les paramètres de la Fédération.",
- "meta-field-key": "Champ méta - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Invitez des membres ou authentifiez-vous en tant que gardien",
- "invite-members-prompt": "Partagez ceci pour inviter des membres à rejoindre la fédération.",
- "fed-info": {
- "label": "Informations sur la fédération",
- "your-status-label": "Statut",
- "block-count-label": "Hauteur de bloc de consensus",
- "api-version-label": "Version de l'API",
- "consensus-version-label": "Version de consensus",
- "peer-id-label": "ID de pair",
- "session-info": {
- "session-height": "Hauteur de la session",
- "latest-session": "Dernière session"
- }
- },
- "balance": {
- "label": "Bilan"
- },
- "bitcoin-node": {
- "label": "Nœud Bitcoin",
- "url-label": "URL",
- "network-label": "Réseau"
- },
- "guardians": {
- "label": "Autres Gardiens",
- "id-name-label": "ID : Nom",
- "status-label": "État de la connexion",
- "health-label": "Santé",
- "health-issue": "Problème",
- "health-good": "Bon",
- "last-contribution-label": "Dernière contribution de session",
- "api-url-label": "URL de l'API",
- "fetching-announcement": "Récupération de l'annonce..."
- },
- "gateways": {
- "label": "Passerelles Éclair",
- "node-id-label": "ID de nœud Lightning",
- "gateway-id-label": "ID de passerelle",
- "fee-label": "Frais de passerelle",
- "view-on-site": "Voir sur {{site}}",
- "no-gateways-info-title": "Aucun passerelle connectée pour l'instant !",
- "no-gateways-info-description": "Les opérateurs de nœuds Lightning peuvent se connecter à votre fédération pour fournir une interopérabilité avec le Lightning Network. Une fois connectés, ils apparaîtront ici."
- },
- "api-announcements": {
- "label": "Annonces API",
- "guardian": "Gardien",
- "api-url": "URL de l'API",
- "revision": "Révision"
- },
- "config": {
- "label": "Configuration de la Fédération",
- "view-config": "Afficher la configuration",
- "missing-meta-module": "L'édition des champs Meta n'est pas possible. Le module Meta n'est pas disponible pour cette fédération.",
- "manage-meta": {
- "label": "Gérer Meta",
- "cancel-button": "Annuler",
- "confirm-modal": {
- "title": "Confirmer l'approbation",
- "description": "Votre approbation atteindra le seuil pour adopter ce changement de méta. Votre nouvelle méta ressemblera à :"
- },
- "consensus-meta-label": "Meta actuel dans le consensus",
- "revoke-button": "Révoquer",
- "no-consensus-meta-message": "il n'y a pas de méta dans le consensus",
- "proposed-meta-label": "Propositions Meta",
- "propose-meta": "Proposer Meta",
- "propose-new-meta-button": "Proposer un nouveau méta",
- "proposal-approved": "Vous avez approuvé cette proposition.",
- "no-submitted-meta-message": "il n'y a pas de modifications méta à examiner",
- "edit-meta-label": "Modifier les métadonnées",
- "edit-consensus-meta-button": "Modifier le consensus Meta",
- "submit-meta-proposal": "Soumettre une proposition Meta",
- "peer-approvals": "Approbations par les pairs",
- "actions": "Actions",
- "revision": "Révision",
- "setup-meta-title": "Configurer un Meta pour votre Fédération",
- "setup-meta-description": "Fedimint peut fournir des informations supplémentaires aux clients sous forme de champs méta : des paires clé-valeur avec des informations arbitraires que vous pourriez vouloir partager avec les clients. Bien que ces champs méta ne soient pas interprétés par Fedimint, ils sont pertinents pour le consensus, c'est-à-dire qu'ils ne peuvent pas différer entre les membres de la fédération. De cette manière, les clients peuvent compter sur leur exactitude.",
- "propose-updates": "En tant que gardien de fedimint, vous pouvez proposer des mises à jour du méta qui seront acceptées par les autres gardiens. Une fois la mise à jour acceptée par un seuil de gardiens, elle sera adoptée comme le nouveau méta de consensus pour la fédération.",
- "core-meta-fields": "Les champs méta suivants ont été définis dans le cadre du protocole Fedimint de base et sont utiles à inclure pour le méta de votre fédération :",
- "meta-field-expiry": "Un horodatage Unix après lequel la fédération sera arrêtée.",
- "meta-field-name": "Le nom lisible par l'homme de la fédération",
- "meta-field-icon": "Une URL vers une icône de logo pour la fédération",
- "meta-field-welcome": "Un message de bienvenue pour les nouveaux utilisateurs rejoignant la fédération.",
- "meta-field-gateways": "Une liste d'identifiants de passerelle vérifiés par la fédération",
- "your-own-fields": "Vous pouvez également ajouter vos propres champs méta arbitraires à la proposition. Ceux-ci seront ajoutés aux méta de tous les clients qui se connectent à votre fédération et peuvent être utilisés à toutes fins que vous souhaitez.",
- "meta-effect-add": "Ajouter",
- "meta-effect-modify": "Modifier",
- "meta-effect-unchanged": "Inchangé",
- "proposals": "Propositions"
- }
- },
- "modal": {
- "client-connect": "Connecter un client"
- },
- "danger-zone": {
- "danger-zone-label": "Zone de danger",
- "cancel": "Annuler",
- "danger-zone-description": "Utilisez avec précaution !",
- "guardian-warning-message": "AVERTISSEMENT : Ne partagez pas ce code avec qui que ce soit. Quiconque possède ce code peut s'authentifier en tant que Gardien. Assurez-vous d'être dans un endroit privé et que personne ne regarde votre écran.",
- "guardian-acknowledge": "Reconnaître et révéler le code",
- "acknowledge-and-download": "Reconnaître et continuer",
- "guardian-authenticate": "S'authentifier en tant que Gardien",
- "guardian-connect-warning": "NE PAS PARTAGER CECI",
- "backup": {
- "label": "Sauvegarde",
- "title": "Télécharger la sauvegarde",
- "warning-title": "Avertissement",
- "warning-text": "La sauvegarde contient des clés privées et des matériaux secrets pour le gardien de la fédération et doit être conservée en sécurité. La récupération à l'aide de cette sauvegarde nécessite votre mot de passe administrateur !",
- "cancelButton": "Annuler",
- "acknowledgeButton": "Reconnaître et télécharger"
- },
- "sign-api-announcement": {
- "label": "Annonce de l'API de signature",
- "title": "Annonce de l'API de signature",
- "description": "Signer une nouvelle annonce d'API.",
- "current-api-url": "Votre URL d'API depuis la configuration locale",
- "announced-api-url": "Votre URL d'API des Annonces de Fédération",
- "urls-match": "Votre URL d'API actuelle correspond à votre URL d'API annoncée.",
- "urls-mismatch": "Vous avez changé l'URL de l'API dans votre configuration locale et devez diffuser une nouvelle annonce API.",
- "sign-button": "Annonce de la nouvelle API",
- "signing-in-progress": "Connexion en cours...",
- "sign-tooltip": "Signez l'annonce de l'API pour annoncer votre URL d'API à la fédération."
- },
- "schedule-shutdown": {
- "label": "Planifier l'arrêt",
- "title": "Planifier l'arrêt",
- "description": "Programmez votre nœud de garde pour s'arrêter après une hauteur de session spécifique pour une mise à niveau coordonnée de vos binaires fedimintd.",
- "current-session": "Session actuelle",
- "session-to-shutdown": "Session à fermer à",
- "confirm-shutdown": "Confirmer l'arrêt",
- "session-to-shutdown-helper": "Entrez la hauteur de session à laquelle vous souhaitez éteindre votre nœud gardien."
- }
- }
- },
- "login": {
- "title": "Bienvenue de nouveau !",
- "subtitle": "Veuillez entrer votre mot de passe.",
- "password": "Mot de passe",
- "submit": "Soumettre"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint est un logiciel bêta",
- "disclaimer-text": "Veuillez signaler les problèmes à https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Leader de configuration",
- "description": "Entrez les paramètres de configuration que d'autres Gardiens approuvent. Un Gardien agit en tant que Leader de Configuration."
- },
- "follower": {
- "label": "Abonné",
- "description": "Une fois qu'un Leader de Configuration a défini les configurations, d'autres Gardiens choisissent cette option pour approuver les paramètres et créer la Fédération."
- },
- "solo": {
- "label": "Seul",
- "description": "Exécutez Fedimint en tant que Gardien Solo sans consensus, tolérance aux pannes, sauvegardes fédérées ou autres avantages de résilience de Fedimint. Procédez avec prudence, ce n'est pas destiné à un usage en production."
- },
- "warning-modal": {
- "title": "Tout le monde est prêt ?",
- "description": "Sortir de la cérémonie de configuration peut entraîner l'échec de la configuration et nécessiter que vous redémarriez votre gardien. Assurez-vous que tout le monde est prêt à exécuter la configuration complète avant de continuer !"
- }
- },
- "run-dkg": {
- "error-config": "Échec de l'exécution de la génération de clés distribuées. La configuration de la fédération doit être redémarrée.",
- "error-default": "Pas prêt pour DKG, votre statut actuel est",
- "error-header": "Quelque chose a mal tourné.",
- "waiting-header": "En attente de pairs...",
- "generating-header": "Génération de codes..."
- },
- "set-config": {
- "bft-explanation-title": "Tolérance aux fautes byzantines de votre fédération",
- "bft-explanation": "Un {{total}} de la Fédération des Gardiens crée un {{honest}}/{{total}} Seuil.",
- "bft-faulty": "Votre Fédération sera en mesure de tolérer {{faulty}} des Gardiens défectueux, hors ligne ou malveillants sans impacter les opérations de la Fédération.",
- "guardian-name": "Nom du gardien",
- "guardian-name-help": "Ce nom aléatoire sera affiché aux autres Gardiens pendant la configuration.",
- "admin-password": "Mot de passe administrateur",
- "admin-password-generate": "Générer",
- "admin-password-set": "Cliquez sur 'Générer' pour créer un mot de passe sécurisé. Vous pouvez le modifier, mais ce mot de passe doit être sécurisé et sauvegardé !",
- "admin-password-help": "Sauvegardez ce mot de passe et gardez-le en sécurité ! Vous ne pouvez pas récupérer ce mot de passe !",
- "admin-password-backup": "J'utilise un mot de passe fort et je l'ai sauvegardé. (Vous ne pouvez pas récupérer ce mot de passe !)",
- "confirm-password": "Confirmer le mot de passe",
- "error-password-mismatch": "Les mots de passe ne correspondent pas.",
- "join-federation": "Rejoindre le lien de la Fédération",
- "join-federation-help": "Demandez à la personne qui a créé la Fédération un lien et collez-le ici.",
- "basic-settings": "Bases",
- "federation-settings": "Paramètres de la fédération",
- "federation-name": "Nom de la fédération",
- "guardian-number": "Nombre de gardiens",
- "guardian-number-help": "Les fédérations nécessitent un minimum de 4 gardiens. Cela ne peut pas être modifié par la suite.",
- "bitcoin-settings": "Paramètres Bitcoin",
- "block-confirmations": "Confirmations de blocs supplémentaires",
- "block-confirmations-help": "Les gardiens de Fedimint suivent le sommet de la blockchain avec plusieurs confirmations pour éviter les réorganisations de blocs.",
- "block-confirmations-warning": "Exécuter Fedimint avec moins de 5 confirmations de bloc supplémentaires est extrêmement risqué ! Fedimint NE PEUT PAS gérer les réorganisations de blockchain.",
- "bitcoin-network": "Réseau Bitcoin",
- "select-network": "Sélectionnez un réseau",
- "set-rpc-help": "Adresse RPC Bitcoin configurée localement",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Veuillez saisir un numéro valide.",
- "error-valid-min": "Veuillez entrer un nombre d'au moins {{min}}.",
- "error-valid-max": "Veuillez saisir un nombre d'au plus {{max}}.",
- "error-valid-min-max": "Veuillez entrer un nombre entre {{min}} et {{max}}.",
- "meta-fields": "Champs méta",
- "meta-fields-description": "Voir documentation pour plus d'informations.",
- "meta-fields-key": "Touche Meta",
- "meta-fields-value": "Valeur",
- "meta-fields-effect": "Effet",
- "meta-fields-add-another": "Ajouter un autre",
- "meta-fields-title": "Votre proposition Meta :",
- "password-warning": "Vous devez faire une sauvegarde de votre mot de passe et le conserver en sécurité. Ce mot de passe est nécessaire pour accéder à votre tableau de bord de gardien. Vous ne pouvez pas le récupérer si vous le perdez !",
- "password-warning-title": "Faites une sauvegarde de votre mot de passe !",
- "acknowledge-backed-up": "Je, {{guardianName}} (votre nom de gardien), promets que j'ai sauvegardé et sécurisé mon mot de passe :",
- "confirm-and-backup-password": "Confirmer et sauvegarder le mot de passe",
- "error-guardian-name-mismatch": "Le nom du tuteur ne correspond pas.",
- "network": "Réseau"
- },
- "setup": {
- "common": {
- "restart-setup": "Redémarrer l'installation",
- "restart-setup-alert": "Le Responsable de la Configuration a redémarré la Cérémonie de Configuration. Veuillez cliquer sur \"Redémarrer\" ci-dessous pour continuer.",
- "confirm-restart-setup": "Êtes-vous sûr de vouloir redémarrer la cérémonie de configuration ?",
- "confirm-restart-setup-alert": "Cliquer sur \"Redémarrer\" redémarrera la cérémonie pour tous les Gardiens."
- },
- "progress": {
- "tos": {
- "title": "Conditions d'utilisation"
- },
- "start": {
- "title": "Bienvenue, Gardien !",
- "subtitle": "Mettons en place votre fédération.",
- "step": "Détails de la fédération"
- },
- "set-config": {
- "title": "Nous devons définir certaines configurations pour votre Fédération.",
- "title-solo": "Nous devons définir certaines configurations pour votre Fédération Solo.",
- "subtitle-leader": "Vos abonnés de la Fédération confirmeront cette information de leur côté.",
- "subtitle-solo": "Exécuter une fédération solo perd de nombreux avantages de Fedimint. Vous n'aurez pas de consensus de tolérance aux pannes si un gardien est hors ligne et vous ne pourrez pas effectuer de sauvegardes fédérées. Proceed with caution, non recommandé pour une utilisation en production ou avec le Bitcoin sur le réseau principal.",
- "subtitle-follower": "Votre leader de la fédération va configurer les détails principaux de la fédération. Vous les confirmerez bientôt.",
- "step": "Détails de la fédération"
- },
- "connect-guardians": {
- "title-leader": "Invitez vos Gardiens",
- "title-follower": "Confirmez vos informations de fédération",
- "subtitle-leader": "Partagez le lien avec les autres Gardiens pour que tout le monde soit sur la même longueur d'onde. Une fois que tous les Gardiens auront rejoint, vous passerez automatiquement à l'étape suivante.",
- "subtitle-follower": "Assurez-vous que les informations ici sont correctes et que les Gardiens de la Fédération le sont également. Cliquez sur le bouton Approuver lorsque vous êtes sûr que tout semble bon.",
- "step-leader": "Inviter les Gardiens",
- "step-follower": "Confirmer les informations"
- },
- "run-dkg": {
- "title": "Succès !",
- "subtitle": "Tous les Gardiens ont validé les détails de configuration de la fédération. En train de faire quelques calculs..."
- },
- "verify-guardians": {
- "title": "Vérifiez vos Gardiens",
- "subtitle": "Demandez à chaque Gardien leur code de vérification et collez-les ci-dessous pour vérifier leur validité. Nous y sommes presque !",
- "step": "Vérifier les tuteurs",
- "leader-confirm-done": "Confirmez que tous les Gardiens suiveurs ont cliqué sur \"Suivant\" et consultez leurs tableaux de bord de gardien avant de continuer.",
- "leader-confirm-done-emphasis": "Cliquer sur \"Continuer\" complétera la cérémonie de configuration."
- },
- "setup-complete": {
- "step": "Fait !"
- },
- "error": {
- "title": "Étape inconnue",
- "subtitle": "Comment es-tu arrivé ici ?!"
- }
- },
- "warning": {
- "title": "Ne quittez pas et ne rafraîchissez pas pendant la configuration !",
- "description": "Quitter pendant la configuration peut entraîner un échec de la configuration et vous devrez effectuer un redémarrage complet."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Félicitations",
- "leader-message": "Tous les codes de vérification des Gardiens ont été vérifiés.",
- "follower-message": "Vous avez terminé ! Faites savoir aux autres Gardiens que vous êtes opérationnel !",
- "continue": "Continuer"
- },
- "terms-of-service": {
- "agree-and-continue": "Accepter et continuer"
- },
- "verify-guardians": {
- "verified": "Vérifié",
- "verified-placeholder": "Collez le code ici",
- "error": "Quelque chose a mal tourné.",
- "error-peer-id": "Impossible de déterminer quel pair vous êtes. Veuillez actualiser et réessayer.",
- "verification-code": "Votre code de vérification",
- "verification-code-help": "Partagez ce code avec d'autres gardiens.",
- "table-title": "Codes de vérification Guardian",
- "table-description": "Entrez les codes de vérification de chaque Gardien ci-dessous.",
- "table-column-name": "Nom",
- "table-column-status": "Statut",
- "table-column-hash-input": "Collez le code de vérification",
- "wait-all-guardians-verification": "En attente que tous les Gardiens vérifient leurs codes",
- "all-guardians-verified": "Tous les Gardiens ont vérifié leurs codes.",
- "starting-consensus": "Consensus de départ..."
- },
- "footer": {
- "docs-section-header": "Documents",
- "community-section-header": "Communauté",
- "contribute-section-header": "Contribuer",
- "getting-started-link-text": "Commencer",
- "faq-link-text": "Questions Fréquemment Posées",
- "blog-link-text": "Blog",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/hu.json b/apps/guardian-ui/src/languages/hu.json
deleted file mode 100644
index 3df7fe256..000000000
--- a/apps/guardian-ui/src/languages/hu.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Következő",
- "back": "Vissza",
- "error": "Valami hiba történt.",
- "unknown": "Ismeretlen",
- "remove": "Eltávolítás",
- "copy": "Másolat",
- "copied": "Másolt!",
- "cancel": "Törlés",
- "review": "Felülvizsgálat",
- "approvals": "Jóváhagyások",
- "approve": "Jóváhagyás",
- "threshold": "Küszöb",
- "confirm": "Megerősít",
- "you": "Te",
- "close": "Bezárás",
- "save": "Mentés",
- "continue": "Folytatás",
- "submit": "Küldés"
- },
- "notConfigured": {
- "title": "Nincs konfigurálva",
- "description": "Kérjük, adja meg a Fedimint konfigurációs szerver URL-jét a folytatáshoz."
- },
- "connect-guardians": {
- "invite-guardians": "Kövesd a követőket",
- "invite-guardians-help": "Oszd meg ezt a linket a többi Őrzővel.",
- "approve": "Jóváhagyás",
- "approved": "Jóváhagyva",
- "pending": "Függőben",
- "not-joined": "Nem csatlakozott",
- "waiting-for-guardian": "Várakozás a gyámra",
- "table-title": "Szövetségi Őrzők",
- "table-description": "A Őrzők itt lesznek megerősítve, amint megerősítik a Szövetség beállításait.",
- "meta-field-key": "Meta mező - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Hívj meg tagokat vagy hitelesítsd magad mint őrző",
- "invite-members-prompt": "Oszd meg ezt, hogy meghívj tagokat a szövetségbe való csatlakozásra.",
- "fed-info": {
- "label": "Szövetségi Információ",
- "your-status-label": "Állapot",
- "block-count-label": "Konszenzus Blokk Magasság",
- "api-version-label": "API verzió",
- "consensus-version-label": "Konszenzus verzió",
- "peer-id-label": "Felhasználói azonosító",
- "session-info": {
- "session-height": "Ülés magasság",
- "latest-session": "Legutóbbi ülés"
- }
- },
- "balance": {
- "label": "Mérleg"
- },
- "bitcoin-node": {
- "label": "Bitcoin Csomópont",
- "url-label": "URL",
- "network-label": "Hálózat"
- },
- "guardians": {
- "label": "Más Őrzők",
- "id-name-label": "AZ: Név",
- "status-label": "Kapcsolati állapot",
- "health-label": "Egészség",
- "health-issue": "Kérdés",
- "health-good": "Jó",
- "last-contribution-label": "Utolsó Munkamenet Hozzájárulás",
- "api-url-label": "API URL",
- "fetching-announcement": "Bejelentés lekérése..."
- },
- "gateways": {
- "label": "Villámkapuk",
- "node-id-label": "Villámcsomópont azonosító",
- "gateway-id-label": "Kapunyitó azonosító",
- "fee-label": "Átjáró díj",
- "view-on-site": "Nézd meg a {{site}} oldalon",
- "no-gateways-info-title": "Még nincsenek csatlakoztatott átjárók!",
- "no-gateways-info-description": "A Lightning csomópont üzemeltetők csatlakozhatnak a szövetségedhez, hogy biztosítsák a Lightning Network interoperabilitását. Miután csatlakoztak, itt fognak megjelenni."
- },
- "api-announcements": {
- "label": "API Bejelentések",
- "guardian": "Őrző",
- "api-url": "API URL",
- "revision": "Felülvizsgálat"
- },
- "config": {
- "label": "Szövetségi beállítások",
- "view-config": "Nézet beállítások",
- "missing-meta-module": "A Meta mezők szerkesztése nem lehetséges. A Meta modul nem elérhető ehhez a szövetséghez.",
- "manage-meta": {
- "label": "Meta kezelése",
- "cancel-button": "Törlés",
- "confirm-modal": {
- "title": "Jóváhagyás megerősítése",
- "description": "A jóváhagyása eléri a küszöböt ennek a meta változásnak az elfogadásához. Az új meta így fog kinézni:"
- },
- "consensus-meta-label": "Jelenlegi meta a konszenzusban",
- "revoke-button": "Visszavonás",
- "no-consensus-meta-message": "nincs meta a konszenzusban",
- "proposed-meta-label": "Meta Javaslatok",
- "propose-meta": "Javasolj Meta",
- "propose-new-meta-button": "Javasolj új metát",
- "proposal-approved": "Jóváhagytad ezt a javaslatot.",
- "no-submitted-meta-message": "nincsenek felülvizsgálatra váró meta módosítások",
- "edit-meta-label": "Meta szerkesztése",
- "edit-consensus-meta-button": "Szerkesztés Konszenzus Meta",
- "submit-meta-proposal": "Meta Javaslat Beküldése",
- "peer-approvals": "Társaik jóváhagyása",
- "actions": "Cselekvések",
- "revision": "Felülvizsgálat",
- "setup-meta-title": "Meta beállítása a Szövetségedhez",
- "setup-meta-description": "A Fedimint kiegészítő információkat tud szolgáltatni az ügyfeleknek meta mezők formájában: kulcs-érték párok tetszőleges információkkal, amelyeket meg szeretne osztani az ügyfelekkel. Bár ezeket a meta mezőket a Fedimint nem értelmezi, konszenzus szempontjából relevánsak, azaz nem térhetnek el a szövetségi tagok között. Így az ügyfelek támaszkodhatnak a helyességükre.",
- "propose-updates": "Fedimint őrzőként javaslatot tehetsz a meta frissítésekre, amelyeket a többi őrző elfogad. Miután a frissítést egy küszöbnyi őrző elfogadta, az új konszenzus meta lesz a szövetség számára.",
- "core-meta-fields": "A következő meta mezők a Fedimint protokoll részeként lettek definiálva, és hasznosak a szövetséged meta adatainak tartalmazásához:",
- "meta-field-expiry": "Egy unix időbélyeg, amely után a szövetség leáll.",
- "meta-field-name": "A szövetség emberi olvasásra alkalmas neve",
- "meta-field-icon": "Egy URL a szövetség logó ikonjához",
- "meta-field-welcome": "Üdvözlő üzenet az új felhasználók számára, akik csatlakoznak a szövetséghez.",
- "meta-field-gateways": "A szövetség által ellenőrzött átjáróazonosítók listája",
- "your-own-fields": "A javaslathoz saját tetszőleges meta mezőket is hozzáadhatsz. Ezeket hozzáadják az összes olyan kliens metaadataihoz, amely csatlakozik a szövetségedhez, és bármilyen célra felhasználhatók, amit szeretnél.",
- "meta-effect-add": "Hozzáadás",
- "meta-effect-modify": "Módosít",
- "meta-effect-unchanged": "Változatlan",
- "proposals": "Javaslatok"
- }
- },
- "modal": {
- "client-connect": "Kapcsolódj egy klienshez"
- },
- "danger-zone": {
- "danger-zone-label": "Veszélyzóna",
- "cancel": "Törlés",
- "danger-zone-description": "Használja óvatosan!",
- "guardian-warning-message": "FIGYELEM: Ne oszd meg ezt a kódot senkivel. Aki rendelkezik ezzel a kóddal, az az Őrzőként hitelesítheti magát. Győződj meg róla, hogy egy privát helyen vagy, és senki sem figyeli a képernyődet.",
- "guardian-acknowledge": "Ismerje el és fedje fel a kódot",
- "acknowledge-and-download": "Elismerés és folytatás",
- "guardian-authenticate": "Hitelesítés Őrként",
- "guardian-connect-warning": "NE OSZD MEG EZT",
- "backup": {
- "label": "Biztonsági másolat",
- "title": "Biztonsági mentés letöltése",
- "warning-title": "Figyelem",
- "warning-text": "A biztonsági mentés tartalmazza a szövetségi őr privát kulcsait és titkos anyagait, és biztonságban kell tartani. A helyreállításhoz ezzel a biztonsági mentéssel szükség van az admin jelszavadra!",
- "cancelButton": "Mégse",
- "acknowledgeButton": "Elismerés és Letöltés"
- },
- "sign-api-announcement": {
- "label": "Aláírás API Bejelentés",
- "title": "Aláírás API Bejelentés",
- "description": "Írj alá egy új API bejelentést.",
- "current-api-url": "Az API URL-je a Helyi Beállításokból",
- "announced-api-url": "Az API URL-je a Szövetségi Bejelentésekből",
- "urls-match": "A jelenlegi API URL címed megegyezik a bejelentett API URL címmel.",
- "urls-mismatch": "Megváltoztattad az API URL-t a helyi konfigurációdban, és új API bejelentést kell tenned.",
- "sign-button": "Új API bejelentés aláírása",
- "signing-in-progress": "Bejelentkezés folyamatban...",
- "sign-tooltip": "Írd alá az API bejelentést, hogy bejelentsd az API URL-edet a szövetségnek."
- },
- "schedule-shutdown": {
- "label": "Ütemezett leállítás",
- "title": "Ütemezett leállítás",
- "description": "Ütemezze a felügyelő csomópont leállítását egy adott session magasság után a fedimintd binárisok koordinált frissítése érdekében.",
- "current-session": "Aktuális ülés",
- "session-to-shutdown": "A munkamenet leállítása:",
- "confirm-shutdown": "Leállítás megerősítése",
- "session-to-shutdown-helper": "Írd be a session magasságát, amelynél le szeretnéd állítani a guardian node-odat."
- }
- }
- },
- "login": {
- "title": "Üdvözöljük vissza!",
- "subtitle": "Kérjük, adja meg a jelszavát.",
- "password": "Jelszó",
- "submit": "Benyújtás"
- },
- "role-selector": {
- "disclaimer-title": "A Fedimint béta szoftver.",
- "disclaimer-text": "Kérjük, jelezze a problémákat a https://github.com/fedimint/fedimint/issues oldalon.",
- "leader": {
- "label": "Beállító vezető",
- "description": "Írja be a konfigurációs beállításokat, amelyeket más Őrzők jóváhagynak. Egy Őrző a Beállítási Vezető."
- },
- "follower": {
- "label": "Követő",
- "description": "Miután egy Beállítási Vezető beállította a konfigurációkat, a többi Őrző ezt az opciót választja a beállítások jóváhagyására és a Szövetség létrehozására."
- },
- "solo": {
- "label": "Egyedül",
- "description": "Működtesse a Fedimintot egyéni őrként konszenzus, hibatűrés, szövetségi biztonsági mentések vagy a Fedimint egyéb ellenállósági előnyei nélkül. Járjon el óvatosan, nem termelési használatra készült."
- },
- "warning-modal": {
- "title": "Mindenki készen áll?",
- "description": "A beállítási ceremónia elhagyása a beállítás kudarcát okozhatja, és szükségessé teheti a védelmező újraindítását. Győződj meg róla, hogy mindenki készen áll a teljes beállítás futtatására, mielőtt folytatnád!"
- }
- },
- "run-dkg": {
- "error-config": "Sikertelen a megosztott kulcsgenerálás futtatása. A szövetség beállítását újra kell indítani.",
- "error-default": "Nem készen a DKG-ra, a jelenlegi státuszod",
- "error-header": "Valami hiba történt.",
- "waiting-header": "Várok a társakra...",
- "generating-header": "Kódok generálása..."
- },
- "set-config": {
- "bft-explanation-title": "A Te Szövetséged Bizánci Hiba Toleranciája",
- "bft-explanation": "Egy {{total}} Őrző Szövetség létrehoz egy {{honest}}/{{total}} Küszöböt.",
- "bft-faulty": "A Szövetséged képes lesz tolerálni a {{faulty}} hibás, offline vagy rosszindulatú Őrzőket anélkül, hogy ez hatással lenne a Szövetség működésére.",
- "guardian-name": "Őrző neve",
- "guardian-name-help": "Ez a véletlenszerű név megjelenik más Őrzőknek a beállítás során.",
- "admin-password": "Admin jelszó",
- "admin-password-generate": "Generálás",
- "admin-password-set": "Kattints a 'Generálás' gombra egy biztonságos jelszó létrehozásához. Módosíthatod, de ennek a jelszónak biztonságosnak és mentettnek kell lennie!",
- "admin-password-help": "Biztosítsd ezt a jelszót és tartsd biztonságban! Ezt a jelszót nem tudod visszaállítani!",
- "admin-password-backup": "Erős jelszót használok, és elmentettem. (Ezt a jelszót nem tudod visszaállítani!)",
- "confirm-password": "Jelszó megerősítése",
- "error-password-mismatch": "A jelszavak nem egyeznek.",
- "join-federation": "Csatlakozz a Szövetséghez link",
- "join-federation-help": "Kérdezd meg azt a személyt, aki létrehozta a Szövetséget, hogy adjon egy linket, és másold be ide.",
- "basic-settings": "Alapok",
- "federation-settings": "Szövetségi beállítások",
- "federation-name": "Szövetség neve",
- "guardian-number": "Őrzők száma",
- "guardian-number-help": "A szövetségekhez minimum 4 őrző szükséges. Ezen később nem lehet változtatni.",
- "bitcoin-settings": "Bitcoin beállítások",
- "block-confirmations": "További blokk megerősítések",
- "block-confirmations-help": "A Fedimint őrzők több megerősítéssel követik a blokklánc csúcsát, hogy elkerüljék a blokkújraszervezéseket.",
- "block-confirmations-warning": "A Fedimint futtatása kevesebb mint 5 további blokk megerősítéssel rendkívül kockázatos! A Fedimint NEM képes kezelni a blokklánc átszervezéseket.",
- "bitcoin-network": "Bitcoin Hálózat",
- "select-network": "Válasszon egy hálózatot",
- "set-rpc-help": "Helyileg beállított Bitcoin RPC cím",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Kérjük, adjon meg egy érvényes számot.",
- "error-valid-min": "Kérjük, adjon meg legalább {{min}} számot.",
- "error-valid-max": "Kérjük, adjon meg legfeljebb {{max}} számot.",
- "error-valid-min-max": "Kérjük, adjon meg egy számot {{min}} és {{max}} között.",
- "meta-fields": "Meta mezők",
- "meta-fields-description": "Lásd a dokumentációt a további információkért.",
- "meta-fields-key": "Meta kulcs",
- "meta-fields-value": "Érték",
- "meta-fields-effect": "Hatás",
- "meta-fields-add-another": "Adj hozzá egy másikat",
- "meta-fields-title": "A te Meta Javaslatod:",
- "password-warning": "Meg kell őrizned a jelszavadat, és biztonságos helyen kell tárolnod. Ez a jelszó szükséges a Őrző irányítópultjának eléréséhez. Nem tudod visszaállítani, ha elveszíted!",
- "password-warning-title": "Jelszó biztonsági mentése!",
- "acknowledge-backed-up": "Én, {{guardianName}} (a te őrződ neve), ígérem, hogy biztonsági másolatot készítettem és megvédtem a jelszavamat:",
- "confirm-and-backup-password": "Jelszó megerősítése és biztonsági mentés",
- "error-guardian-name-mismatch": "A gondnok neve nem egyezik.",
- "network": "Hálózat"
- },
- "setup": {
- "common": {
- "restart-setup": "Újraindítás beállításai",
- "restart-setup-alert": "A Beállítási Vezető újraindította a Beállítási Ceremóniát. Kérjük, kattintson az alábbi \"Újraindítás\" gombra a folytatáshoz.",
- "confirm-restart-setup": "Biztos benne, hogy újra szeretné indítani a Telepítési Ceremóniát?",
- "confirm-restart-setup-alert": "A \"Újraindítás\" gombra kattintva újraindul a szertartás minden Őrző számára."
- },
- "progress": {
- "tos": {
- "title": "Szolgáltatási feltételek"
- },
- "start": {
- "title": "Üdvözöljük, Őrző!",
- "subtitle": "Állítsuk be a szövetségedet.",
- "step": "Szövetségi adatok"
- },
- "set-config": {
- "title": "Be kell állítanunk néhány konfigurációt a Szövetségedhez.",
- "title-solo": "Néhány beállítást kell megadnunk a Solo Szövetségedhez.",
- "subtitle-leader": "A Szövetséged Követői megerősítik ezt az információt a saját oldalukon.",
- "subtitle-solo": "A Szóló Szövetség működtetése sok előnyét elveszíti a Fedimintnek. Nem lesz hibatűrő konszenzus egy őrző offline állapotára, és nem tudsz szövetségi biztonsági mentéseket végezni. Óvatosan járj el, nem ajánlott termelési használatra vagy a főhálózati Bitcoin használatára.",
- "subtitle-follower": "A Szövetség vezetője beállítja a fő Szövetségi részleteket. Hamarosan megerősíted őket.",
- "step": "Szövetségi adatok"
- },
- "connect-guardians": {
- "title-leader": "Hívd meg a Őrzőidet",
- "title-follower": "Erősítse meg a Szövetségi Információit",
- "subtitle-leader": "Oszd meg a linket a többi Őrzővel, hogy mindenki egy oldalon legyen. Miután minden Őrző csatlakozik, automatikusan a következő lépésre lépsz.",
- "subtitle-follower": "Győződjön meg róla, hogy az itt található információk helyesek, és hogy a Szövetség Őrzői pontosak. Kattintson az Engedélyezés gombra, amikor biztos benne, hogy jól néz ki.",
- "step-leader": "Hívj meg Őrzőket",
- "step-follower": "Információ megerősítése"
- },
- "run-dkg": {
- "title": "Siker!",
- "subtitle": "Minden Őrző érvényesítette a szövetségi beállítások részleteit. Számolok egy kicsit..."
- },
- "verify-guardians": {
- "title": "Ellenőrizd a Őrzőidet",
- "subtitle": "Kérd meg minden Őrt, hogy adja meg a hitelesítési kódját, és másold be őket alább a érvényesség ellenőrzéséhez. Már majdnem kész vagyunk!",
- "step": "Ellenőrizze a gyámokat",
- "leader-confirm-done": "Erősítse meg, hogy az összes követő Őrző rákattintott a \"Tovább\" gombra, és nézze meg az őrzői irányítópultjaikat, mielőtt folytatná.",
- "leader-confirm-done-emphasis": "A \"Tovább\" gombra kattintva befejezi a beállítási ceremóniát."
- },
- "setup-complete": {
- "step": "Kész!"
- },
- "error": {
- "title": "Ismeretlen lépés",
- "subtitle": "Hogy kerültél ide?!"
- }
- },
- "warning": {
- "title": "Ne lépj ki vagy frissíts a telepítés alatt!",
- "description": "A telepítés közben való kilépés a telepítés kudarcát okozhatja, és friss újraindítást kell végeznie."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Gratulálok",
- "leader-message": "Minden Őr ellenőrző kódját ellenőrizték.",
- "follower-message": "Minden készen áll! Értesítsd a többi Őrzőt, hogy működésben vagy!",
- "continue": "Folytatás"
- },
- "terms-of-service": {
- "agree-and-continue": "Egyetértek és folytatom"
- },
- "verify-guardians": {
- "verified": "Ellenőrzött",
- "verified-placeholder": "Illessze be a kódot ide",
- "error": "Valami hiba történt.",
- "error-peer-id": "Nem tudjuk meghatározni, hogy melyik partner vagy. Kérlek, frissítsd az oldalt, és próbáld újra.",
- "verification-code": "A megerősítő kódod",
- "verification-code-help": "Oszd meg ezt a kódot más őrzőkkel.",
- "table-title": "Őrzői ellenőrző kódok",
- "table-description": "Írd be az egyes Őrzők ellenőrző kódjait az alábbiakba.",
- "table-column-name": "Név",
- "table-column-status": "Állapot",
- "table-column-hash-input": "Illessze be a hitelesítési kódot",
- "wait-all-guardians-verification": "Várakozás, amíg az összes Őrző megerősíti a kódját",
- "all-guardians-verified": "Minden Őr ellenőrizte a kódját.",
- "starting-consensus": "Kezdő konszenzus..."
- },
- "footer": {
- "docs-section-header": "Dokumentumok",
- "community-section-header": "Közösség",
- "contribute-section-header": "Hozzájárulás",
- "getting-started-link-text": "Kezdő lépések",
- "faq-link-text": "Gyakran Ismételt Kérdések",
- "blog-link-text": "Blog",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/it.json b/apps/guardian-ui/src/languages/it.json
deleted file mode 100644
index f1bebdda4..000000000
--- a/apps/guardian-ui/src/languages/it.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Siguiente",
- "back": "Volver",
- "error": "Algo salió mal.",
- "unknown": "Unknown",
- "remove": "Eliminar",
- "copy": "Copiar",
- "copied": "¡Copiado!",
- "cancel": "Annuler",
- "review": "Revisar",
- "approvals": "Aprobaciones",
- "approve": "أوافق",
- "threshold": "Umbral",
- "confirm": "Confirmer",
- "you": "Tu",
- "close": "Cerrar",
- "save": "Guardar",
- "continue": "Continuar",
- "submit": "Enviar"
- },
- "notConfigured": {
- "title": "Non configurato",
- "description": "Per favore, inserisci l'URL del server di configurazione Fedimint per continuare."
- },
- "connect-guardians": {
- "invite-guardians": "Invitar seguidores",
- "invite-guardians-help": "Teilen Sie diesen Link mit den anderen Wächtern.",
- "approve": "أوافق",
- "approved": "أُعْتُمِدَ",
- "pending": "Pendiente",
- "not-joined": "No unido",
- "waiting-for-guardian": "In attesa del guardiano",
- "table-title": "Federación Guardianes",
- "table-description": "Los guardianes se confirmarán aquí una vez que confirmen la configuración de la Federación.",
- "meta-field-key": "Campo meta - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Invitar a miembros o autenticar como guardián",
- "invite-members-prompt": "Teilen Sie dies, um Mitglieder einzuladen, der Föderation beizutreten.",
- "fed-info": {
- "label": "信息联邦",
- "your-status-label": "Estado",
- "block-count-label": "Consensus Block Height",
- "api-version-label": "API版本",
- "consensus-version-label": "Versión de consenso",
- "peer-id-label": "ID de par",
- "session-info": {
- "session-height": "Sesión Altura",
- "latest-session": "Última sesión"
- }
- },
- "balance": {
- "label": "Hoja de Balance"
- },
- "bitcoin-node": {
- "label": "Bitcoin Knoten",
- "url-label": "URL",
- "network-label": "Redes"
- },
- "guardians": {
- "label": "Otros Guardianes",
- "id-name-label": "ID: Nombre",
- "status-label": "Estado de conexión",
- "health-label": "Salud",
- "health-issue": "Problema",
- "health-good": "Bien",
- "last-contribution-label": "Ultimo contributo alla sessione",
- "api-url-label": "API URL",
- "fetching-announcement": "Fetching announcement..."
- },
- "gateways": {
- "label": "Lightning Gateways",
- "node-id-label": "Lightning Node ID",
- "gateway-id-label": "ID de puerta de enlace",
- "fee-label": "Tarifa de puerta",
- "view-on-site": "Vedi su {{site}}",
- "no-gateways-info-title": "¡Aún no hay puertas de enlace conectadas!",
- "no-gateways-info-description": "Los operadores de nodos Lightning pueden conectarse a tu federación para proporcionar interoperabilidad de la Lightning Network. Una vez conectados, aparecerán aquí."
- },
- "api-announcements": {
- "label": "API Announcements",
- "guardian": "Guardián",
- "api-url": "API URL",
- "revision": "Revisión"
- },
- "config": {
- "label": "Federación Config",
- "view-config": "Ver Configuración",
- "missing-meta-module": "Editing Meta fields is not possible. The Meta module is not available for this federation.",
- "manage-meta": {
- "label": "Gérer Meta",
- "cancel-button": "Annuler",
- "confirm-modal": {
- "title": "Konfirmasi Persetujuan",
- "description": "Tu aprobación alcanzará el umbral para adoptar este cambio meta. Tu nueva meta se verá así:"
- },
- "consensus-meta-label": "Meta actuel dans le consensus",
- "revoke-button": "Revocar",
- "no-consensus-meta-message": "no hay meta en el consenso",
- "proposed-meta-label": "Meta Vorschläge",
- "propose-meta": "Propose Meta",
- "propose-new-meta-button": "Proponer Nuevo Meta",
- "proposal-approved": "Has aprobado esta propuesta.",
- "no-submitted-meta-message": "no hay ediciones meta para revisar",
- "edit-meta-label": "Edit meta",
- "edit-consensus-meta-button": "Edit Consensus Meta",
- "submit-meta-proposal": "提交元提案",
- "peer-approvals": "Aprobaciones de Pares",
- "actions": "Actions",
- "revision": "Revisión",
- "setup-meta-title": "Configurar un Meta para tu Federación",
- "setup-meta-description": "Fedimint puede proporcionar información adicional a los clientes en forma de campos meta: pares de clave-valor con información arbitraria que desees compartir con los clientes. Aunque estos campos meta no son interpretados por Fedimint, son relevantes para el consenso, es decir, no pueden diferir entre los miembros de la federación. De esta manera, los clientes pueden confiar en su corrección.",
- "propose-updates": "Como guardián de fedimint, puedes proponer actualizaciones al meta que serán aceptadas por los otros guardianes. Una vez que la actualización sea aceptada por un umbral de guardianes, se adoptará como el nuevo meta de consenso para la federación.",
- "core-meta-fields": "Los siguientes campos meta se han definido como parte del protocolo central de Fedimint y son útiles para incluir en el meta de su federación:",
- "meta-field-expiry": "Un timestamp de Unix después del cual la federación se cerrará.",
- "meta-field-name": "El nombre legible por humanos de la federación",
- "meta-field-icon": "Une URL vers une icône de logo pour la fédération",
- "meta-field-welcome": "Un mensaje de bienvenida para los nuevos usuarios que se unen a la federación.",
- "meta-field-gateways": "Una lista de identificadores de puerta de enlace verificados por la federación",
- "your-own-fields": "También puedes agregar tus propios campos meta arbitrarios a la propuesta. Estos se agregarán a la meta de todos los clientes que se conecten a tu federación y se pueden utilizar para cualquier propósito que desees.",
- "meta-effect-add": "Añadir",
- "meta-effect-modify": "Modificar",
- "meta-effect-unchanged": "Unverändert",
- "proposals": "Propuestas"
- }
- },
- "modal": {
- "client-connect": "Conectar un cliente"
- },
- "danger-zone": {
- "danger-zone-label": "Zona de Peligro",
- "cancel": "Annuler",
- "danger-zone-description": "¡Usa con precaución!",
- "guardian-warning-message": "AVISO: No compartas este código con nadie. Cualquiera que tenga este código puede autenticarse como un Guardián. Asegúrate de estar en un lugar privado y de que nadie esté mirando tu pantalla.",
- "guardian-acknowledge": "Acknowledge and Reveal Code",
- "acknowledge-and-download": "Reconocer y Proceder",
- "guardian-authenticate": "Authenticate as Guardian",
- "guardian-connect-warning": "NO COMPARTAS ESTO",
- "backup": {
- "label": "Copia de seguridad",
- "title": "Télécharger la sauvegarde",
- "warning-title": "Advertencia",
- "warning-text": "El respaldo contiene claves privadas y material secreto para el guardián de la federación y debe mantenerse seguro. ¡La recuperación utilizando este respaldo requiere tu contraseña de administrador!",
- "cancelButton": "Annuler",
- "acknowledgeButton": "Reconocer y Descargar"
- },
- "sign-api-announcement": {
- "label": "Sign API Ankündigung",
- "title": "Sign API Ankündigung",
- "description": "Signa un nou anunci d'API.",
- "current-api-url": "Tu URL de API de Configuración Local",
- "announced-api-url": "Tu URL de API de Anuncios de Federación",
- "urls-match": "Your current API URL matches your announced API URL.",
- "urls-mismatch": "Has cambiado la URL de la API en tu configuración local y necesitas difundir un nuevo anuncio de la API.",
- "sign-button": "Signo de nuevo anuncio de API",
- "signing-in-progress": "Iniciando sesión...",
- "sign-tooltip": "Signa l'annuncio API per annunciare il tuo URL API alla federazione."
- },
- "schedule-shutdown": {
- "label": "Programar Apagado",
- "title": "Programar Apagado",
- "description": "Programma il tuo nodo guardiano per spegnersi dopo un'altezza di sessione specifica per un aggiornamento coordinato dei tuoi binari fedimintd.",
- "current-session": "Sesión Actual",
- "session-to-shutdown": "Sesión para apagar en",
- "confirm-shutdown": "Confirmar Apagado",
- "session-to-shutdown-helper": "Ingrese la altura de la sesión a la que desea apagar su nodo guardián."
- }
- }
- },
- "login": {
- "title": "¡Bienvenido de nuevo!",
- "subtitle": "Por favor, ingrese su contraseña.",
- "password": "Contraseña",
- "submit": "Enviar"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint è un software beta",
- "disclaimer-text": "Segnala problemi su https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Configurador de Líder",
- "description": "Ingrese la configuración que otros Guardianes aprueban. Un Guardián actúa como Líder de Configuración."
- },
- "follower": {
- "label": "Seguidor",
- "description": "Sobald ein Setup-Leiter die Konfigurationen festgelegt hat, wählen andere Wächter diese Option, um die Einstellungen zu genehmigen und die Föderation zu gründen."
- },
- "solo": {
- "label": "Sólo",
- "description": "Fedimint'i konsensüs, hata toleransı, federatif yedeklemeler veya Fedimint'in diğer dayanıklılık avantajları olmadan Tekil Koruyucu olarak çalıştırın. Dikkatli ilerleyin, üretim kullanımı için tasarlanmamıştır."
- },
- "warning-modal": {
- "title": "¿Está todo el mundo listo?",
- "description": "Salir de la ceremonia de configuración puede hacer que la configuración falle y requerir que reinicies tu guardián. ¡Asegúrate de que todos estén listos para ejecutar la configuración completa antes de continuar!"
- }
- },
- "run-dkg": {
- "error-config": "Échec de l'exécution de la génération de clés distribuées. La configuration de la fédération doit être redémarrée.",
- "error-default": "Not ready for DKG, your current status is",
- "error-header": "Algo salió mal.",
- "waiting-header": "Warten auf Peers...",
- "generating-header": "Generando códigos..."
- },
- "set-config": {
- "bft-explanation-title": "Tolerancia a fallos bizantinos de tu federación",
- "bft-explanation": "Un {{total}} Fédération des Gardiens crée un {{honest}}/{{total}} Seuil.",
- "bft-faulty": "Your Federation will be able to tolerate {{faulty}} faulty, offline, or malicious Guardians without impacting the Federation's operations.",
- "guardian-name": "Guardian name",
- "guardian-name-help": "Este nombre aleatorio se mostrará a otros Guardianes durante la configuración.",
- "admin-password": "Admin-Passwort",
- "admin-password-generate": "Generar",
- "admin-password-set": "Clicca su 'Genera' per creare una password sicura. Puoi modificarla, ma questa password deve essere sicura e salvata!",
- "admin-password-help": "¡Haz una copia de esta contraseña y mantenla a salvo! ¡No puedes recuperar esta contraseña!",
- "admin-password-backup": "Estoy usando una contraseña fuerte y la he respaldado. (¡No puedes recuperar esta contraseña!)",
- "confirm-password": "Confirmer le mot de passe",
- "error-password-mismatch": "Las contraseñas no coinciden",
- "join-federation": "Join Federation link",
- "join-federation-help": "Pide a la persona que creó la Federación un enlace y pégalo aquí.",
- "basic-settings": "Fundamentos",
- "federation-settings": "Federación de configuraciones",
- "federation-name": "Federation name",
- "guardian-number": "Número de guardianes",
- "guardian-number-help": "Las federaciones requieren un mínimo de 4 guardianes. Esto no se puede cambiar más tarde.",
- "bitcoin-settings": "Bitcoin-Einstellungen",
- "block-confirmations": "Confirmaciones de Bloque Adicionales",
- "block-confirmations-help": "Fedimint Guardians siguen la punta de la blockchain por varias confirmaciones para evitar reorganizaciones de bloques.",
- "block-confirmations-warning": "¡Ejecutar Fedimint con menos de 5 confirmaciones de bloque adicionales es extremadamente arriesgado! Fedimint NO PUEDE manejar reorganizaciones de blockchain.",
- "bitcoin-network": "Red de Bitcoin",
- "select-network": "Sélectionnez un réseau",
- "set-rpc-help": "Dirección RPC de Bitcoin configurada localmente",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Por favor, ingrese un número válido.",
- "error-valid-min": "Por favor, ingrese un número de al menos {{min}}.",
- "error-valid-max": "Por favor, ingrese un número de como máximo {{max}}.",
- "error-valid-min-max": "Por favor, ingrese un número entre {{min}} y {{max}}.",
- "meta-fields": "Meta campos",
- "meta-fields-description": "Veja documentação para mais informações.",
- "meta-fields-key": "Meta key",
- "meta-fields-value": "Valor",
- "meta-fields-effect": "Efecto",
- "meta-fields-add-another": "Fügen Sie einen weiteren hinzu",
- "meta-fields-title": "Ваше предложение Meta:",
- "password-warning": "Devi fare una copia di backup della tua password e conservarla in un luogo sicuro. Questa password è necessaria per accedere alla tua dashboard dei guardiani. Non puoi recuperarla se la perdi!",
- "password-warning-title": "Fai una copia di backup della tua password!",
- "acknowledge-backed-up": "Yo, {{guardianName}} (tu nombre de guardián), prometo que he respaldado y asegurado mi contraseña:",
- "confirm-and-backup-password": "Bestätigen und Sichern Sie das Passwort",
- "error-guardian-name-mismatch": "El nombre del guardián no coincide.",
- "network": "Redes"
- },
- "setup": {
- "common": {
- "restart-setup": "Reiniciar Configuración",
- "restart-setup-alert": "El Líder de Configuración ha reiniciado la Ceremonia de Configuración. Por favor, haga clic en \"Reiniciar\" a continuación para continuar.",
- "confirm-restart-setup": "¿Estás seguro de que quieres reiniciar la Ceremonia de Configuración?",
- "confirm-restart-setup-alert": "Clicando em \"Reiniciar\" reiniciará a cerimônia para todos os Guardiões."
- },
- "progress": {
- "tos": {
- "title": "Términos de servicio"
- },
- "start": {
- "title": "Bienvenido, Guardián!",
- "subtitle": "Vamos a configurar tu federación.",
- "step": "Detalles de la federación"
- },
- "set-config": {
- "title": "Necesitamos establecer algunas configuraciones para tu Federación.",
- "title-solo": "Necesitamos establecer algunas configuraciones para tu Federación Solo.",
- "subtitle-leader": "Ваши последователи Федерации подтвердят эту информацию с их стороны.",
- "subtitle-solo": "Running a Solo Federation loses many of the benefits of Fedimint. You will not have fault tolerance consensus to a guardian being offline and not be able to do federated backups. Proceed with caution, not recommended for production use or use with mainnet Bitcoin.",
- "subtitle-follower": "Ваш лидер Федерации будет настраивать основные детали Федерации. Вы скоро их подтвердите.",
- "step": "Detalles de la federación"
- },
- "connect-guardians": {
- "title-leader": "Invita a tus Guardianes",
- "title-follower": "Confirme su información de la Federación",
- "subtitle-leader": "Teile den Link mit den anderen Wächtern, um alle auf denselben Stand zu bringen. Sobald alle Wächter beitreten, wirst du automatisch zum nächsten Schritt übergehen.",
- "subtitle-follower": "Asegúrate de que la información aquí sea correcta y de que los Guardianes de la Federación estén correctos. Haz clic en el botón Aprobar cuando estés seguro de que se ve bien.",
- "step-leader": "Invitar Guardianes",
- "step-follower": "Confirmar información"
- },
- "run-dkg": {
- "title": "¡Éxito!",
- "subtitle": "Todos los Guardianes han validado los detalles de configuración de la federación. Ejecutando algunos números..."
- },
- "verify-guardians": {
- "title": "Verifica tus Guardianes",
- "subtitle": "Frage jeden Wächter nach seinem Verifizierungscode und füge ihn unten ein, um die Gültigkeit zu überprüfen. Wir sind fast fertig!",
- "step": "Verificar tutores",
- "leader-confirm-done": "Confirma que todos los Guardianes seguidores han hecho clic en \"Siguiente\" y revisa sus paneles de guardianes antes de continuar.",
- "leader-confirm-done-emphasis": "Clicando em \"Continuar\" você completará a cerimônia de configuração."
- },
- "setup-complete": {
- "step": "¡Hecho!"
- },
- "error": {
- "title": "Unbekannter Schritt",
- "subtitle": "¿¡Cómo llegaste aquí!?"
- }
- },
- "warning": {
- "title": "¡No salgas ni actualices durante la configuración!",
- "description": "Salir durante la configuración puede hacer que la configuración falle y tendrás que reiniciar desde cero."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Felicidades",
- "leader-message": "Todos los códigos de verificación de los Guardianes han sido verificados.",
- "follower-message": "Hai finito! Fai sapere agli altri Guardiani che sei operativo!",
- "continue": "Continuar"
- },
- "terms-of-service": {
- "agree-and-continue": "Acuerdo y continuar"
- },
- "verify-guardians": {
- "verified": "Verificado",
- "verified-placeholder": "Pegar código aqui",
- "error": "Algo salió mal.",
- "error-peer-id": "No se puede determinar qué par eres. Por favor, actualiza y vuelve a intentarlo.",
- "verification-code": "Tu código de verificación",
- "verification-code-help": "Teilen Sie diesen Code mit anderen Wächtern.",
- "table-title": "Código de verificación del guardián",
- "table-description": "Ingrese los códigos de verificación de cada Guardián a continuación.",
- "table-column-name": "Nombre",
- "table-column-status": "Estado",
- "table-column-hash-input": "Colle il codice di verifica",
- "wait-all-guardians-verification": "Aguardando todos os Guardiões para verificar seus códigos",
- "all-guardians-verified": "Todos los Guardianes han verificado sus códigos.",
- "starting-consensus": "Iniciando consenso..."
- },
- "footer": {
- "docs-section-header": "文档",
- "community-section-header": "Comunidad",
- "contribute-section-header": "Contribuir",
- "getting-started-link-text": "Comenzando",
- "faq-link-text": "Preguntas Frecuentes",
- "blog-link-text": "Blog",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/ja.json b/apps/guardian-ui/src/languages/ja.json
deleted file mode 100644
index 9b40dbb5b..000000000
--- a/apps/guardian-ui/src/languages/ja.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "ビットコイン",
- "next": "次へ",
- "back": "戻る",
- "error": "何かがうまくいきませんでした。",
- "unknown": "不明",
- "remove": "削除",
- "copy": "コピー",
- "copied": "コピーしました!",
- "cancel": "キャンセル",
- "review": "レビュー",
- "approvals": "承認",
- "approve": "承認する",
- "threshold": "閾値",
- "confirm": "確認する",
- "you": "あなた",
- "close": "閉じる",
- "save": "保存",
- "continue": "続ける",
- "submit": "送信"
- },
- "notConfigured": {
- "title": "未構成",
- "description": "Fedimintの構成サーバーのURLを入力してください。"
- },
- "connect-guardians": {
- "invite-guardians": "フォロワーを招待する",
- "invite-guardians-help": "このリンクを他のガーディアンと共有してください。",
- "approve": "承認する",
- "approved": "承認済み",
- "pending": "保留中",
- "not-joined": "参加していない",
- "waiting-for-guardian": "守護者を待っています",
- "table-title": "連邦の守護者",
- "table-description": "ガーディアンは、連邦設定を確認するとここで確認されます。",
- "meta-field-key": "メタフィールド - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "メンバーを招待するか、ガーディアンとして認証する",
- "invite-members-prompt": "このリンクを共有して、メンバーを連邦に招待してください。",
- "fed-info": {
- "label": "連邦情報",
- "your-status-label": "ステータス",
- "block-count-label": "コンセンサスブロック高",
- "api-version-label": "API バージョン",
- "consensus-version-label": "コンセンサス版",
- "peer-id-label": "ピアID",
- "session-info": {
- "session-height": "セッションの高さ",
- "latest-session": "最新のセッション"
- }
- },
- "balance": {
- "label": "バランスシート"
- },
- "bitcoin-node": {
- "label": "ビットコインノード",
- "url-label": "URL",
- "network-label": "ネットワーク"
- },
- "guardians": {
- "label": "他の守護者",
- "id-name-label": "ID: 名前",
- "status-label": "接続状況",
- "health-label": "健康",
- "health-issue": "問題",
- "health-good": "良い",
- "last-contribution-label": "最後のセッション貢献",
- "api-url-label": "APIのURL",
- "fetching-announcement": "お知らせを取得中..."
- },
- "gateways": {
- "label": "ライトニングゲートウェイ",
- "node-id-label": "ライトニングノードID",
- "gateway-id-label": "ゲートウェイID",
- "fee-label": "ゲートウェイ手数料",
- "view-on-site": "{{site}}で表示",
- "no-gateways-info-title": "まだ接続されたゲートウェイはありません!",
- "no-gateways-info-description": "ライトニングノードオペレーターは、ライトニングネットワークの相互運用性を提供するためにあなたのフェデレーションに接続できます。接続されると、ここに表示されます。"
- },
- "api-announcements": {
- "label": "APIのお知らせ",
- "guardian": "守護者",
- "api-url": "APIのURL",
- "revision": "改訂"
- },
- "config": {
- "label": "連邦設定",
- "view-config": "設定を表示",
- "missing-meta-module": "メタフィールドの編集はできません。このフェデレーションではメタモジュールは利用できません。",
- "manage-meta": {
- "label": "メタを管理する",
- "cancel-button": "キャンセル",
- "confirm-modal": {
- "title": "承認を確認する",
- "description": "あなたの承認は、このメタ変更を採用するための閾値に達します。あなたの新しいメタは次のようになります:"
- },
- "consensus-meta-label": "現在のコンセンサスにおけるメタ",
- "revoke-button": "取り消す",
- "no-consensus-meta-message": "コンセンサスにはメタがありません。",
- "proposed-meta-label": "メタ提案",
- "propose-meta": "メタを提案する",
- "propose-new-meta-button": "新しいメタを提案する",
- "proposal-approved": "あなたはこの提案を承認しました。",
- "no-submitted-meta-message": "レビューするメタ編集はありません。",
- "edit-meta-label": "メタを編集",
- "edit-consensus-meta-button": "コンセンサスメタを編集する",
- "submit-meta-proposal": "メタ提案を提出する",
- "peer-approvals": "ピア承認",
- "actions": "アクション",
- "revision": "改訂",
- "setup-meta-title": "連合のためのメタを設定する",
- "setup-meta-description": "Fedimintは、クライアントにメタフィールドの形で追加情報を提供できます:クライアントと共有したい任意の情報を持つキー-バリューのペアです。これらのメタフィールドはFedimintによって解釈されることはありませんが、コンセンサスに関連しているため、連合メンバー間で異なることはできません。このようにして、クライアントはその正確性に依存できます。",
- "propose-updates": "フェディミントのガーディアンとして、あなたは他のガーディアンによって受け入れられるメタの更新を提案することができます。更新が一定数のガーディアンによって受け入れられると、それは連合の新しいコンセンサスメタとして採用されます。",
- "core-meta-fields": "次のメタフィールドは、コアFedimintプロトコルの一部として定義されており、あなたの連合のメタに含めると便利です:",
- "meta-field-expiry": "フェデレーションがシャットダウンするUnixタイムスタンプ。",
- "meta-field-name": "連合の人間が読み取れる名前",
- "meta-field-icon": "連盟のロゴアイコンのURL",
- "meta-field-welcome": "連邦に参加する新しいユーザーへの歓迎メッセージ",
- "meta-field-gateways": "連合によって審査されたゲートウェイ識別子のリスト",
- "your-own-fields": "提案に独自の任意のメタフィールドを追加することもできます。これらは、あなたのフェデレーションに接続するすべてのクライアントのメタに追加され、あなたの好きな目的に使用できます。",
- "meta-effect-add": "追加",
- "meta-effect-modify": "修正する",
- "meta-effect-unchanged": "変更なし",
- "proposals": "提案"
- }
- },
- "modal": {
- "client-connect": "クライアントを接続する"
- },
- "danger-zone": {
- "danger-zone-label": "危険地帯",
- "cancel": "キャンセル",
- "danger-zone-description": "注意して使用してください!",
- "guardian-warning-message": "警告:このコードを誰とも共有しないでください。このコードを持っている人は誰でもガーディアンとして認証できます。プライベートな場所にいることを確認し、誰もあなたの画面を見ていないことを確認してください。",
- "guardian-acknowledge": "コードを認識して公開する",
- "acknowledge-and-download": "承認して進む",
- "guardian-authenticate": "ガーディアンとして認証する",
- "guardian-connect-warning": "これを共有しないでください",
- "backup": {
- "label": "バックアップ",
- "title": "バックアップをダウンロード",
- "warning-title": "警告",
- "warning-text": "バックアップには、連合ガーディアンのプライベートキーと秘密の資料が含まれており、安全に保管する必要があります。このバックアップを使用して復旧するには、管理者パスワードが必要です!",
- "cancelButton": "キャンセル",
- "acknowledgeButton": "承認してダウンロード"
- },
- "sign-api-announcement": {
- "label": "サインAPI発表",
- "title": "サインAPI発表",
- "description": "新しいAPIの発表にサインしてください。",
- "current-api-url": "ローカル設定からのAPI URL",
- "announced-api-url": "連邦発表からのAPI URL",
- "urls-match": "現在のAPI URLは、発表されたAPI URLと一致しています。",
- "urls-mismatch": "ローカル設定でAPI URLを変更したため、新しいAPIのお知らせを配信する必要があります。",
- "sign-button": "新しいAPI発表にサインする",
- "signing-in-progress": "サインイン中...",
- "sign-tooltip": "API URLを連合に通知するために、API発表にサインしてください。"
- },
- "schedule-shutdown": {
- "label": "スケジュールシャットダウン",
- "title": "スケジュールシャットダウン",
- "description": "特定のセッションの高さの後にガーディアンノードをシャットダウンするようにスケジュールして、fedimintdバイナリの調整されたアップグレードを行ってください。",
- "current-session": "現在のセッション",
- "session-to-shutdown": "シャットダウンするセッションは",
- "confirm-shutdown": "シャットダウンを確認する",
- "session-to-shutdown-helper": "シャットダウンしたいガーディアンノードのセッションの高さを入力してください。"
- }
- }
- },
- "login": {
- "title": "お帰りなさい!",
- "subtitle": "パスワードを入力してください。",
- "password": "パスワード",
- "submit": "提出する"
- },
- "role-selector": {
- "disclaimer-title": "Fedimintはベータ版ソフトウェアです",
- "disclaimer-text": "問題はhttps://github.com/fedimint/fedimint/issuesで報告してください。",
- "leader": {
- "label": "セットアップリーダー",
- "description": "他のガーディアンが承認する設定を入力してください。1人のガーディアンがセットアップリーダーとして行動します。"
- },
- "follower": {
- "label": "フォロワー",
- "description": "セットアップリーダーが設定を行うと、他のガーディアンはこのオプションを選択して設定を承認し、連邦を作成します。"
- },
- "solo": {
- "label": "ソロ",
- "description": "Fedimintをコンセンサス、フォールトトレランス、連合バックアップ、またはFedimintのその他の耐障害性の利点なしでソロガーディアンとして操作します。注意して進めてください。生産用途には適していません。"
- },
- "warning-modal": {
- "title": "皆さん、準備はいいですか?",
- "description": "セットアップセレモニーを終了すると、セットアップが失敗し、ガーディアンを再起動する必要が生じる可能性があります。続行する前に、全員がフルセットアップを実行する準備ができていることを確認してください!"
- }
- },
- "run-dkg": {
- "error-config": "分散鍵生成の実行に失敗しました。フェデレーションのセットアップを再起動する必要があります。",
- "error-default": "DKGの準備ができていません。あなたの現在のステータスは",
- "error-header": "何かがうまくいきませんでした。",
- "waiting-header": "ピアを待っています...",
- "generating-header": "コードを生成中..."
- },
- "set-config": {
- "bft-explanation-title": "あなたの連合のビザンチン耐障害性",
- "bft-explanation": "{{total}}のガーディアン連邦が{{honest}}/{{total}}のしきい値を作成します。",
- "bft-faulty": "あなたの連邦は、連邦の運営に影響を与えることなく、{{faulty}} 不良、オフライン、または悪意のあるガーディアンを許容できるようになります。",
- "guardian-name": "ガーディアン名",
- "guardian-name-help": "このランダムな名前は、設定中に他のガーディアンに表示されます。",
- "admin-password": "管理者パスワード",
- "admin-password-generate": "生成する",
- "admin-password-set": "「生成」をクリックして、安全なパスワードを作成してください。変更することはできますが、このパスワードは安全でバックアップされている必要があります!",
- "admin-password-help": "このパスワードをバックアップして、安全に保管してください!このパスワードは復元できません!",
- "admin-password-backup": "私は強力なパスワードを使用しており、それをバックアップしました。(このパスワードは復元できません!)",
- "confirm-password": "パスワードを確認してください",
- "error-password-mismatch": "パスワードが一致しません",
- "join-federation": "連邦参加リンク",
- "join-federation-help": "連邦を作成した人にリンクを尋ねて、ここに貼り付けてください。",
- "basic-settings": "基本事項",
- "federation-settings": "連邦設定",
- "federation-name": "連邦名",
- "guardian-number": "保護者の数",
- "guardian-number-help": "連邦には最低4人の守護者が必要です。これは後で変更することはできません。",
- "bitcoin-settings": "ビットコイン設定",
- "block-confirmations": "追加ブロック確認",
- "block-confirmations-help": "Fedimintガーディアンは、ブロック再編成を避けるために、いくつかの確認を経てブロックチェーンの先端を追跡します。",
- "block-confirmations-warning": "5回未満の追加ブロック確認でFedimintを運用することは非常に危険です!Fedimintはブロックチェーンの再編成に対応できません。",
- "bitcoin-network": "ビットコインネットワーク",
- "select-network": "ネットワークを選択してください",
- "set-rpc-help": "ローカルに設定されたBitcoin RPCアドレス",
- "bitcoin-rpc": "ビットコインRPC",
- "error-valid-number": "有効な番号を入力してください。",
- "error-valid-min": "{{min}}以上の数字を入力してください。",
- "error-valid-max": "{{max}}以下の数を入力してください。",
- "error-valid-min-max": "{{min}}と{{max}}の間の数字を入力してください。",
- "meta-fields": "メタフィールド",
- "meta-fields-description": "詳細についてはドキュメントをご覧ください。",
- "meta-fields-key": "メタキー",
- "meta-fields-value": "価値",
- "meta-fields-effect": "効果",
- "meta-fields-add-another": "もう一つ追加する",
- "meta-fields-title": "あなたのメタ提案:",
- "password-warning": "パスワードをバックアップして、安全に保管してください。このパスワードは復元できません!",
- "password-warning-title": "パスワードのバックアップをしてください!",
- "acknowledge-backed-up": "私は、{{guardianName}}(あなたの保護者名)として、私のパスワードをバックアップし、安全に保管したことを約束します。",
- "confirm-and-backup-password": "パスワードの確認とバックアップ",
- "error-guardian-name-mismatch": "保護者の名前が一致しません",
- "network": "ネットワーク"
- },
- "setup": {
- "common": {
- "restart-setup": "再設定を再起動",
- "restart-setup-alert": "セットアップリーダーがセットアップセレモニーを再起動しました。続行するには、下の「再起動」をクリックしてください。",
- "confirm-restart-setup": "セットアップセレモニーを再起動してもよろしいですか?",
- "confirm-restart-setup-alert": "「再起動」をクリックすると、すべてのガーディアンの儀式が再起動します。"
- },
- "progress": {
- "tos": {
- "title": "利用規約"
- },
- "start": {
- "title": "ようこそ、ガーディアン!",
- "subtitle": "あなたの連合を設定しましょう。",
- "step": "連邦の詳細"
- },
- "set-config": {
- "title": "あなたのフェデレーションのためにいくつかの設定を行う必要があります。",
- "title-solo": "あなたのソロ連邦のためにいくつかの設定を行う必要があります。",
- "subtitle-leader": "あなたの連邦フォロワーが彼らの側でこの情報を確認します。",
- "subtitle-solo": "ソロフェデレーションを運営すると、Fedimintの多くの利点を失います。ガーディアンがオフラインの場合のフォールトトレランスコンセンサスがなく、フェデレーテッドバックアップもできません。注意して進めてください。プロダクション用途やメインネットビットコインとの使用は推奨されません。",
- "subtitle-follower": "あなたの連邦のリーダーが主な連邦の詳細を設定します。すぐにそれを確認します。",
- "step": "連邦の詳細"
- },
- "connect-guardians": {
- "title-leader": "あなたのガーディアンを招待してください",
- "title-follower": "連邦情報を確認してください",
- "subtitle-leader": "他のガーディアンとリンクを共有して、全員が同じページにいるようにしましょう。すべてのガーディアンが参加すると、自動的に次のステップに進みます。",
- "subtitle-follower": "ここの情報が正しいことを確認し、連邦ガーディアンが正しいことを確認してください。問題ないと思ったら、承認ボタンをクリックしてください。",
- "step-leader": "ガーディアンを招待する",
- "step-follower": "情報を確認する"
- },
- "run-dkg": {
- "title": "成功!",
- "subtitle": "すべてのガーディアンが連邦の設定詳細を確認しました。いくつかの数値を計算中です..."
- },
- "verify-guardians": {
- "title": "ガーディアンを確認してください",
- "subtitle": "各ガーディアンに確認コードを尋ね、それを下に貼り付けて有効性を確認してください。もう少しで完了です!",
- "step": "保護者を確認する",
- "leader-confirm-done": "すべてのフォロワーガーディアンが「次へ」をクリックし、続行する前に彼らのガーディアンダッシュボードを確認してください。",
- "leader-confirm-done-emphasis": "「続ける」をクリックすると、セットアップの儀式が完了します。"
- },
- "setup-complete": {
- "step": "完了!"
- },
- "error": {
- "title": "未知のステップ",
- "subtitle": "どうやってここに来たの?!"
- }
- },
- "warning": {
- "title": "セットアップ中は終了したりリフレッシュしたりしないでください!",
- "description": "セットアップ中に終了すると、セットアップが失敗する可能性があり、再起動を行う必要があります。"
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "おめでとうございます",
- "leader-message": "すべてのガーディアンの確認コードが確認されました。",
- "follower-message": "すべて完了しました!他のガーディアンにあなたが稼働していることを知らせてください!",
- "continue": "続ける"
- },
- "terms-of-service": {
- "agree-and-continue": "同意して続行"
- },
- "verify-guardians": {
- "verified": "確認済み",
- "verified-placeholder": "コードをここに貼り付けてください",
- "error": "何かがうまくいかなかった。",
- "error-peer-id": "どのピアであるかを特定できません。リフレッシュして再試行してください。",
- "verification-code": "あなたの確認コード",
- "verification-code-help": "このコードを他のガーディアンと共有してください",
- "table-title": "ガーディアン認証コード",
- "table-description": "各ガーディアンの確認コードを下に入力してください。",
- "table-column-name": "名前",
- "table-column-status": "ステータス",
- "table-column-hash-input": "確認コードを貼り付けてください",
- "wait-all-guardians-verification": "すべてのガーディアンがコードを確認するのを待っています",
- "all-guardians-verified": "すべてのガーディアンがコードを確認しました",
- "starting-consensus": "コンセンサスを開始しています..."
- },
- "footer": {
- "docs-section-header": "ドキュメント",
- "community-section-header": "コミュニティ",
- "contribute-section-header": "貢献する",
- "getting-started-link-text": "始めに",
- "faq-link-text": "よくある質問",
- "blog-link-text": "ブログ",
- "discord-link-text": "ディスコード",
- "twitter-link-text": "ツイッター",
- "github-link-text": "ギットハブ"
- }
-}
diff --git a/apps/guardian-ui/src/languages/ko.json b/apps/guardian-ui/src/languages/ko.json
deleted file mode 100644
index 04fc6496f..000000000
--- a/apps/guardian-ui/src/languages/ko.json
+++ /dev/null
@@ -1,357 +0,0 @@
-{
- "common": {
- "back": "이전",
- "bitcoin": "비트코인",
- "error": "문제가 발생했습니다.",
- "next": "다음",
- "unknown": "알려지지 않은",
- "remove": "제거하다",
- "copy": "복사",
- "copied": "복사됨!",
- "cancel": "취소",
- "review": "리뷰",
- "approvals": "승인",
- "approve": "승인하다",
- "threshold": "임계값",
- "confirm": "확인",
- "you": "당신",
- "close": "닫기",
- "save": "저장",
- "continue": "계속하다",
- "submit": "제출"
- },
- "notConfigured": {
- "title": "미구성",
- "description": "Fedimint 구성 서버의 URL을 입력하세요."
- },
- "connect-guardians": {
- "approve": "승인",
- "approved": "승인됨",
- "invite-guardians": "팔로워 초대",
- "invite-guardians-help": "이 링크를 다른 가디언과 공유하세요.",
- "not-joined": "참여하지 않음",
- "pending": "대기 중",
- "table-description": "보호자는 페더레이션 설정을 확인하면 여기에서 확인됩니다.",
- "table-title": "페더레이션 가디언",
- "meta-field-key": "메타 필드 - {{key}}",
- "waiting-for-guardian": "보호자를 기다리는 중"
- },
- "federation-dashboard": {
- "balance": {
- "label": "균형"
- },
- "bitcoin-node": {
- "label": "비트코인 노드",
- "network-label": "회로망",
- "url-label": "URL"
- },
- "fed-info": {
- "api-version-label": "API 버전",
- "consensus-version-label": "합의 버전",
- "block-count-label": "합의 블록 높이",
- "label": "연맹 정보",
- "your-status-label": "상태",
- "peer-id-label": "피어 ID",
- "session-info": {
- "session-height": "세션 높이",
- "latest-session": "최신 세션"
- }
- },
- "gateways": {
- "fee-label": "게이트웨이 수수료",
- "gateway-id-label": "게이트웨이 ID",
- "label": "라이트닝 게이트웨이",
- "node-id-label": "노드 ID",
- "view-on-site": "{{site}}에서 보기",
- "no-gateways-info-title": "아직 연결된 게이트웨이가 없습니다.",
- "no-gateways-info-description": "라이트닝 노드 운영자는 연합에 연결하여 라이트닝 네트워크 상호 운용성을 제공할 수 있습니다. 연결되면 여기에 표시됩니다."
- },
- "guardians": {
- "health-good": "좋은",
- "health-issue": "문제",
- "health-label": "건강",
- "label": "수호자",
- "last-contribution-label": "마지막 세션 기여",
- "name-label": "이름",
- "status-label": "연결 상태",
- "id-name-label": "ID: 이름",
- "api-url-label": "API URL",
- "fetching-announcement": "공지사항을 가져오는 중..."
- },
- "config": {
- "label": "연합 설정",
- "view-config": "보기",
- "missing-meta-module": "",
- "manage-meta": {
- "tab-label": "",
- "consensus-meta-label": "",
- "submitted-meta-label": "",
- "edit-meta-label": "",
- "submit-meta-edits-button": "",
- "label": "메타 관리",
- "cancel-button": "취소",
- "confirm-modal": {
- "title": "승인 확인",
- "description": "귀하의 승인이 이 메타 변경을 채택하는 기준에 도달할 것입니다. 귀하의 새로운 메타는 다음과 같이 보일 것입니다:"
- },
- "revoke-button": "취소",
- "no-consensus-meta-message": "합의에는 메타가 없다.",
- "proposed-meta-label": "메타 제안",
- "propose-meta": "메타 제안",
- "propose-new-meta-button": "새로운 메타 제안",
- "proposal-approved": "이 제안을 승인하셨습니다.",
- "no-submitted-meta-message": "검토할 메타 편집이 없습니다.",
- "edit-consensus-meta-button": "편집 합의 메타",
- "submit-meta-proposal": "메타 제안 제출",
- "peer-approvals": "동료 승인",
- "actions": "행동",
- "revision": "수정",
- "setup-meta-title": "연합을 위한 메타 설정하기",
- "setup-meta-description": "Fedimint는 클라이언트에게 메타 필드 형태로 추가 정보를 제공할 수 있습니다: 클라이언트와 공유하고자 하는 임의의 정보가 포함된 키-값 쌍입니다. 이러한 메타 필드는 Fedimint에 의해 해석되지 않지만, 합의와 관련이 있습니다. 즉, 연합 구성원 간에 다를 수 없습니다. 이렇게 함으로써 클라이언트는 그 정확성을 신뢰할 수 있습니다.",
- "propose-updates": "페디민트 가디언으로서, 당신은 다른 가디언들이 수용할 메타 업데이트를 제안할 수 있습니다. 업데이트가 일정 수의 가디언들에 의해 수용되면, 그것은 연합의 새로운 합의 메타로 채택됩니다.",
- "core-meta-fields": "다음 메타 필드는 핵심 페디민트 프로토콜의 일환으로 정의되었으며, 귀하의 연합 메타에 포함하는 것이 유용합니다:",
- "meta-field-expiry": "연합이 종료될 유닉스 타임스탬프.",
- "meta-field-name": "연합의 사람이 읽을 수 있는 이름",
- "meta-field-icon": "연합의 로고 아이콘에 대한 URL",
- "meta-field-welcome": "연합에 가입하는 신규 사용자에게 보내는 환영 메시지",
- "meta-field-gateways": "연합에 의해 검증된 게이트웨이 식별자 목록",
- "your-own-fields": "제안에 임의의 메타 필드를 추가할 수도 있습니다. 이러한 필드는 귀하의 연합에 연결되는 모든 클라이언트의 메타에 추가되며, 원하는 용도로 사용할 수 있습니다.",
- "meta-effect-add": "추가하다",
- "meta-effect-modify": "수정하다",
- "meta-effect-unchanged": "변경되지 않음",
- "proposals": "제안"
- },
- "downloadBackup": {
- "button": "",
- "warningTitle": "",
- "warningText": "",
- "cancelButton": "",
- "acknowledgeButton": ""
- }
- },
- "invite-members": "회원 초대",
- "invite-members-prompt": "이 내용을 공유하여 회원을 연맹에 가입하도록 초대하세요.",
- "api-announcements": {
- "label": "API 공지사항",
- "guardian": "가디언",
- "api-url": "API URL",
- "revision": "수정"
- },
- "modal": {
- "client-connect": "클라이언트 연결"
- },
- "danger-zone": {
- "danger-zone-label": "위험 지역",
- "cancel": "취소",
- "danger-zone-description": "주의해서 사용하세요!",
- "guardian-warning-message": "경고: 이 코드를 누구와도 공유하지 마십시오. 이 코드를 가진 사람은 누구나 Guardian으로 인증할 수 있습니다. 개인적인 장소에 있고 누군가 당신의 화면을 보고 있지 않은지 확인하십시오.",
- "guardian-acknowledge": "코드를 인식하고 공개하다",
- "acknowledge-and-download": "인정하고 진행하기",
- "guardian-authenticate": "가디언으로 인증하기",
- "guardian-connect-warning": "이것을 공유하지 마세요",
- "backup": {
- "label": "백업",
- "title": "백업 다운로드",
- "warning-title": "경고",
- "warning-text": "백업에는 연합 수호자를 위한 개인 키와 비밀 자료가 포함되어 있으며 안전하게 보관해야 합니다. 이 백업을 사용한 복구는 귀하의 관리자 비밀번호가 필요합니다!",
- "cancelButton": "취소",
- "acknowledgeButton": "인정하고 다운로드"
- },
- "sign-api-announcement": {
- "label": "서명 API 발표",
- "title": "서명 API 발표",
- "description": "새 API 발표에 서명하세요.",
- "current-api-url": "로컬 구성의 API URL",
- "announced-api-url": "연합 발표에서의 API URL",
- "urls-match": "현재 API URL이 발표한 API URL과 일치합니다.",
- "urls-mismatch": "로컬 구성에서 API URL을 변경했으며 새로운 API 공지를 전파해야 합니다.",
- "sign-button": "새 API 발표 서명",
- "signing-in-progress": "로그인 진행 중...",
- "sign-tooltip": "API URL을 연합에 알리기 위해 API 발표에 서명하세요."
- },
- "schedule-shutdown": {
- "label": "일정 종료",
- "title": "예약 종료",
- "description": "특정 세션 높이 이후에 가디언 노드가 종료되도록 예약하여 fedimintd 바이너리의 조정된 업그레이드를 진행하세요.",
- "current-session": "현재 세션",
- "session-to-shutdown": "세션 종료 시각",
- "confirm-shutdown": "종료 확인",
- "session-to-shutdown-helper": "가드리안 노드를 종료하려는 세션 높이를 입력하세요."
- }
- }
- },
- "footer": {
- "blog-link-text": "블로그",
- "community-section-header": "지역 사회",
- "contribute-section-header": "기여하다",
- "discord-link-text": "불화",
- "docs-section-header": "문서",
- "faq-link-text": "자주 묻는 질문",
- "getting-started-link-text": "시작하기",
- "github-link-text": "GitHub",
- "twitter-link-text": "트위터"
- },
- "login": {
- "password": "비밀번호",
- "submit": "제출",
- "subtitle": "비밀번호를 입력해주세요.",
- "title": "돌아온 것을 환영합니다!"
- },
- "role-selector": {
- "disclaimer-text": "문제점은 https://github.com/fedimint/fedimint/issues 에 보고해 주세요.",
- "disclaimer-title": "Fedimint는 베타 소프트웨어입니다",
- "follower": {
- "description": "구성 리더가 구성을 설정하면 다른 보호자가 이 옵션을 선택하여 설정을 승인하고 연합을 만듭니다.",
- "label": "팔로워"
- },
- "leader": {
- "description": "다른 보호자가 승인한 구성 설정을 입력하세요. 한 명의 보호자가 설정 리더 역할을 합니다.",
- "label": "구성 리더"
- },
- "solo": {
- "label": "독주",
- "description": "합의, 내결함성, 통합 백업 또는 Fedimint의 기타 탄력성 이점 없이 Fedimint를 Solo Guardian으로 운영하십시오. 프로덕션 용도로 사용할 수 없으므로 주의해서 진행하세요."
- },
- "warning-modal": {
- "title": "모두 준비됐나요?",
- "description": "설정 의식을 종료하면 설정이 실패할 수 있으며 가디언을 다시 시작해야 할 수 있습니다. 계속 진행하기 전에 모든 사람이 전체 설정을 실행할 준비가 되었는지 확인하세요!"
- }
- },
- "run-dkg": {
- "error-config": "분산 키 생성에 실패했습니다. 연합 설정을 다시 시작해야 합니다.",
- "error-default": "DKG를 위한 준비가 되지 않았습니다. 현재 상태는 다음과 같습니다:",
- "error-header": "문제가 발생했습니다.",
- "generating-header": "코드 생성 중...",
- "waiting-header": "피어 대기 중..."
- },
- "set-config": {
- "admin-password": "관리자 비밀번호",
- "admin-password-help": "강력한 비밀번호를 사용하고 백업하세요! 이 비밀번호는 복구할 수 없습니다!",
- "confirm-password": "비밀번호 확인",
- "error-password-mismatch": "비밀번호가 일치하지 않습니다",
- "bitcoin-settings": "비트코인 설정",
- "bitcoin-network": "비트코인 네트워크",
- "bitcoin-rpc": "비트코인 RPC",
- "block-confirmations": "블록 확인",
- "block-confirmations-help": "확인하기 전에 필요한 블록 확인 횟수는 몇 개인가요?",
- "error-valid-number": "유효한 숫자를 입력해주세요.",
- "error-valid-min": "최소한 {{min}} 이상의 숫자를 입력해주세요.",
- "error-valid-max": "최대한 {{max}} 이하의 숫자를 입력해주세요.",
- "error-valid-min-max": "{{min}}에서 {{max}} 사이의 숫자를 입력해주세요.",
- "federation-name": "연합 이름",
- "basic-settings": "기본 설정",
- "federation-settings": "연합 설정",
- "guardian-name": "가디언 이름",
- "guardian-name-help": "다른 가디언에게 표시될 이름입니다.",
- "guardian-number": "가디언 수",
- "guardian-number-help": "연맹에는 최소 4명의 보호자가 필요합니다. 나중에 변경할 수 없습니다.",
- "join-federation": "연합 가입 링크",
- "join-federation-help": "연합을 생성한 사람에게 링크를 요청하고 여기에 붙여넣으세요.",
- "select-network": "네트워크 선택",
- "set-rpc-help": "로컬로 구성된 비트코인 RPC 주소",
- "block-confirmations-warning": "6개 미만의 블록 확인으로 Fedimint를 실행하는 것은 매우 위험합니다!",
- "meta-fields": "메타 필드",
- "meta-fields-description": "Fedimint 클라이언트에 추가 구성이 전송되었습니다. 자세한 내용은 문서를 참조하세요.",
- "meta-fields-key": "메타 키",
- "meta-fields-value": "값",
- "meta-fields-add-another": "다른 것을 추가하세요",
- "bft-explanation-title": "귀하의 연합의 비잔틴 결함 허용성",
- "bft-explanation": "A {{total}} 가디언 연합이 {{honest}}/{{total}} 임계값을 생성합니다.",
- "bft-faulty": "귀하의 연합은 {{faulty}} 결함이 있는, 오프라인 상태이거나 악의적인 가디언을 연합의 운영에 영향을 주지 않고 견딜 수 있습니다.",
- "admin-password-generate": "생성하다",
- "admin-password-set": "생성'을 클릭하여 안전한 비밀번호를 만드세요. 수정할 수 있지만, 이 비밀번호는 안전하고 백업되어야 합니다!",
- "admin-password-backup": "나는 강력한 비밀번호를 사용하고 있으며 백업해 두었습니다. (이 비밀번호는 복구할 수 없습니다!)",
- "meta-fields-effect": "효과",
- "meta-fields-title": "귀하의 메타 제안:",
- "password-warning": "비밀번호를 백업하고 안전하게 보관하세요. 이 비밀번호는 복구할 수 없습니다!",
- "password-warning-title": "비밀번호 백업!",
- "acknowledge-backed-up": "저는 {{guardianName}} (귀하의 보호자 이름)이며, 제 비밀번호를 백업하고 안전하게 보관했음을 약속합니다:",
- "confirm-and-backup-password": "비밀번호 확인 및 백업",
- "error-guardian-name-mismatch": "보호자 이름이 일치하지 않습니다.",
- "network": "네트워크"
- },
- "setup": {
- "common": {
- "restart-setup": "설정 다시 시작",
- "restart-setup-alert": "피어가 설정 프로세스를 다시 시작하도록 요청했습니다. 이렇게 하면 Fedimint 노드에 대해 이미 선택한 모든 구성이 재설정됩니다",
- "confirm-restart-setup": "설치 행사를 다시 시작하시겠습니까?",
- "confirm-restart-setup-alert": "다시 시작\"을 클릭하면 모든 수호자의 의식이 다시 시작됩니다."
- },
- "auth": {},
- "progress": {
- "connect-guardians": {
- "step-follower": "정보 확인",
- "step-leader": "보호자 초대",
- "subtitle-follower": "여기에 있는 정보가 정확하고 가디언이 올바른지 확인하세요. 확인해 보기 좋을 때 승인 버튼을 클릭하세요.",
- "subtitle-leader": "모두가 동일한 페이지에서 작업하기 위해 링크를 다른 가디언들과 공유하세요. 모든 가디언이 가입하면 자동으로 다음 단계로 넘어갑니다.",
- "title-follower": "연합 정보를 확인하세요",
- "title-leader": "가디언을 초대하세요"
- },
- "error": {
- "subtitle": "여기에 어떻게 왔나요?!",
- "title": "알 수 없는 단계"
- },
- "run-dkg": {
- "subtitle": "모든 가디언이 연합 설정 정보를 검증했습니다. 몇 가지 계산 중...",
- "title": "성공!"
- },
- "set-config": {
- "step": "제휴 세부정보",
- "subtitle-follower": "리더 가디언은 연합의 주요 정보를 설정할 것입니다. 곧 이 정보를 확인하게 됩니다.",
- "subtitle-leader": "팔로워 가디언들은 이 정보를 확인하게 됩니다.",
- "title": "페더레이션에 대한 몇 가지 구성을 설정해야 합니다",
- "title-solo": "솔로 페더레이션을 위한 몇 가지 구성을 설정해야 합니다.",
- "subtitle-solo": "Solo Federation을 운영하면 Fedimint의 많은 이점이 사라집니다. 오프라인 상태인 보호자에 대한 내결함성 합의가 없으며 통합 백업을 수행할 수 없습니다. 주의해서 진행하세요. 프로덕션 용도나 메인넷 비트코인과 함께 사용하는 것은 권장되지 않습니다."
- },
- "setup-complete": {
- "step": "완료!"
- },
- "start": {
- "step": "제휴 세부정보",
- "subtitle": "연맹을 설정합시다.",
- "title": "Fedimint에 오신 것을 환영합니다!"
- },
- "verify-guardians": {
- "step": "보호자 확인",
- "subtitle": "각 가디언으로부터 검증 코드를 요청하고 아래에 붙여넣어 유효성을 확인하세요. 거의 끝났습니다!",
- "title": "가디언 확인",
- "leader-confirm-done": "모든 팔로워 가디언이 \"다음\"을 클릭하고 가디언 대시보드를 확인했는지 확인한 후 계속 진행하세요.",
- "leader-confirm-done-emphasis": "계속\"을 클릭하면 설정 절차가 완료됩니다."
- },
- "tos": {
- "title": "서비스 약관"
- }
- },
- "warning": {
- "title": "설치 중에는 종료하거나 새로 고침하지 마세요!",
- "description": "설치 중에 종료하면 설치가 실패할 수 있으며, 새로 시작해야 할 수 있습니다."
- }
- },
- "setup-complete": {
- "congratulations": "축하합니다",
- "continue": "계속",
- "header": "🎉 🎉 🎉",
- "sentence-one": "모든 가디언의 검증 코드가 확인되었습니다.",
- "leader-message": "모든 수호자의 인증 코드가 확인되었습니다.",
- "follower-message": "모두 완료되었습니다! 다른 가디언들에게 당신이 실행 중이라고 알려주세요!"
- },
- "verify-guardians": {
- "all-guardians-verified": "모든 보호자가 코드를 확인했습니다",
- "error": "문제가 발생했습니다.",
- "error-peer-id": "어떤 피어인지 확인할 수 없습니다. 새로 고침 후 다시 시도하세요.",
- "starting-consensus": "합의 시작 중...",
- "table-column-hash-input": "검증 코드 붙여넣기",
- "table-column-name": "이름",
- "table-column-status": "상태",
- "table-description": "각 가디언의 검증 코드를 아래에 입력하세요.",
- "table-title": "가디언 검증 코드",
- "verification-code": "검증 코드",
- "verification-code-help": "이 코드를 다른 가디언과 공유하세요.",
- "verified": "확인됨",
- "verified-placeholder": "여기에 코드를 입력하세요",
- "wait-all-guardians-verification": "모든 보호자가 코드를 확인하기를 기다리는 중"
- },
- "terms-of-service": {
- "agree-and-continue": "동의하고 계속하세요"
- }
-}
diff --git a/apps/guardian-ui/src/languages/pt.json b/apps/guardian-ui/src/languages/pt.json
deleted file mode 100644
index 973113ea4..000000000
--- a/apps/guardian-ui/src/languages/pt.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Bitcoin",
- "next": "Próximo",
- "back": "Voltar",
- "error": "Algo deu errado.",
- "unknown": "Desconhecido",
- "remove": "Remover",
- "copy": "Copiar",
- "copied": "Copiado!",
- "cancel": "Cancelar",
- "review": "Revisão",
- "approvals": "Aprovações",
- "approve": "Aprovar",
- "threshold": "Limite",
- "confirm": "Confirmar",
- "you": "Você",
- "close": "Fechar",
- "save": "Salvar",
- "continue": "Continuar",
- "submit": "Enviar"
- },
- "notConfigured": {
- "title": "Não configurado",
- "description": "Por favor, insira a URL do servidor de configuração Fedimint para continuar."
- },
- "connect-guardians": {
- "invite-guardians": "Convidar Seguidores",
- "invite-guardians-help": "Compartilhe este link com os outros Guardiões.",
- "approve": "Aprovar",
- "approved": "Aprovado",
- "pending": "Pendente",
- "not-joined": "Não unido",
- "waiting-for-guardian": "Aguardando o guardião",
- "table-title": "Guardiões da Federação",
- "table-description": "Os guardiões serão confirmados aqui assim que confirmarem as configurações da Federação.",
- "meta-field-key": "Campo meta - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Convide membros ou autentique-se como um guardião",
- "invite-members-prompt": "Compartilhe isso para convidar membros a se juntarem à federação.",
- "fed-info": {
- "label": "Informações da Federação",
- "your-status-label": "Status",
- "block-count-label": "Altura do Bloco de Consenso",
- "api-version-label": "Versão da API",
- "consensus-version-label": "Versão de consenso",
- "peer-id-label": "ID do Parceria",
- "session-info": {
- "session-height": "Altura da Sessão",
- "latest-session": "Última Sessão"
- }
- },
- "balance": {
- "label": "Balanço Patrimonial"
- },
- "bitcoin-node": {
- "label": "Nó Bitcoin",
- "url-label": "URL",
- "network-label": "Rede"
- },
- "guardians": {
- "label": "Outros Guardiões",
- "id-name-label": "ID: Nome",
- "status-label": "Status da Conexão",
- "health-label": "Saúde",
- "health-issue": "Problema",
- "health-good": "Bom",
- "last-contribution-label": "Última Contribuição de Sessão",
- "api-url-label": "URL da API",
- "fetching-announcement": "Buscando anúncio..."
- },
- "gateways": {
- "label": "Portais de Relâmpago",
- "node-id-label": "ID do Nó Lightning",
- "gateway-id-label": "ID do Gateway",
- "fee-label": "Taxa de gateway",
- "view-on-site": "Ver em {{site}}",
- "no-gateways-info-title": "Nenhum gateway conectado ainda!",
- "no-gateways-info-description": "Os operadores de nós Lightning podem se conectar à sua federação para fornecer interoperabilidade da Lightning Network. Uma vez conectados, eles aparecerão aqui."
- },
- "api-announcements": {
- "label": "Anúncios da API",
- "guardian": "Guardião",
- "api-url": "URL da API",
- "revision": "Revisão"
- },
- "config": {
- "label": "Configuração da Federação",
- "view-config": "Ver Configuração",
- "missing-meta-module": "A edição de campos Meta não é possível. O módulo Meta não está disponível para esta federação.",
- "manage-meta": {
- "label": "Gerenciar Meta",
- "cancel-button": "Cancelar",
- "confirm-modal": {
- "title": "Confirmar Aprovação",
- "description": "Sua aprovação atingirá o limite para adotar essa mudança meta. Sua nova meta será assim:"
- },
- "consensus-meta-label": "Meta atual em consenso",
- "revoke-button": "Revogar",
- "no-consensus-meta-message": "não há meta no consenso",
- "proposed-meta-label": "Propostas Meta",
- "propose-meta": "Propor Meta",
- "propose-new-meta-button": "Propor Novo Meta",
- "proposal-approved": "Você aprovou esta proposta.",
- "no-submitted-meta-message": "não há edições meta para revisar",
- "edit-meta-label": "Editar meta",
- "edit-consensus-meta-button": "Editar Meta de Consenso",
- "submit-meta-proposal": "Enviar Proposta Meta",
- "peer-approvals": "Aprovações de Colegas",
- "actions": "Ações",
- "revision": "Revisão",
- "setup-meta-title": "Configurando um Meta para sua Federação",
- "setup-meta-description": "Fedimint pode fornecer informações adicionais aos clientes na forma de campos meta: pares de chave-valor com informações arbitrárias que você pode querer compartilhar com os clientes. Embora esses campos meta não sejam interpretados pelo Fedimint, eles são relevantes para o consenso, ou seja, não podem diferir entre os membros da federação. Dessa forma, os clientes podem confiar em sua correção.",
- "propose-updates": "Como um guardião do fedimint, você pode propor atualizações para o meta que serão aceitas pelos outros guardiões. Uma vez que a atualização é aceita por um limite de guardiões, ela será adotada como o novo meta de consenso para a federação.",
- "core-meta-fields": "Os seguintes campos meta foram definidos como parte do protocolo central Fedimint e são úteis para incluir nos meta da sua federação:",
- "meta-field-expiry": "Um timestamp Unix após o qual a federação será encerrada.",
- "meta-field-name": "O nome legível por humanos da federação",
- "meta-field-icon": "Uma URL para um ícone de logo para a federação",
- "meta-field-welcome": "Uma mensagem de boas-vindas para novos usuários que estão se juntando à federação.",
- "meta-field-gateways": "Uma lista de identificadores de gateway aprovados pela federação",
- "your-own-fields": "Você também pode adicionar seus próprios campos meta arbitrários à proposta. Estes serão adicionados ao meta de todos os clientes que se conectam à sua federação e podem ser usados para qualquer propósito que você desejar.",
- "meta-effect-add": "Adicionar",
- "meta-effect-modify": "Modificar",
- "meta-effect-unchanged": "Inalterado",
- "proposals": "Propostas"
- }
- },
- "modal": {
- "client-connect": "Conectar um Cliente"
- },
- "danger-zone": {
- "danger-zone-label": "Zona de Perigo",
- "cancel": "Cancelar",
- "danger-zone-description": "Use com cautela!",
- "guardian-warning-message": "AVISO: Não compartilhe este código com ninguém. Qualquer pessoa com este código pode se autenticar como um Guardião. Certifique-se de que você está em um local privado e que ninguém está olhando para a sua tela.",
- "guardian-acknowledge": "Reconhecer e Revelar Código",
- "acknowledge-and-download": "Reconhecer e Prosseguir",
- "guardian-authenticate": "Autenticar como Guardião",
- "guardian-connect-warning": "NÃO COMPARTILHE ISSO",
- "backup": {
- "label": "Cópia de segurança",
- "title": "Baixar Backup",
- "warning-title": "Aviso",
- "warning-text": "O backup contém chaves privadas e material secreto para o guardião da federação e deve ser mantido seguro. A recuperação usando este backup requer sua senha de administrador!",
- "cancelButton": "Cancelar",
- "acknowledgeButton": "Reconhecer e Baixar"
- },
- "sign-api-announcement": {
- "label": "Anúncio da API de Assinatura",
- "title": "Anúncio da API de Assinatura",
- "description": "Assine um novo anúncio de API.",
- "current-api-url": "Sua URL da API da Configuração Local",
- "announced-api-url": "Sua URL da API de Anúncios da Federação",
- "urls-match": "Sua URL de API atual corresponde à sua URL de API anunciada.",
- "urls-mismatch": "Você alterou a URL da API em sua configuração local e precisa fazer um novo anúncio da API.",
- "sign-button": "Anúncio da nova API",
- "signing-in-progress": "Fazendo login...",
- "sign-tooltip": "Assine o anúncio da API para anunciar sua URL da API à federação."
- },
- "schedule-shutdown": {
- "label": "Agendar Desligamento",
- "title": "Agendar Desligamento",
- "description": "Programe seu nó guardião para desligar após uma altura de sessão específica para uma atualização coordenada de seus binários fedimintd.",
- "current-session": "Sessão Atual",
- "session-to-shutdown": "Sessão para desligar em",
- "confirm-shutdown": "Confirmar Desligamento",
- "session-to-shutdown-helper": "Insira a altura da sessão na qual você deseja desligar seu nó guardião."
- }
- }
- },
- "login": {
- "title": "Bem-vindo de volta!",
- "subtitle": "Por favor, insira sua senha.",
- "password": "Senha",
- "submit": "Enviar"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint é um software beta.",
- "disclaimer-text": "Por favor, reporte problemas em https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Configuração do Líder",
- "description": "Insira as configurações que outros Guardiões aprovam. Um Guardião atua como Líder de Configuração."
- },
- "follower": {
- "label": "Seguidor",
- "description": "Uma vez que um Líder de Configuração define as configurações, outros Guardiões escolhem esta opção para aprovar as definições e criar a Federação."
- },
- "solo": {
- "label": "Solo",
- "description": "Operar o Fedimint como um Guardião Solo sem consenso, tolerância a falhas, backups federados ou outros benefícios de resiliência do Fedimint. Proceda com cautela, não é destinado para uso em produção."
- },
- "warning-modal": {
- "title": "Está todo mundo pronto?",
- "description": "Sair da cerimônia de configuração pode fazer com que a configuração falhe e exigir que você reinicie seu guardião. Certifique-se de que todos estejam prontos para executar a configuração completa antes de continuar!"
- }
- },
- "run-dkg": {
- "error-config": "Falha ao executar a geração de chaves distribuídas. A configuração da federação deve ser reiniciada.",
- "error-default": "Não está pronto para DKG, seu status atual é",
- "error-header": "Algo deu errado.",
- "waiting-header": "Aguardando pares...",
- "generating-header": "Gerando códigos..."
- },
- "set-config": {
- "bft-explanation-title": "Tolerância a Falhas Bizantinas da Sua Federação",
- "bft-explanation": "Uma {{total}} Federação dos Guardiões cria um {{honesto}}/{{total}} Limite.",
- "bft-faulty": "Sua Federação será capaz de tolerar {{faulty}} Guardiões com defeito, offline ou maliciosos, sem impactar as operações da Federação.",
- "guardian-name": "Nome do guardião",
- "guardian-name-help": "Este nome aleatório será mostrado a outros Guardiões durante a configuração.",
- "admin-password": "Senha de administrador",
- "admin-password-generate": "Gerar",
- "admin-password-set": "Clique em 'Gerar' para criar uma senha segura. Você pode modificá-la, mas esta senha deve ser segura e ter um backup!",
- "admin-password-help": "Faça backup desta senha e mantenha-a segura! Você não pode recuperar esta senha!",
- "admin-password-backup": "Estou usando uma senha forte e a fiz backup. (Você não pode recuperar esta senha!)",
- "confirm-password": "Confirmar senha",
- "error-password-mismatch": "As senhas não coincidem",
- "join-federation": "Junte-se ao link da Federação",
- "join-federation-help": "Peça à pessoa que criou a Federação um link e cole-o aqui.",
- "basic-settings": "Noções básicas",
- "federation-settings": "Configurações da federação",
- "federation-name": "Nome da federação",
- "guardian-number": "Número de guardiões",
- "guardian-number-help": "As federações exigem um mínimo de 4 guardiões. Isso não pode ser alterado posteriormente.",
- "bitcoin-settings": "Configurações do Bitcoin",
- "block-confirmations": "Confirmações de Bloco Adicionais",
- "block-confirmations-help": "Os Guardiões do Fedimint seguem a ponta da blockchain por várias confirmações para evitar reorganizações de blocos.",
- "block-confirmations-warning": "Executar o Fedimint com menos de 5 confirmações de bloco adicionais é extremamente arriscado! O Fedimint NÃO consegue lidar com reorganizações de blockchain.",
- "bitcoin-network": "Rede Bitcoin",
- "select-network": "Selecione uma rede",
- "set-rpc-help": "Endereço RPC do Bitcoin configurado localmente",
- "bitcoin-rpc": "Bitcoin RPC",
- "error-valid-number": "Por favor, insira um número válido.",
- "error-valid-min": "Por favor, insira um número de pelo menos {{min}}.",
- "error-valid-max": "Por favor, insira um número de no máximo {{max}}.",
- "error-valid-min-max": "Por favor, insira um número entre {{min}} e {{max}}.",
- "meta-fields": "Campos meta",
- "meta-fields-description": "Veja documentação para mais informações.",
- "meta-fields-key": "Chave meta",
- "meta-fields-value": "Valor",
- "meta-fields-effect": "Efeito",
- "meta-fields-add-another": "Adicionar outro",
- "meta-fields-title": "Sua Proposta Meta:",
- "password-warning": "Você deve fazer um backup da sua senha e mantê-la segura. Esta senha é necessária para acessar seu painel de guardião. Você não pode recuperá-la se perder!",
- "password-warning-title": "Faça um backup da sua senha!",
- "acknowledge-backed-up": "Eu, {{guardianName}} (seu nome de guardião), prometo que fiz backup e protegi minha senha:",
- "confirm-and-backup-password": "Confirmar e Fazer Backup da Senha",
- "error-guardian-name-mismatch": "O nome do guardião não corresponde.",
- "network": "Rede"
- },
- "setup": {
- "common": {
- "restart-setup": "Reiniciar Configuração",
- "restart-setup-alert": "O Líder de Configuração reiniciou a Cerimônia de Configuração. Por favor, clique em \"Reiniciar\" abaixo para continuar.",
- "confirm-restart-setup": "Você tem certeza de que deseja reiniciar a Cerimônia de Configuração?",
- "confirm-restart-setup-alert": "Clicar em \"Reiniciar\" reiniciará a cerimônia para todos os Guardiões."
- },
- "progress": {
- "tos": {
- "title": "Termos de serviço"
- },
- "start": {
- "title": "Bem-vindo, Guardião!",
- "subtitle": "Vamos configurar sua federação.",
- "step": "Detalhes da federação"
- },
- "set-config": {
- "title": "Precisamos definir algumas configurações para sua Federação.",
- "title-solo": "Precisamos definir algumas configurações para sua Federação Solo.",
- "subtitle-leader": "Seus Seguidores da Federação confirmarão essas informações do lado deles.",
- "subtitle-solo": "Executar uma Federação Solo perde muitos dos benefícios do Fedimint. Você não terá consenso de tolerância a falhas se um guardião estiver offline e não poderá fazer backups federados. Prossiga com cautela, não recomendado para uso em produção ou uso com Bitcoin na mainnet.",
- "subtitle-follower": "Seu Líder da Federação estará configurando os principais detalhes da Federação. Você os confirmará em breve.",
- "step": "Detalhes da federação"
- },
- "connect-guardians": {
- "title-leader": "Convide seus Guardiões",
- "title-follower": "Confirme suas Informações de Federação",
- "subtitle-leader": "Compartilhe o link com os outros Guardiões para que todos estejam na mesma página. Assim que todos os Guardiões se juntarem, você avançará automaticamente para a próxima etapa.",
- "subtitle-follower": "Certifique-se de que as informações aqui estão corretas e que os Guardiões da Federação estão certos. Clique no botão Aprovar quando tiver certeza de que está tudo certo.",
- "step-leader": "Convide Guardiões",
- "step-follower": "Confirmar informações"
- },
- "run-dkg": {
- "title": "Sucesso!",
- "subtitle": "Todos os Guardiões validaram os detalhes da configuração da federação. Executando alguns cálculos..."
- },
- "verify-guardians": {
- "title": "Verifique seus Guardiões",
- "subtitle": "Peça a cada Guardião o seu código de verificação e cole-os abaixo para verificar a validade. Estamos quase lá!",
- "step": "Verificar guardiões",
- "leader-confirm-done": "Confirme que todos os Guardiões seguidores clicaram em \"Próximo\" e veja seus painéis de guardião antes de continuar.",
- "leader-confirm-done-emphasis": "Clicar em \"Continuar\" completará a cerimônia de configuração."
- },
- "setup-complete": {
- "step": "Feito!"
- },
- "error": {
- "title": "Passo desconhecido",
- "subtitle": "Como você chegou aqui?!"
- }
- },
- "warning": {
- "title": "Não saia ou atualize durante a configuração!",
- "description": "Sair durante a configuração pode fazer com que a configuração falhe e você terá que reiniciar do zero."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Parabéns",
- "leader-message": "Todos os códigos de verificação dos Guardiões foram verificados.",
- "follower-message": "Você terminou! Avise os outros Guardiões que você está em execução!",
- "continue": "Continuar"
- },
- "terms-of-service": {
- "agree-and-continue": "Concordar e continuar"
- },
- "verify-guardians": {
- "verified": "Verificado",
- "verified-placeholder": "Cole o código aqui",
- "error": "Algo deu errado.",
- "error-peer-id": "Não foi possível determinar qual é o seu par. Por favor, atualize e tente novamente.",
- "verification-code": "Seu código de verificação",
- "verification-code-help": "Compartilhe este código com outros guardiões.",
- "table-title": "Códigos de verificação do Guardião",
- "table-description": "Insira os códigos de verificação de cada Guardião abaixo.",
- "table-column-name": "Nome",
- "table-column-status": "Status",
- "table-column-hash-input": "Cole o código de verificação",
- "wait-all-guardians-verification": "Aguardando todos os Guardiões verificarem seus códigos",
- "all-guardians-verified": "Todos os Guardiões verificaram seus códigos.",
- "starting-consensus": "Iniciando consenso..."
- },
- "footer": {
- "docs-section-header": "Documentos",
- "community-section-header": "Comunidade",
- "contribute-section-header": "Contribuir",
- "getting-started-link-text": "Começando",
- "faq-link-text": "Perguntas Frequentes",
- "blog-link-text": "Blogue",
- "discord-link-text": "Discord",
- "twitter-link-text": "Twitter",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/languages/ru.json b/apps/guardian-ui/src/languages/ru.json
deleted file mode 100644
index 2ae946ffc..000000000
--- a/apps/guardian-ui/src/languages/ru.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "Биткойн",
- "next": "Далее",
- "back": "Назад",
- "error": "Что-то пошло не так.",
- "unknown": "Неизвестно",
- "remove": "Удалить",
- "copy": "Копировать",
- "copied": "Скопировано!",
- "cancel": "Отмена",
- "review": "Обзор",
- "approvals": "Утверждения",
- "approve": "Одобрить",
- "threshold": "Порог",
- "confirm": "Подтвердить",
- "you": "Ты",
- "close": "Закрыть",
- "save": "Сохранить",
- "continue": "Продолжить",
- "submit": "Отправить"
- },
- "notConfigured": {
- "title": "Не настроен",
- "description": "Пожалуйста, введите URL сервера конфигурации Fedimint для продолжения."
- },
- "connect-guardians": {
- "invite-guardians": "Пригласить подписчиков",
- "invite-guardians-help": "Поделитесь этой ссылкой с другими Стражами",
- "approve": "Утвердить",
- "approved": "Утверждено",
- "pending": "В ожидании",
- "not-joined": "Не присоединился",
- "waiting-for-guardian": "Ожидание опекуна",
- "table-title": "Стражи Федерации",
- "table-description": "Стражи будут подтверждены здесь, как только они подтвердят настройки Федерации.",
- "meta-field-key": "Метаполе - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "Пригласите участников или аутентифицируйтесь как опекун",
- "invite-members-prompt": "Поделитесь этим, чтобы пригласить участников присоединиться к федерации.",
- "fed-info": {
- "label": "Информация о Федерации",
- "your-status-label": "Статус",
- "block-count-label": "Консенсусная высота блока",
- "api-version-label": "Версия API",
- "consensus-version-label": "Версия консенсуса",
- "peer-id-label": "Идентификатор участника",
- "session-info": {
- "session-height": "Высота сессии",
- "latest-session": "Последняя сессия"
- }
- },
- "balance": {
- "label": "Баланс"
- },
- "bitcoin-node": {
- "label": "Биткойн-узел",
- "url-label": "URL",
- "network-label": "Сеть"
- },
- "guardians": {
- "label": "Другие Стражи",
- "id-name-label": "ИД: Имя",
- "status-label": "Статус соединения",
- "health-label": "Здоровье",
- "health-issue": "Проблема",
- "health-good": "Хорошо",
- "last-contribution-label": "Последний вклад в сессию",
- "api-url-label": "API URL",
- "fetching-announcement": "Получение объявления..."
- },
- "gateways": {
- "label": "Молниеносные шлюзы",
- "node-id-label": "Идентификатор узла Lightning",
- "gateway-id-label": "Идентификатор шлюза",
- "fee-label": "Плата за шлюз",
- "view-on-site": "Просмотр на {{site}}",
- "no-gateways-info-title": "Пока нет подключенных шлюзов!",
- "no-gateways-info-description": "Операторы узлов Lightning могут подключиться к вашей федерации для обеспечения совместимости с сетью Lightning. После подключения они появятся здесь."
- },
- "api-announcements": {
- "label": "Объявления API",
- "guardian": "Страж",
- "api-url": "API URL",
- "revision": "Ревизия"
- },
- "config": {
- "label": "Конфигурация Федерации",
- "view-config": "Просмотр конфигурации",
- "missing-meta-module": "Редактирование метаполей невозможно. Модуль Meta недоступен для этой федерации.",
- "manage-meta": {
- "label": "Управление Meta",
- "cancel-button": "Отмена",
- "confirm-modal": {
- "title": "Подтвердить одобрение",
- "description": "Ваше одобрение достигнет порога для принятия этого мета-изменения. Ваш новый мета будет выглядеть так:"
- },
- "consensus-meta-label": "Текущая мета в консенсусе",
- "revoke-button": "Отозвать",
- "no-consensus-meta-message": "в консенсусе нет мета",
- "proposed-meta-label": "Метапредложения",
- "propose-meta": "Предложить Meta",
- "propose-new-meta-button": "Предложить новый мета",
- "proposal-approved": "Вы одобрили это предложение.",
- "no-submitted-meta-message": "нет мета-правок для проверки",
- "edit-meta-label": "Редактировать мета",
- "edit-consensus-meta-button": "Редактировать Консенсус Мета",
- "submit-meta-proposal": "Отправить мета-предложение",
- "peer-approvals": "Одобрения коллег",
- "actions": "Действия",
- "revision": "Ревизия",
- "setup-meta-title": "Настройка меты для вашей Федерации",
- "setup-meta-description": "Fedimint может предоставить дополнительную информацию клиентам в виде метаполей: пар ключ-значение с произвольной информацией, которую вы можете захотеть поделиться с клиентами. Хотя эти метаполя не интерпретируются Fedimint, они имеют значение для консенсуса, т.е. они не могут отличаться между членами федерации. Таким образом, клиенты могут полагаться на их корректность.",
- "propose-updates": "В качестве хранителя fedimint вы можете предлагать обновления метаданных, которые будут приняты другими хранителями. Как только обновление будет принято порогом хранителей, оно будет принято в качестве нового консенсусного мета для федерации.",
- "core-meta-fields": "Следующие метаполя были определены как часть основного протокола Fedimint и полезны для включения в метаданные вашей федерации:",
- "meta-field-expiry": "Универсальная метка времени, после которой федерация будет закрыта.",
- "meta-field-name": "Читаемое человеком название федерации",
- "meta-field-icon": "URL для логотипа федерации",
- "meta-field-welcome": "Приветственное сообщение для новых пользователей, присоединяющихся к федерации",
- "meta-field-gateways": "Список идентификаторов шлюзов, проверенных федерацией",
- "your-own-fields": "Вы также можете добавить свои произвольные метаполя к предложению. Они будут добавлены к метаданных всех клиентов, которые подключаются к вашей федерации, и могут использоваться для любых целей, которые вам нравятся.",
- "meta-effect-add": "Добавить",
- "meta-effect-modify": "Изменить",
- "meta-effect-unchanged": "Без изменений",
- "proposals": "Предложения"
- }
- },
- "modal": {
- "client-connect": "Подключить клиента"
- },
- "danger-zone": {
- "danger-zone-label": "Зона опасности",
- "cancel": "Отменить",
- "danger-zone-description": "Используйте с осторожностью!",
- "guardian-warning-message": "ПРЕДУПРЕЖДЕНИЕ: Не делитесь этим кодом ни с кем. Любой, у кого есть этот код, может аутентифицироваться как Хранитель. Убедитесь, что вы находитесь в уединенном месте и никто не смотрит на ваш экран.",
- "guardian-acknowledge": "Признайте и раскройте код",
- "acknowledge-and-download": "Принять и продолжить",
- "guardian-authenticate": "Аутентификация как Хранитель",
- "guardian-connect-warning": "НЕ ДЕЛИТЕСЬ ЭТИМ",
- "backup": {
- "label": "Резервное копирование",
- "title": "Скачать резервную копию",
- "warning-title": "Предупреждение",
- "warning-text": "Резервная копия содержит приватные ключи и секретные материалы для федеративного хранителя и должна храниться в безопасности. Восстановление с использованием этой резервной копии требует вашего административного пароля!",
- "cancelButton": "Отменить",
- "acknowledgeButton": "Принять и скачать"
- },
- "sign-api-announcement": {
- "label": "Объявление о Sign API",
- "title": "Объявление API Sign",
- "description": "Подпишите новое объявление API.",
- "current-api-url": "Ваш URL API из локальной конфигурации",
- "announced-api-url": "Ваш URL API из объявлений Федерации",
- "urls-match": "Ваш текущий URL API соответствует вашему объявленному URL API.",
- "urls-mismatch": "Вы изменили URL API в вашей локальной конфигурации и необходимо сделать новое объявление API.",
- "sign-button": "Подпишите новое объявление API",
- "signing-in-progress": "Вход в систему...",
- "sign-tooltip": "Подпишите объявление API, чтобы объявить ваш URL API федерации."
- },
- "schedule-shutdown": {
- "label": "Запланировать отключение",
- "title": "Запланировать отключение",
- "description": "Запланируйте отключение вашего узла-стража после достижения определенной высоты сессии для координированного обновления ваших бинарных файлов fedimintd.",
- "current-session": "Текущая сессия",
- "session-to-shutdown": "Сессия для завершения работы в",
- "confirm-shutdown": "Подтвердить завершение работы",
- "session-to-shutdown-helper": "Введите высоту сессии, при которой вы хотите отключить свой узел-страж."
- }
- }
- },
- "login": {
- "title": "С возвращением!",
- "subtitle": "Пожалуйста, введите ваш пароль.",
- "password": "Пароль",
- "submit": "Отправить"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint - это бета-версия программного обеспечения.",
- "disclaimer-text": "Пожалуйста, сообщайте о проблемах по адресу https://github.com/fedimint/fedimint/issues",
- "leader": {
- "label": "Настройка лидера",
- "description": "Введите настройки конфигурации, которые одобряют другие Стражи. Один Страж выступает в роли Руководителя настройки."
- },
- "follower": {
- "label": "Подписчик",
- "description": "Как только Лидер Настройки устанавливает конфигурации, другие Стражи выбирают эту опцию, чтобы одобрить настройки и создать Федерацию."
- },
- "solo": {
- "label": "Соло",
- "description": "Управляйте Fedimint как одиночный хранитель без консенсуса, отказоустойчивости, федеративных резервных копий или других преимуществ устойчивости Fedimint. Действуйте осторожно, не предназначено для производственного использования."
- },
- "warning-modal": {
- "title": "Все готовы?",
- "description": "Выход из церемонии настройки может привести к сбою настройки и потребовать перезапуска вашего устройства. Убедитесь, что все готовы пройти полную настройку перед продолжением!"
- }
- },
- "run-dkg": {
- "error-config": "Не удалось выполнить распределенную генерацию ключей. Настройку федерации необходимо перезапустить.",
- "error-default": "Не готов к DKG, ваш текущий статус -",
- "error-header": "Что-то пошло не так.",
- "waiting-header": "Ожидание пиров...",
- "generating-header": "Генерация кодов..."
- },
- "set-config": {
- "bft-explanation-title": "Византийская устойчивость к сбоям вашей федерации",
- "bft-explanation": "{{total}} Федерация Стражей создает {{честный}}/{{total}} Порог.",
- "bft-faulty": "Ваша Федерация сможет терпеть {{faulty}} неисправные, отключенные или злонамеренные Стражи, не влияя на операции Федерации.",
- "guardian-name": "Имя хранителя",
- "guardian-name-help": "Это случайное имя будет показано другим Стражам во время настройки.",
- "admin-password": "Пароль администратора",
- "admin-password-generate": "Сгенерировать",
- "admin-password-set": "Нажмите 'Сгенерировать', чтобы создать надежный пароль. Вы можете его изменить, но этот пароль должен быть надежным и сохраненным!",
- "admin-password-help": "Сохраните этот пароль и держите его в безопасности! Вы не сможете восстановить этот пароль!",
- "admin-password-backup": "Я использую надежный пароль и сделал его резервную копию. (Вы не можете восстановить этот пароль!)",
- "confirm-password": "Подтвердите пароль",
- "error-password-mismatch": "Пароли не совпадают",
- "join-federation": "Присоединиться к ссылке Федерации",
- "join-federation-help": "Попросите человека, который создал Федерацию, предоставить ссылку и вставьте её сюда.",
- "basic-settings": "Основы",
- "federation-settings": "Настройки федерации",
- "federation-name": "Название федерации",
- "guardian-number": "Количество опекунов",
- "guardian-number-help": "Федерации требуют минимум 4 хранителей. Это нельзя изменить позже.",
- "bitcoin-settings": "Настройки биткойна",
- "block-confirmations": "Дополнительные подтверждения блока",
- "block-confirmations-help": "Fedimint Guardians отслеживают вершину блокчейна с несколькими подтверждениями, чтобы избежать реорганизаций блоков.",
- "block-confirmations-warning": "Запуск Fedimint с менее чем 5 дополнительными подтверждениями блока крайне рискован! Fedimint НЕ может справляться с реорганизациями блокчейна.",
- "bitcoin-network": "Биткойн-сеть",
- "select-network": "Выберите сеть",
- "set-rpc-help": "Локально настроенный адрес Bitcoin RPC",
- "bitcoin-rpc": "Биткойн RPC",
- "error-valid-number": "Пожалуйста, введите действительное число.",
- "error-valid-min": "Пожалуйста, введите число не менее {{min}}.",
- "error-valid-max": "Пожалуйста, введите число не более {{max}}.",
- "error-valid-min-max": "Пожалуйста, введите число между {{min}} и {{max}}.",
- "meta-fields": "Метаполя",
- "meta-fields-description": "Смотрите документацию для получения дополнительной информации.",
- "meta-fields-key": "Метаключ",
- "meta-fields-value": "Значение",
- "meta-fields-effect": "Эффект",
- "meta-fields-add-another": "Добавить еще один",
- "meta-fields-title": "Ваше предложение Meta:",
- "password-warning": "Вы должны сделать резервную копию своего пароля и сохранить его в безопасном месте. Этот пароль необходим для доступа к панели управления Стражем. Вы не сможете восстановить его, если потеряете!",
- "password-warning-title": "Сделайте резервную копию своего пароля!",
- "acknowledge-backed-up": "Я, {{guardianName}} (ваше имя опекуна), обещаю, что я сохранил и защитил свой пароль:",
- "confirm-and-backup-password": "Подтвердите и создайте резервную копию пароля",
- "error-guardian-name-mismatch": "Имя опекуна не совпадает",
- "network": "Сеть"
- },
- "setup": {
- "common": {
- "restart-setup": "Перезапустить установку",
- "restart-setup-alert": "Лидер настройки перезапустил церемонию настройки. Пожалуйста, нажмите \"Перезапустить\" ниже, чтобы продолжить.",
- "confirm-restart-setup": "Вы уверены, что хотите перезапустить Церемонию Настройки?",
- "confirm-restart-setup-alert": "Нажатие \"Перезапустить\" перезапустит церемонию для всех Стражей."
- },
- "progress": {
- "tos": {
- "title": "Условия обслуживания"
- },
- "start": {
- "title": "Добро пожаловать, Страж!",
- "subtitle": "Давайте настроим вашу федерацию.",
- "step": "Детали федерации"
- },
- "set-config": {
- "title": "Нам нужно настроить некоторые параметры для вашей Федерации.",
- "title-solo": "Нам нужно настроить некоторые параметры для вашей Solo Federation.",
- "subtitle-leader": "Ваши последователи Федерации подтвердят эту информацию с их стороны.",
- "subtitle-solo": "Запуск Solo Federation теряет многие преимущества Fedimint. У вас не будет согласия с отказоустойчивостью, если один из хранителей будет офлайн, и вы не сможете выполнять федеративные резервные копии. Будьте осторожны, не рекомендуется для использования в производстве или с основной сетью Bitcoin.",
- "subtitle-follower": "Ваш лидер Федерации будет настраивать основные детали Федерации. Вы подтвердите их скоро.",
- "step": "Детали федерации"
- },
- "connect-guardians": {
- "title-leader": "Пригласите своих Стражей",
- "title-follower": "Подтвердите вашу информацию о Федерации",
- "subtitle-leader": "Поделитесь ссылкой с другими Стражами, чтобы все были в курсе. Как только все Стражи присоединятся, вы автоматически перейдете к следующему шагу.",
- "subtitle-follower": "Убедитесь, что информация здесь выглядит правильно и что Хранители Федерации указаны верно. Нажмите кнопку \"Одобрить\", когда будете уверены, что все выглядит хорошо.",
- "step-leader": "Пригласить Стражей",
- "step-follower": "Подтвердите информацию"
- },
- "run-dkg": {
- "title": "Успех!",
- "subtitle": "Все Стражи подтвердили детали настройки федерации. Запускаю расчеты..."
- },
- "verify-guardians": {
- "title": "Проверьте своих Стражей",
- "subtitle": "Попросите каждого Стража их код подтверждения и вставьте их ниже, чтобы проверить действительность. Мы почти закончили!",
- "step": "Проверьте опекунов",
- "leader-confirm-done": "Подтвердите, что все подписчики-Стражи нажали \"Далее\" и просмотрите их панели управления Стражами перед продолжением.",
- "leader-confirm-done-emphasis": "Нажатие \"Продолжить\" завершит церемонию настройки."
- },
- "setup-complete": {
- "step": "Готово!"
- },
- "error": {
- "title": "Неизвестный шаг",
- "subtitle": "Как ты сюда попал?!"
- }
- },
- "warning": {
- "title": "Не выходите и не обновляйте страницу во время настройки!",
- "description": "Выход во время установки может привести к сбою установки, и вам придется выполнить новый перезапуск."
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "Поздравляю",
- "leader-message": "Все коды подтверждения Стражей были проверены.",
- "follower-message": "Вы все закончили! Дайте знать другим Стражам, что вы работаете!",
- "continue": "Продолжить"
- },
- "terms-of-service": {
- "agree-and-continue": "Согласен и продолжить"
- },
- "verify-guardians": {
- "verified": "Проверено",
- "verified-placeholder": "Вставьте код сюда",
- "error": "Что-то пошло не так.",
- "error-peer-id": "Не удалось определить, кто вы. Пожалуйста, обновите страницу и попробуйте снова.",
- "verification-code": "Ваш код подтверждения",
- "verification-code-help": "Поделитесь этим кодом с другими хранителями.",
- "table-title": "Коды проверки Guardian",
- "table-description": "Введите коды подтверждения каждого Стража ниже.",
- "table-column-name": "Имя",
- "table-column-status": "Статус",
- "table-column-hash-input": "Вставьте код подтверждения",
- "wait-all-guardians-verification": "Ожидание, пока все Стражи подтвердят свои коды",
- "all-guardians-verified": "Все Стражи подтвердили свои коды",
- "starting-consensus": "Начало консенсуса..."
- },
- "footer": {
- "docs-section-header": "Документы",
- "community-section-header": "Сообщество",
- "contribute-section-header": "Содействовать",
- "getting-started-link-text": "Начало работы",
- "faq-link-text": "Часто задаваемые вопросы",
- "blog-link-text": "Блог",
- "discord-link-text": "Дискорд",
- "twitter-link-text": "Твиттер",
- "github-link-text": "ГитХаб"
- }
-}
diff --git a/apps/guardian-ui/src/languages/zh.json b/apps/guardian-ui/src/languages/zh.json
deleted file mode 100644
index d5cc4e7e2..000000000
--- a/apps/guardian-ui/src/languages/zh.json
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "common": {
- "bitcoin": "比特币",
- "next": "下一个",
- "back": "返回",
- "error": "出了点问题。",
- "unknown": "未知",
- "remove": "移除",
- "copy": "复制",
- "copied": "复制成功!",
- "cancel": "取消",
- "review": "审查",
- "approvals": "批准",
- "approve": "批准",
- "threshold": "阈值",
- "confirm": "确认",
- "you": "你",
- "close": "关闭",
- "save": "保存",
- "continue": "继续",
- "submit": "提交"
- },
- "notConfigured": {
- "title": "未配置",
- "description": "请输入Fedimint配置服务器的URL以继续。"
- },
- "connect-guardians": {
- "invite-guardians": "邀请关注者",
- "invite-guardians-help": "将此链接分享给其他守护者",
- "approve": "批准",
- "approved": "批准",
- "pending": "待处理",
- "not-joined": "未加入",
- "waiting-for-guardian": "等待监护人",
- "table-title": "联邦守护者",
- "table-description": "守护者将在此处确认,一旦他们确认联邦设置。",
- "meta-field-key": "元字段 - {{key}}"
- },
- "federation-dashboard": {
- "invite-members": "邀请成员或验证为监护人",
- "invite-members-prompt": "分享此内容以邀请成员加入联邦",
- "fed-info": {
- "label": "联邦信息",
- "your-status-label": "状态",
- "block-count-label": "共识区块高度",
- "api-version-label": "API版本",
- "consensus-version-label": "共识版本",
- "peer-id-label": "对等体ID",
- "session-info": {
- "session-height": "会话高度",
- "latest-session": "最新会议"
- }
- },
- "balance": {
- "label": "资产负债表"
- },
- "bitcoin-node": {
- "label": "比特币节点",
- "url-label": "网址",
- "network-label": "网络"
- },
- "guardians": {
- "label": "其他守护者",
- "id-name-label": "ID:名称",
- "status-label": "连接状态",
- "health-label": "健康",
- "health-issue": "问题",
- "health-good": "好",
- "last-contribution-label": "最后会话贡献",
- "api-url-label": "API网址",
- "fetching-announcement": "获取公告中..."
- },
- "gateways": {
- "label": "闪电网关",
- "node-id-label": "闪电节点 ID",
- "gateway-id-label": "网关ID",
- "fee-label": "网关费用",
- "view-on-site": "在{{site}}上查看",
- "no-gateways-info-title": "还没有连接的网关!",
- "no-gateways-info-description": "闪电节点运营商可以连接到您的联盟,以提供闪电网络的互操作性。一旦连接,他们将出现在这里。"
- },
- "api-announcements": {
- "label": "API公告",
- "guardian": "守护者",
- "api-url": "API网址",
- "revision": "修订"
- },
- "config": {
- "label": "联邦配置",
- "view-config": "查看配置",
- "missing-meta-module": "无法编辑元字段。此联合体不支持元模块。",
- "manage-meta": {
- "label": "管理元数据",
- "cancel-button": "取消",
- "confirm-modal": {
- "title": "确认批准",
- "description": "您的批准将达到采纳此元变更的门槛。您的新元将如下所示:"
- },
- "consensus-meta-label": "当前共识中的元数据",
- "revoke-button": "撤销",
- "no-consensus-meta-message": "共识中没有元数据。",
- "proposed-meta-label": "元提案",
- "propose-meta": "提议元宇宙",
- "propose-new-meta-button": "提出新元宇宙",
- "proposal-approved": "您已批准此提案",
- "no-submitted-meta-message": "没有需要审核的元编辑。",
- "edit-meta-label": "编辑元数据",
- "edit-consensus-meta-button": "编辑共识元数据",
- "submit-meta-proposal": "提交元提案",
- "peer-approvals": "同行批准",
- "actions": "行动",
- "revision": "修订",
- "setup-meta-title": "为您的联邦设置一个Meta",
- "setup-meta-description": "Fedimint 可以以元字段的形式向客户提供额外信息:键值对,包含您可能想与客户分享的任意信息。虽然这些元字段不会被 Fedimint 解释,但它们与共识相关,即它们不能在联盟成员之间有所不同。这样,客户可以依赖它们的正确性。",
- "propose-updates": "作为一个fedimint守护者,您可以提出对元数据的更新,其他守护者将接受这些更新。一旦更新获得一定数量守护者的接受,它将被采纳为联邦的新共识元数据。",
- "core-meta-fields": "以下元字段已被定义为核心Fedimint协议的一部分,并且对于您的联盟元数据来说是有用的:",
- "meta-field-expiry": "一个联合体将在此时间戳之后关闭。",
- "meta-field-name": "联邦的人类可读名称",
- "meta-field-icon": "联邦徽标图标的URL",
- "meta-field-welcome": "欢迎新用户加入联邦的消息",
- "meta-field-gateways": "经过联盟审核的网关标识符列表",
- "your-own-fields": "您还可以向提案添加您自己的任意元字段。这些字段将被添加到连接到您的联盟的所有客户端的元数据中,可以用于您喜欢的任何目的。",
- "meta-effect-add": "添加",
- "meta-effect-modify": "修改",
- "meta-effect-unchanged": "不变",
- "proposals": "提案"
- }
- },
- "modal": {
- "client-connect": "连接客户端"
- },
- "danger-zone": {
- "danger-zone-label": "危险区域",
- "cancel": "取消",
- "danger-zone-description": "请谨慎使用!",
- "guardian-warning-message": "警告:请勿与任何人分享此代码。任何拥有此代码的人都可以作为守护者进行身份验证。确保您处于私密地点,且没有人监视您的屏幕。",
- "guardian-acknowledge": "确认并揭示代码",
- "acknowledge-and-download": "确认并继续",
- "guardian-authenticate": "以守护者身份进行身份验证",
- "guardian-connect-warning": "请勿分享此内容",
- "backup": {
- "label": "备份",
- "title": "下载备份",
- "warning-title": "警告",
- "warning-text": "备份包含联邦守护者的私钥和秘密材料,必须妥善保管。使用此备份进行恢复需要您的管理员密码!",
- "cancelButton": "取消",
- "acknowledgeButton": "确认并下载"
- },
- "sign-api-announcement": {
- "label": "签名API公告",
- "title": "签名 API 公告",
- "description": "签署新的API公告。",
- "current-api-url": "您从本地配置获取的 API URL",
- "announced-api-url": "来自联邦公告的您的API网址",
- "urls-match": "您当前的 API URL 与您公布的 API URL 匹配。",
- "urls-mismatch": "您已在本地配置中更改了 API URL,需要广播新的 API 通告。",
- "sign-button": "签署新的API公告",
- "signing-in-progress": "正在登录...",
- "sign-tooltip": "签署API公告以向联盟宣布您的API网址。"
- },
- "schedule-shutdown": {
- "label": "计划关机",
- "title": "计划关机",
- "description": "安排您的守护节点在特定会话高度后关闭,以便协调升级您的 fedimintd 二进制文件。",
- "current-session": "当前会话",
- "session-to-shutdown": "会话将在此时关闭",
- "confirm-shutdown": "确认关机",
- "session-to-shutdown-helper": "输入您希望关闭守护节点的会话高度。"
- }
- }
- },
- "login": {
- "title": "欢迎回来!",
- "subtitle": "请输入您的密码。",
- "password": "密码",
- "submit": "提交"
- },
- "role-selector": {
- "disclaimer-title": "Fedimint是测试版软件",
- "disclaimer-text": "请在https://github.com/fedimint/fedimint/issues报告问题",
- "leader": {
- "label": "设置领导者",
- "description": "输入其他守护者批准的配置设置。一个守护者担任设置领导。"
- },
- "follower": {
- "label": "追随者",
- "description": "一旦设置领导者配置了设置,其他守护者选择此选项以批准设置并创建联邦。"
- },
- "solo": {
- "label": "独奏",
- "description": "以单独守护者身份操作 Fedimint,不使用共识、容错、联邦备份或其他 Fedimint 的弹性优势。请谨慎进行,不适合生产环境使用。"
- },
- "warning-modal": {
- "title": "大家准备好了吗?",
- "description": "退出设置仪式可能会导致设置失败,并需要您重新启动守护者。在继续之前,请确保每个人都准备好进行完整的设置!"
- }
- },
- "run-dkg": {
- "error-config": "无法运行分布式密钥生成。必须重新启动联邦设置。",
- "error-default": "尚未准备好进行DKG,您当前的状态是",
- "error-header": "出了点问题。",
- "waiting-header": "等待对等体...",
- "generating-header": "生成代码中..."
- },
- "set-config": {
- "bft-explanation-title": "您的联邦的拜占庭容错性",
- "bft-explanation": "一个{{total}}守护者联邦创建了一个{{honest}}/{{total}}阈值。",
- "bft-faulty": "您的联邦将能够容忍{{faulty}}故障、离线或恶意的守护者,而不会影响联邦的运作。",
- "guardian-name": "守护者名称",
- "guardian-name-help": "此随机名称将在设置过程中显示给其他守护者。",
- "admin-password": "管理员密码",
- "admin-password-generate": "生成",
- "admin-password-set": "点击“生成”以创建一个安全的密码。您可以对其进行修改,但此密码必须安全并备份!",
- "admin-password-help": "备份此密码并妥善保管!您无法恢复此密码!",
- "admin-password-backup": "我正在使用一个强密码并已备份。(您无法恢复此密码!)",
- "confirm-password": "确认密码",
- "error-password-mismatch": "密码不匹配",
- "join-federation": "加入联邦链接",
- "join-federation-help": "请向创建联邦的人索要一个链接,并将其粘贴在这里。",
- "basic-settings": "基础知识",
- "federation-settings": "联邦设置",
- "federation-name": "联邦名称",
- "guardian-number": "监护人数量",
- "guardian-number-help": "联邦需要至少4名守护者。这一点无法更改。",
- "bitcoin-settings": "比特币设置",
- "block-confirmations": "额外区块确认",
- "block-confirmations-help": "Fedimint Guardians 在区块链的顶端滞后几个确认,以避免区块重组。",
- "block-confirmations-warning": "在少于5个额外区块确认的情况下运行Fedimint是极其危险的!Fedimint无法处理区块链重组。",
- "bitcoin-network": "比特币网络",
- "select-network": "选择一个网络",
- "set-rpc-help": "本地配置的比特币RPC地址",
- "bitcoin-rpc": "比特币 RPC",
- "error-valid-number": "请输入一个有效的数字。",
- "error-valid-min": "请输入至少{{min}}的数字。",
- "error-valid-max": "请输入一个最多为{{max}}的数字。",
- "error-valid-min-max": "请输入一个介于{{min}}和{{max}}之间的数字。",
- "meta-fields": "元字段",
- "meta-fields-description": "请参阅文档以获取更多信息。",
- "meta-fields-key": "元键",
- "meta-fields-value": "价值",
- "meta-fields-effect": "效果",
- "meta-fields-add-another": "再添加一个",
- "meta-fields-title": "您的元提案:",
- "password-warning": "您必须备份您的密码并将其安全保存。此密码是访问您的守护者仪表板的必要条件。如果您丢失了它,您将无法恢复它!",
- "password-warning-title": "备份您的密码!",
- "acknowledge-backed-up": "我,{{guardianName}}(你的监护人姓名),承诺我已经备份并保护了我的密码:",
- "confirm-and-backup-password": "确认并备份密码",
- "error-guardian-name-mismatch": "监护人姓名不匹配",
- "network": "网络"
- },
- "setup": {
- "common": {
- "restart-setup": "重新启动设置",
- "restart-setup-alert": "设置领导已重新启动设置仪式。请点击下面的“重新启动”以继续。",
- "confirm-restart-setup": "您确定要重新启动设置仪式吗?",
- "confirm-restart-setup-alert": "点击“重启”将为所有守护者重新开始仪式。"
- },
- "progress": {
- "tos": {
- "title": "服务条款"
- },
- "start": {
- "title": "欢迎,守护者!",
- "subtitle": "让我们设置您的联邦。",
- "step": "联邦详情"
- },
- "set-config": {
- "title": "我们需要为您的联邦设置一些配置。",
- "title-solo": "我们需要为您的单人联邦设置一些配置。",
- "subtitle-leader": "您的联邦追随者将在他们那边确认此信息。",
- "subtitle-solo": "运行单独的联邦会失去许多 Fedimint 的好处。您将无法对守护者离线进行容错共识,也无法进行联合备份。请谨慎行事,不建议用于生产环境或与主网比特币一起使用。",
- "subtitle-follower": "您的联邦领袖将设置主要的联邦细节。您很快会确认它们。",
- "step": "联邦详情"
- },
- "connect-guardians": {
- "title-leader": "邀请你的守护者",
- "title-follower": "确认您的联邦信息",
- "subtitle-leader": "与其他守护者分享链接,以便大家达成共识。一旦所有守护者加入,您将自动进入下一步。",
- "subtitle-follower": "确保这里的信息正确无误,并且联邦守护者信息无误。当你确认一切看起来都不错时,请点击批准按钮。",
- "step-leader": "邀请守护者",
- "step-follower": "确认信息"
- },
- "run-dkg": {
- "title": "成功!",
- "subtitle": "所有守护者都已验证联邦设置详情。正在计算一些数据……"
- },
- "verify-guardians": {
- "title": "验证您的守护者",
- "subtitle": "请向每位守护者索取他们的验证代码,并将其粘贴在下面以检查有效性。我们快完成了!",
- "step": "验证监护人",
- "leader-confirm-done": "确认所有跟随的守护者已点击“下一步”,并查看他们的守护者仪表板,然后再继续。",
- "leader-confirm-done-emphasis": "点击“继续”将完成设置仪式。"
- },
- "setup-complete": {
- "step": "完成!"
- },
- "error": {
- "title": "未知步骤",
- "subtitle": "你是怎么到这里的?!"
- }
- },
- "warning": {
- "title": "设置过程中请勿退出或刷新!",
- "description": "在设置过程中退出可能会导致设置失败,您将不得不重新启动。"
- }
- },
- "setup-complete": {
- "header": "🎉 🎉 🎉",
- "congratulations": "恭喜",
- "leader-message": "所有守护者的验证代码已被验证。",
- "follower-message": "你已全部完成!让其他守护者知道你正在运行!",
- "continue": "继续"
- },
- "terms-of-service": {
- "agree-and-continue": "同意并继续"
- },
- "verify-guardians": {
- "verified": "已验证",
- "verified-placeholder": "粘贴代码在这里",
- "error": "出了点问题。",
- "error-peer-id": "无法确定您是哪个对等方。请刷新并重试。",
- "verification-code": "您的验证码",
- "verification-code-help": "与其他守护者分享此代码",
- "table-title": "守护者验证代码",
- "table-description": "在下面输入每个守护者的验证代码。",
- "table-column-name": "名字",
- "table-column-status": "状态",
- "table-column-hash-input": "粘贴验证码",
- "wait-all-guardians-verification": "等待所有守护者验证他们的代码",
- "all-guardians-verified": "所有守护者都已验证他们的代码",
- "starting-consensus": "开始共识..."
- },
- "footer": {
- "docs-section-header": "文档",
- "community-section-header": "社区",
- "contribute-section-header": "贡献",
- "getting-started-link-text": "开始使用",
- "faq-link-text": "常见问题",
- "blog-link-text": "博客",
- "discord-link-text": "Discord",
- "twitter-link-text": "推特",
- "github-link-text": "GitHub"
- }
-}
diff --git a/apps/guardian-ui/src/setup/SetupContext.tsx b/apps/guardian-ui/src/setup/SetupContext.tsx
deleted file mode 100644
index 035d602fc..000000000
--- a/apps/guardian-ui/src/setup/SetupContext.tsx
+++ /dev/null
@@ -1,334 +0,0 @@
-import React, {
- createContext,
- Dispatch,
- ReactNode,
- useCallback,
- useEffect,
- useReducer,
- useState,
-} from 'react';
-import { ConfigGenParams, ServerStatus } from '@fedimint/types';
-import {
- SetupState,
- SetupAction,
- SETUP_ACTION_TYPE,
- SetupProgress,
-} from '../types';
-import { GuardianApi } from '../GuardianApi';
-import { isConsensusparams } from '../utils/validators';
-import { randomNames } from './randomNames';
-
-const LOCAL_STORAGE_SETUP_KEY = 'setup-guardian-ui-state';
-
-/**
- * Creates the initial state using loaded state from local storage.
- */
-function makeInitialState(loadFromStorage = true): SetupState {
- const randomName =
- randomNames[Math.floor(Math.random() * randomNames.length)] +
- Math.floor(Math.random() * 10000)
- .toString()
- .padStart(4, '0');
- let state: SetupState = {
- role: null,
- progress: SetupProgress.Start,
- myName: randomName,
- configGenParams: null,
- password: null,
- numPeers: 0,
- peers: [],
- tosConfig: { showTos: false, tos: undefined },
- ourCurrentId: null,
- };
- if (loadFromStorage) {
- try {
- const storageJson = localStorage.getItem(LOCAL_STORAGE_SETUP_KEY);
- if (storageJson) {
- state = JSON.parse(storageJson) as SetupState;
- }
- } catch (err) {
- console.warn('Encountered error while fetching storage state', err);
- }
- }
-
- if (
- state.progress !== SetupProgress.Start &&
- state.configGenParams !== null &&
- isConsensusparams(state.configGenParams)
- ) {
- const peers = Object.values(state.configGenParams.peers);
- state.peers = peers;
- state.numPeers = state.numPeers ? state.numPeers : peers.length;
- }
-
- return state;
-}
-
-const initialState = makeInitialState();
-
-const reducer = (state: SetupState, action: SetupAction): SetupState => {
- switch (action.type) {
- case SETUP_ACTION_TYPE.SET_INITIAL_STATE:
- return makeInitialState(false);
- case SETUP_ACTION_TYPE.SET_ROLE:
- return { ...state, role: action.payload };
- case SETUP_ACTION_TYPE.SET_PROGRESS:
- return { ...state, progress: action.payload };
- case SETUP_ACTION_TYPE.SET_MY_NAME:
- return { ...state, myName: action.payload };
- case SETUP_ACTION_TYPE.SET_CONFIG_GEN_PARAMS:
- return { ...state, configGenParams: action.payload };
- case SETUP_ACTION_TYPE.SET_PASSWORD:
- return { ...state, password: action.payload };
- case SETUP_ACTION_TYPE.SET_NUM_PEERS:
- return { ...state, numPeers: action.payload };
- case SETUP_ACTION_TYPE.SET_PEERS:
- return { ...state, peers: action.payload };
- case SETUP_ACTION_TYPE.SET_OUR_CURRENT_ID:
- return { ...state, ourCurrentId: action.payload };
- case SETUP_ACTION_TYPE.SET_TOS_CONFIG:
- return { ...state, tosConfig: action.payload };
- default:
- return state;
- }
-};
-
-export interface SetupContextValue {
- api: GuardianApi;
- state: SetupState;
- dispatch: Dispatch;
- submitConfiguration(config: {
- myName: string;
- password: string;
- configs: T;
- }): Promise;
- connectToHost(url: string): Promise;
- fetchConsensusState(): Promise;
- toggleConsensusPolling(toggle: boolean): void;
-}
-
-type HostConfigs = ConfigGenParams & {
- numPeers: number;
-};
-
-type FollowerConfigs = ConfigGenParams & {
- hostServerUrl: string;
-};
-
-const isHostConfigs = (
- configs: HostConfigs | FollowerConfigs
-): configs is HostConfigs => {
- return (configs as HostConfigs).numPeers !== undefined;
-};
-
-const isFollowerConfigs = (
- configs: HostConfigs | FollowerConfigs
-): configs is FollowerConfigs => {
- return (configs as FollowerConfigs).hostServerUrl !== undefined;
-};
-
-export const SetupContext = createContext({
- api: new GuardianApi(),
- state: initialState,
- dispatch: () => null,
- submitConfiguration: () => Promise.reject(),
- connectToHost: () => Promise.reject(),
- fetchConsensusState: () => Promise.reject(),
- toggleConsensusPolling: () => null,
-});
-
-export interface SetupContextProviderProps {
- api: GuardianApi;
- initServerStatus: ServerStatus;
- children: ReactNode;
-}
-
-export const SetupContextProvider: React.FC = ({
- api,
- initServerStatus,
- children,
-}: SetupContextProviderProps) => {
- const [state, dispatch] = useReducer(reducer, {
- ...initialState,
- password: api.getPassword() || initialState.password,
- });
- const { password, myName } = state;
- const [isPollingConsensus, setIsPollingConsensus] = useState(false);
-
- useEffect(() => {
- switch (initServerStatus) {
- case ServerStatus.AwaitingPassword:
- // If we're still waiting for a password, restart the whole thing.
- dispatch({
- type: SETUP_ACTION_TYPE.SET_INITIAL_STATE,
- payload: null,
- });
- break;
- case ServerStatus.ReadyForConfigGen:
- // If we're ready for DKG, move them to approve the config to start.
- dispatch({
- type: SETUP_ACTION_TYPE.SET_PROGRESS,
- payload: SetupProgress.ConnectGuardians,
- });
- break;
- case ServerStatus.VerifyingConfigs:
- case ServerStatus.VerifiedConfigs:
- // If we're supposed to be verifying, or have verified, jump to peer validation screen
- dispatch({
- type: SETUP_ACTION_TYPE.SET_PROGRESS,
- payload: SetupProgress.VerifyGuardians,
- });
- break;
- case ServerStatus.ConsensusRunning:
- default:
- // We should never boot into these states with the setup UI. We probably should show error
- // For now, skip past all setup, and transition to admin.
- dispatch({
- type: SETUP_ACTION_TYPE.SET_IS_SETUP_COMPLETE,
- payload: true,
- });
- break;
- }
- }, [initServerStatus]);
-
- // Update local storage on state changes.
- useEffect(() => {
- localStorage.setItem(
- LOCAL_STORAGE_SETUP_KEY,
- JSON.stringify({
- role: state.role,
- progress: state.progress,
- myName: state.myName,
- numPeers: state.numPeers,
- configGenParams: state.configGenParams,
- ourCurrentId: state.ourCurrentId,
- })
- );
-
- return () => {
- // Clear local storage on setup complete.
- // This happens when we transition to admin experience.
- if (state.progress === SetupProgress.SetupComplete) {
- localStorage.removeItem(LOCAL_STORAGE_SETUP_KEY);
- }
- };
- }, [
- state.role,
- state.progress,
- state.myName,
- state.numPeers,
- state.configGenParams,
- state.ourCurrentId,
- ]);
-
- // Fetch consensus state, dispatch updates with it.
- const fetchConsensusState = useCallback(async () => {
- const consensusState = await api.getConsensusConfigGenParams();
- dispatch({
- type: SETUP_ACTION_TYPE.SET_OUR_CURRENT_ID,
- payload: consensusState.our_current_id,
- });
- dispatch({
- type: SETUP_ACTION_TYPE.SET_PEERS,
- payload: Object.values(consensusState.consensus.peers),
- });
- dispatch({
- type: SETUP_ACTION_TYPE.SET_CONFIG_GEN_PARAMS,
- payload: consensusState.consensus,
- });
- }, [api]);
-
- // Poll for peer state every 2 seconds when isPollingPeers.
- useEffect(() => {
- if (!isPollingConsensus) return;
- let timeout: ReturnType;
- const pollPeers = () => {
- fetchConsensusState()
- .catch((err) => {
- console.warn('Failed to poll for peers', err);
- })
- .finally(() => {
- timeout = setTimeout(pollPeers, 2000);
- });
- };
- pollPeers();
- return () => clearTimeout(timeout);
- }, [isPollingConsensus, fetchConsensusState]);
-
- // Single call to save all of the host / follower configurations
- const submitConfiguration: SetupContextValue['submitConfiguration'] =
- useCallback(
- async ({ password: newPassword, myName, configs }) => {
- if (!password) {
- await api.setPassword(newPassword);
-
- dispatch({
- type: SETUP_ACTION_TYPE.SET_PASSWORD,
- payload: newPassword,
- });
- }
-
- dispatch({
- type: SETUP_ACTION_TYPE.SET_MY_NAME,
- payload: myName,
- });
-
- if (isHostConfigs(configs)) {
- dispatch({
- type: SETUP_ACTION_TYPE.SET_NUM_PEERS,
- payload: configs.numPeers,
- });
-
- // Hosts set their own connection name only.
- await api.setConfigGenConnections(myName);
-
- // Hosts submit both their local and the consensus config gen params.
- await api.setConfigGenParams(configs);
- dispatch({
- type: SETUP_ACTION_TYPE.SET_CONFIG_GEN_PARAMS,
- payload: configs,
- });
- }
-
- if (isFollowerConfigs(configs)) {
- // Followers set their own connection name, and hosts server URL to connect to.
- await api.setConfigGenConnections(myName, configs.hostServerUrl);
-
- // Followers submit ONLY their local config gen params.
- await api.setConfigGenParams(configs);
-
- // Followers fetch consensus config gen params from the host.
- await fetchConsensusState();
- }
- },
- [password, api, dispatch, fetchConsensusState]
- );
-
- const connectToHost = useCallback(
- async (url: string) => {
- await api.setConfigGenConnections(myName, url);
- return await fetchConsensusState();
- },
- [myName, api, fetchConsensusState]
- );
-
- const toggleConsensusPolling = useCallback((poll: boolean) => {
- setIsPollingConsensus(poll);
- }, []);
-
- return (
-
- {children}
-
- );
-};
diff --git a/apps/guardian-ui/tsconfig.json b/apps/guardian-ui/tsconfig.json
deleted file mode 100644
index 4bf6bc5df..000000000
--- a/apps/guardian-ui/tsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "extends": "@fedimint/tsconfig/react-app.json",
- "compilerOptions": {
- "typeRoots": [
- "src/typings/",
- "node_modules/@types/",
- "../node_modules/@types/"
- ]
- },
- "exclude": ["dist", "node_modules"],
- "include": ["src"]
-}
diff --git a/apps/gateway-ui/.eslintrc.js b/apps/router/.eslintrc.js
similarity index 100%
rename from apps/gateway-ui/.eslintrc.js
rename to apps/router/.eslintrc.js
diff --git a/apps/gateway-ui/package.json b/apps/router/package.json
similarity index 73%
rename from apps/gateway-ui/package.json
rename to apps/router/package.json
index a09206f52..58ded72f0 100644
--- a/apps/gateway-ui/package.json
+++ b/apps/router/package.json
@@ -1,5 +1,5 @@
{
- "name": "@fedimint/gateway-ui",
+ "name": "@fedimint/router",
"version": "0.1.0",
"private": true,
"scripts": {
@@ -8,26 +8,25 @@
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
- "lint": "eslint \"src/**/*.ts*\"",
+ "lint": "eslint \"src/**/*.ts*\" --max-warnings 0",
"clean": "rm -rf build"
},
"dependencies": {
- "@chakra-ui/react": "^2.4.5",
- "@emotion/react": "^11",
- "@emotion/styled": "^11",
+ "@codemirror/lang-json": "^6.0.1",
"@fedimint/types": "*",
"@fedimint/ui": "*",
"@fedimint/utils": "*",
- "framer-motion": "^6",
- "jsonrpc-client-websocket": "^1.5.2",
- "node": "^20.1.0",
- "qrcode.react": "^3.1.0",
+ "@uiw/codemirror-theme-github": "^4.23.2",
+ "@uiw/react-codemirror": "^4.23.2",
+ "framer-motion": "^11.5.4",
+ "jsonrpc-client-websocket": "^1.5.5",
+ "qrcode.react": "^4.0.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "react-icons": "^4.7.1",
+ "react-icons": "^5.3.0",
"react-minimal-pie-chart": "^8.4.0",
- "react-scripts": "5.0.1",
- "react-use-websocket": "3.0.0"
+ "react-router-dom": "^6.26.2",
+ "react-scripts": "5.0.1"
},
"devDependencies": {
"@fedimint/eslint-config": "*",
@@ -35,9 +34,9 @@
"@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.5.0",
+ "@types/diff": "^5.0.9",
"@types/jest": "^27.0.3",
"@types/node": "^16.11.14",
- "@types/qrcode.react": "^1.0.2",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"@typescript-eslint/eslint-plugin": "^5.48.1",
diff --git a/apps/router/public/config.json b/apps/router/public/config.json
new file mode 100644
index 000000000..e69de29bb
diff --git a/apps/gateway-ui/public/favicon.ico b/apps/router/public/favicon.ico
similarity index 100%
rename from apps/gateway-ui/public/favicon.ico
rename to apps/router/public/favicon.ico
diff --git a/apps/guardian-ui/public/index.html b/apps/router/public/index.html
similarity index 98%
rename from apps/guardian-ui/public/index.html
rename to apps/router/public/index.html
index 97be97717..01e5134ff 100644
--- a/apps/guardian-ui/public/index.html
+++ b/apps/router/public/index.html
@@ -21,7 +21,7 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
- Guardian UI
+ Fedimint UI
diff --git a/apps/guardian-ui/public/manifest.json b/apps/router/public/manifest.json
similarity index 100%
rename from apps/guardian-ui/public/manifest.json
rename to apps/router/public/manifest.json
diff --git a/apps/gateway-ui/public/robots.txt b/apps/router/public/robots.txt
similarity index 100%
rename from apps/gateway-ui/public/robots.txt
rename to apps/router/public/robots.txt
diff --git a/apps/router/src/context/AppContext.tsx b/apps/router/src/context/AppContext.tsx
new file mode 100644
index 000000000..367e2a368
--- /dev/null
+++ b/apps/router/src/context/AppContext.tsx
@@ -0,0 +1,210 @@
+import React, {
+ createContext,
+ Dispatch,
+ ReactNode,
+ useEffect,
+ useReducer,
+} from 'react';
+import { GuardianConfig } from '../guardian-ui/GuardianApi';
+
+import { GatewayConfig } from '../gateway-ui/types';
+import { sha256Hash } from '@fedimint/utils';
+
+type Service = GuardianConfig | GatewayConfig;
+
+export interface Guardian {
+ config: GuardianConfig;
+}
+
+export interface Gateway {
+ config: GatewayConfig;
+}
+
+export interface AppContextValue {
+ guardians: Record;
+ gateways: Record;
+ dispatch: Dispatch;
+}
+
+const makeInitialState = (): AppContextValue => {
+ const storedState = localStorage.getItem('fedimint_ui_state');
+ if (storedState) {
+ try {
+ const parsedState = JSON.parse(storedState);
+ return {
+ ...parsedState,
+ dispatch: () => null,
+ };
+ } catch (error) {
+ console.error('Failed to parse stored state:', error);
+ }
+ }
+ return {
+ guardians: {},
+ gateways: {},
+ dispatch: () => null,
+ };
+};
+
+export enum APP_ACTION_TYPE {
+ SET_SELECTED_SERVICE = 'SET_SELECTED_SERVICE',
+ ADD_GUARDIAN = 'ADD_GUARDIAN',
+ ADD_GATEWAY = 'ADD_GATEWAY',
+ REMOVE_GUARDIAN = 'REMOVE_GUARDIAN',
+ REMOVE_GATEWAY = 'REMOVE_GATEWAY',
+}
+
+export type AppAction =
+ | {
+ type: APP_ACTION_TYPE.ADD_GUARDIAN;
+ payload: {
+ id: string;
+ guardian: Guardian;
+ };
+ }
+ | {
+ type: APP_ACTION_TYPE.ADD_GATEWAY;
+ payload: {
+ id: string;
+ gateway: Gateway;
+ };
+ }
+ | {
+ type: APP_ACTION_TYPE.REMOVE_GUARDIAN;
+ payload: string;
+ }
+ | {
+ type: APP_ACTION_TYPE.REMOVE_GATEWAY;
+ payload: string;
+ };
+
+const saveToLocalStorage = (state: AppContextValue) => {
+ localStorage.setItem('fedimint_ui_state', JSON.stringify(state));
+};
+
+const reducer = (
+ state: AppContextValue,
+ action: AppAction
+): AppContextValue => {
+ switch (action.type) {
+ case APP_ACTION_TYPE.ADD_GUARDIAN:
+ return {
+ ...state,
+ guardians: {
+ ...state.guardians,
+ [action.payload.id]: action.payload.guardian,
+ },
+ };
+ case APP_ACTION_TYPE.ADD_GATEWAY:
+ return {
+ ...state,
+ gateways: {
+ ...state.gateways,
+ [action.payload.id]: action.payload.gateway,
+ },
+ };
+ case APP_ACTION_TYPE.REMOVE_GUARDIAN:
+ return {
+ ...state,
+ guardians: Object.fromEntries(
+ Object.entries(state.guardians).filter(
+ ([key]) => key !== action.payload
+ )
+ ),
+ };
+ case APP_ACTION_TYPE.REMOVE_GATEWAY:
+ return {
+ ...state,
+ gateways: Object.fromEntries(
+ Object.entries(state.gateways).filter(
+ ([key]) => key !== action.payload
+ )
+ ),
+ };
+ }
+};
+
+const reducerWithMiddleware = (
+ state: AppContextValue,
+ action: AppAction
+): AppContextValue => {
+ const newState = reducer(state, action);
+ saveToLocalStorage(newState);
+ return newState;
+};
+
+export const AppContext = createContext(makeInitialState());
+
+export interface AppContextProviderProps {
+ children: ReactNode;
+}
+
+export const AppContextProvider: React.FC = ({
+ children,
+}: AppContextProviderProps) => {
+ const [state, dispatch] = useReducer(
+ reducerWithMiddleware,
+ makeInitialState()
+ );
+
+ useEffect(() => {
+ const isGuardian = (service: Service): service is GuardianConfig =>
+ service.baseUrl.startsWith('ws');
+ const isGateway = (service: Service): service is GatewayConfig =>
+ service.baseUrl.startsWith('http');
+ const addService = async (service: Service) => {
+ const id = await sha256Hash(service.baseUrl);
+
+ if (isGuardian(service)) {
+ dispatch({
+ type: APP_ACTION_TYPE.ADD_GUARDIAN,
+ payload: { id, guardian: { config: service as GuardianConfig } },
+ });
+ } else if (isGateway(service)) {
+ dispatch({
+ type: APP_ACTION_TYPE.ADD_GATEWAY,
+ payload: { id, gateway: { config: service as GatewayConfig } },
+ });
+ } else {
+ throw new Error(`Invalid service baseUrl in config.json: ${service}`);
+ }
+ };
+
+ const handleConfig = (data: Service | Service[]) => {
+ const services = Array.isArray(data) ? data : [data];
+ services.forEach((service) => {
+ addService(service);
+ });
+ };
+
+ fetch('/config.json')
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ return response.text();
+ })
+ .then((text) => {
+ if (!text.trim()) {
+ console.warn('Config file is empty');
+ return;
+ }
+ try {
+ const data = JSON.parse(text);
+ handleConfig(data);
+ } catch (error) {
+ console.error('Error parsing config JSON:', error);
+ console.log('Raw config content:', text);
+ }
+ })
+ .catch((error) => {
+ console.error('Error fetching or processing config:', error);
+ });
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/apps/router/src/context/gateway/GatewayContext.tsx b/apps/router/src/context/gateway/GatewayContext.tsx
new file mode 100644
index 000000000..11d00e08a
--- /dev/null
+++ b/apps/router/src/context/gateway/GatewayContext.tsx
@@ -0,0 +1,83 @@
+import React, {
+ createContext,
+ Dispatch,
+ ReactNode,
+ useMemo,
+ useReducer,
+} from 'react';
+import { useGatewayConfig } from '../hooks';
+import { GatewayApi } from '../../gateway-ui/GatewayApi';
+import {
+ GATEWAY_APP_ACTION_TYPE,
+ GatewayAppAction,
+ GatewayAppState,
+ GatewayStatus,
+} from '../../gateway-ui/types';
+import { useLocation } from 'react-router-dom';
+
+export interface GatewayContextValue {
+ id: string;
+ api: GatewayApi;
+ state: GatewayAppState;
+ dispatch: Dispatch;
+}
+
+const initialState: GatewayAppState = {
+ status: GatewayStatus.Loading,
+ needsAuth: true,
+ gatewayError: undefined,
+ balances: null,
+ gatewayInfo: null,
+ unit: 'msats',
+};
+
+const reducer = (
+ state: GatewayAppState,
+ action: GatewayAppAction
+): GatewayAppState => {
+ switch (action.type) {
+ case GATEWAY_APP_ACTION_TYPE.SET_STATUS:
+ return { ...state, status: action.payload };
+ case GATEWAY_APP_ACTION_TYPE.SET_NEEDS_AUTH:
+ return { ...state, needsAuth: action.payload };
+ case GATEWAY_APP_ACTION_TYPE.SET_ERROR:
+ return { ...state, gatewayError: action.payload };
+ case GATEWAY_APP_ACTION_TYPE.SET_BALANCES:
+ return { ...state, balances: action.payload };
+ case GATEWAY_APP_ACTION_TYPE.SET_GATEWAY_INFO:
+ return { ...state, gatewayInfo: action.payload };
+ case GATEWAY_APP_ACTION_TYPE.SET_UNIT:
+ return { ...state, unit: action.payload };
+ default:
+ return state;
+ }
+};
+
+export const GatewayContext = createContext(null);
+
+export interface GatewayContextProviderProps {
+ children: ReactNode;
+}
+
+export const GatewayContextProvider: React.FC = ({
+ children,
+}) => {
+ const [state, dispatch] = useReducer(reducer, initialState);
+ const location = useLocation();
+ const gatewayId = location.pathname.split('/')[2];
+ const config = useGatewayConfig(gatewayId);
+ const gatewayApi = useMemo(() => new GatewayApi(config), [config]);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/apps/router/src/context/guardian/AdminContext.tsx b/apps/router/src/context/guardian/AdminContext.tsx
new file mode 100644
index 000000000..50c49d5e1
--- /dev/null
+++ b/apps/router/src/context/guardian/AdminContext.tsx
@@ -0,0 +1,23 @@
+import React, { createContext, ReactNode } from 'react';
+// import { AdminApiInterface } from '../guardian-ui/GuardianApi';
+import { useGuardianStatus } from '../hooks';
+import { GuardianStatus } from '../../guardian-ui/types';
+
+// export interface AdminContextValue {}
+
+export const AdminContext = createContext(null);
+
+export interface AdminContextProviderProps {
+ children: ReactNode;
+}
+
+export const AdminContextProvider: React.FC = ({
+ children,
+}: AdminContextProviderProps) => {
+ const status = useGuardianStatus();
+ if (status !== GuardianStatus.Admin) {
+ return null;
+ }
+
+ return {children};
+};
diff --git a/apps/router/src/context/guardian/GuardianContext.tsx b/apps/router/src/context/guardian/GuardianContext.tsx
new file mode 100644
index 000000000..d21ab73b5
--- /dev/null
+++ b/apps/router/src/context/guardian/GuardianContext.tsx
@@ -0,0 +1,78 @@
+import React, {
+ createContext,
+ Dispatch,
+ ReactNode,
+ useMemo,
+ useReducer,
+} from 'react';
+import { GuardianApi } from '../../guardian-ui/GuardianApi';
+import {
+ GUARDIAN_APP_ACTION_TYPE,
+ GuardianAppAction,
+ GuardianAppState,
+ GuardianStatus,
+} from '../../guardian-ui/types';
+import { useGuardianConfig } from '../hooks';
+import { useLocation } from 'react-router-dom';
+
+export interface GuardianContextValue {
+ id: string;
+ api: GuardianApi;
+ state: GuardianAppState;
+ dispatch: Dispatch;
+}
+
+const initialState = {
+ status: GuardianStatus.Loading,
+ needsAuth: false,
+ initServerStatus: undefined,
+ guardianError: undefined,
+};
+
+const reducer = (
+ state: GuardianAppState,
+ action: GuardianAppAction
+): GuardianAppState => {
+ switch (action.type) {
+ case GUARDIAN_APP_ACTION_TYPE.SET_STATUS:
+ return { ...state, status: action.payload };
+ case GUARDIAN_APP_ACTION_TYPE.SET_NEEDS_AUTH:
+ return { ...state, needsAuth: action.payload };
+ case GUARDIAN_APP_ACTION_TYPE.SET_INIT_SERVER_STATUS:
+ return { ...state, initServerStatus: action.payload };
+ case GUARDIAN_APP_ACTION_TYPE.SET_ERROR:
+ return { ...state, guardianError: action.payload };
+ default:
+ return state;
+ }
+};
+
+export const GuardianContext = createContext(null);
+
+export interface GuardianContextProviderProps {
+ children: ReactNode;
+}
+
+export const GuardianContextProvider: React.FC<
+ GuardianContextProviderProps
+> = ({ children }) => {
+ const [state, dispatch] = useReducer(reducer, initialState);
+ const location = useLocation();
+ console.log('location', location);
+ const guardianId = location.pathname.split('/')[2];
+ const config = useGuardianConfig(guardianId);
+ const guardianApi = useMemo(() => new GuardianApi(config), [config]);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/apps/router/src/context/guardian/SetupContext.tsx b/apps/router/src/context/guardian/SetupContext.tsx
new file mode 100644
index 000000000..f74f7408e
--- /dev/null
+++ b/apps/router/src/context/guardian/SetupContext.tsx
@@ -0,0 +1,158 @@
+import React, { createContext, Dispatch, ReactNode, useReducer } from 'react';
+import { GuardianServerStatus } from '@fedimint/types';
+import {
+ SetupState,
+ SetupAction,
+ SETUP_ACTION_TYPE,
+ SetupProgress,
+} from '../../guardian-ui/types';
+import { isConsensusparams } from '../../guardian-ui/utils/validators';
+import { randomNames } from '../../guardian-ui/setup/randomNames';
+import {
+ FollowerConfigs,
+ HostConfigs,
+ useGuardianApi,
+ useHandleBackgroundGuardianSetupActions,
+ useHandleSetupServerStatus,
+ useUpdateLocalStorageOnSetupStateChange,
+} from '../hooks';
+
+export const LOCAL_STORAGE_SETUP_KEY = 'setup-guardian-ui-state';
+
+/**
+ * Creates the initial state using loaded state from local storage.
+ */
+function makeInitialState(loadFromStorage = true): SetupState {
+ const randomName =
+ randomNames[Math.floor(Math.random() * randomNames.length)] +
+ Math.floor(Math.random() * 10000)
+ .toString()
+ .padStart(4, '0');
+ let state: SetupState = {
+ role: null,
+ progress: SetupProgress.Start,
+ myName: randomName,
+ configGenParams: null,
+ password: null,
+ numPeers: 0,
+ peers: [],
+ tosConfig: { showTos: false, tos: undefined },
+ ourCurrentId: null,
+ };
+ if (loadFromStorage) {
+ try {
+ const storageJson = localStorage.getItem(LOCAL_STORAGE_SETUP_KEY);
+ if (storageJson) {
+ state = JSON.parse(storageJson) as SetupState;
+ }
+ } catch (err) {
+ console.warn('Encountered error while fetching storage state', err);
+ }
+ }
+
+ if (
+ state.progress !== SetupProgress.Start &&
+ state.configGenParams !== null &&
+ isConsensusparams(state.configGenParams)
+ ) {
+ const peers = Object.values(state.configGenParams.peers);
+ state.peers = peers;
+ state.numPeers = state.numPeers ? state.numPeers : peers.length;
+ }
+
+ return state;
+}
+
+const initialState = makeInitialState();
+
+const reducer = (state: SetupState, action: SetupAction): SetupState => {
+ switch (action.type) {
+ case SETUP_ACTION_TYPE.SET_INITIAL_STATE:
+ return makeInitialState(false);
+ case SETUP_ACTION_TYPE.SET_ROLE:
+ return { ...state, role: action.payload };
+ case SETUP_ACTION_TYPE.SET_PROGRESS:
+ return { ...state, progress: action.payload };
+ case SETUP_ACTION_TYPE.SET_MY_NAME:
+ return { ...state, myName: action.payload };
+ case SETUP_ACTION_TYPE.SET_CONFIG_GEN_PARAMS:
+ return { ...state, configGenParams: action.payload };
+ case SETUP_ACTION_TYPE.SET_PASSWORD:
+ return { ...state, password: action.payload };
+ case SETUP_ACTION_TYPE.SET_NUM_PEERS:
+ return { ...state, numPeers: action.payload };
+ case SETUP_ACTION_TYPE.SET_PEERS:
+ return { ...state, peers: action.payload };
+ case SETUP_ACTION_TYPE.SET_OUR_CURRENT_ID:
+ return { ...state, ourCurrentId: action.payload };
+ case SETUP_ACTION_TYPE.SET_TOS_CONFIG:
+ return { ...state, tosConfig: action.payload };
+ default:
+ return state;
+ }
+};
+
+export interface SetupContextValue {
+ state: SetupState;
+ dispatch: Dispatch;
+ submitConfiguration(config: {
+ myName: string;
+ password: string;
+ configs: T;
+ }): Promise;
+ connectToHost(url: string): Promise;
+ fetchConsensusState(): Promise;
+ toggleConsensusPolling(toggle: boolean): void;
+}
+
+export const SetupContext = createContext({
+ state: initialState,
+ dispatch: () => null,
+ submitConfiguration: () => Promise.reject(),
+ connectToHost: () => Promise.reject(),
+ fetchConsensusState: () => Promise.reject(),
+ toggleConsensusPolling: () => null,
+});
+
+export interface SetupContextProviderProps {
+ initServerStatus: GuardianServerStatus;
+ children: ReactNode;
+}
+
+export const SetupContextProvider: React.FC = ({
+ initServerStatus,
+ children,
+}: SetupContextProviderProps) => {
+ const api = useGuardianApi();
+ const [state, dispatch] = useReducer(reducer, {
+ ...initialState,
+ password: api.getPassword() || initialState.password,
+ });
+
+ useHandleSetupServerStatus(initServerStatus, dispatch);
+
+ // Update local storage on state changes.
+ useUpdateLocalStorageOnSetupStateChange(state);
+
+ const {
+ submitConfiguration,
+ connectToHost,
+ fetchConsensusState,
+ toggleConsensusPolling,
+ } = useHandleBackgroundGuardianSetupActions(state, dispatch);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/apps/router/src/context/hooks.tsx b/apps/router/src/context/hooks.tsx
new file mode 100644
index 000000000..5c77eab05
--- /dev/null
+++ b/apps/router/src/context/hooks.tsx
@@ -0,0 +1,507 @@
+import { Dispatch, useCallback, useContext, useEffect, useState } from 'react';
+import { AppContext, AppContextValue } from './AppContext';
+import {
+ GuardianContext,
+ GuardianContextValue,
+} from './guardian/GuardianContext';
+import {
+ GUARDIAN_APP_ACTION_TYPE,
+ GuardianAppAction,
+ GuardianAppState,
+ GuardianStatus,
+ SETUP_ACTION_TYPE,
+ SetupAction,
+ SetupProgress,
+ SetupState,
+} from '../guardian-ui/types';
+import {
+ AdminApiInterface,
+ GuardianApi,
+ GuardianConfig,
+ SetupApiInterface,
+} from '../guardian-ui/GuardianApi';
+import {
+ ConfigGenParams,
+ GatewayInfo,
+ GuardianServerStatus,
+} from '@fedimint/types';
+import { formatApiErrorMessage } from '../guardian-ui/utils/api';
+import {
+ LOCAL_STORAGE_SETUP_KEY,
+ SetupContext,
+ SetupContextValue,
+} from './guardian/SetupContext';
+import {
+ GATEWAY_APP_ACTION_TYPE,
+ GatewayAppAction,
+ GatewayAppState,
+ GatewayConfig,
+} from '../gateway-ui/types';
+import { GatewayContext, GatewayContextValue } from './gateway/GatewayContext';
+import { GatewayApi } from '../gateway-ui/GatewayApi';
+
+export function useAppContext(): AppContextValue {
+ return useContext(AppContext);
+}
+
+export function useAppGuardianConfigs(): GuardianConfig[] {
+ const { guardians } = useAppContext();
+ return Object.values(guardians).map((guardian) => guardian.config);
+}
+
+export function useNumberOfGuardians(): number {
+ return Object.keys(useAppContext().guardians).length;
+}
+
+export function useNumberOfGateways(): number {
+ return Object.keys(useAppContext().gateways).length;
+}
+
+export const useGuardianConfig = (id: string): GuardianConfig => {
+ const { guardians } = useAppContext();
+ if (!guardians[id])
+ throw new Error('useGuardianConfig must be used with a selected guardian');
+ return guardians[id].config;
+};
+
+export const useGatewayConfig = (id: string): GatewayConfig => {
+ const { gateways } = useAppContext();
+ if (!gateways[id])
+ throw new Error('useGatewayConfig must be used with a selected gateway');
+ return gateways[id].config;
+};
+
+export const useGuardianDispatch = (): Dispatch => {
+ const guardian = useGuardianContext();
+ if (!guardian)
+ throw new Error(
+ 'useGuardianDispatch must be used within a GuardianContextProvider'
+ );
+ return guardian.dispatch;
+};
+
+export const useLoadGuardian = (): void => {
+ const guardianApi = useGuardianApi();
+ const guardianState = useGuardianState();
+ const dispatch = useGuardianDispatch();
+ useEffect(() => {
+ const load = async () => {
+ try {
+ await guardianApi.connect();
+ const server = (await guardianApi.status()).server;
+
+ // If they're at a point where a password has been configured, make
+ // sure they have a valid password set. If not, set needsAuth.
+ if (server !== GuardianServerStatus.AwaitingPassword) {
+ const password = guardianApi.getPassword();
+ const hasValidPassword = password
+ ? await guardianApi.testPassword(password)
+ : false;
+ if (!hasValidPassword) {
+ dispatch({
+ type: GUARDIAN_APP_ACTION_TYPE.SET_NEEDS_AUTH,
+ payload: true,
+ });
+ }
+ }
+
+ if (server === GuardianServerStatus.ConsensusRunning) {
+ dispatch({
+ type: GUARDIAN_APP_ACTION_TYPE.SET_STATUS,
+ payload: GuardianStatus.Admin,
+ });
+ } else {
+ dispatch({
+ type: GUARDIAN_APP_ACTION_TYPE.SET_STATUS,
+ payload: GuardianStatus.Setup,
+ });
+ }
+
+ dispatch({
+ type: GUARDIAN_APP_ACTION_TYPE.SET_INIT_SERVER_STATUS,
+ payload: server,
+ });
+ } catch (err) {
+ dispatch({
+ type: GUARDIAN_APP_ACTION_TYPE.SET_ERROR,
+ payload: formatApiErrorMessage(err),
+ });
+ }
+ };
+
+ if (guardianState.status === GuardianStatus.Loading) {
+ load().catch((err) => console.error(err));
+ }
+ }, [guardianState.status, guardianApi, dispatch]);
+};
+
+export const useGuardianContext = (): GuardianContextValue => {
+ const guardian = useContext(GuardianContext);
+ if (!guardian)
+ throw new Error(
+ 'useGuardianContext must be used within a GuardianContextProvider'
+ );
+ return guardian;
+};
+
+export const useGuardianApi = (): GuardianApi => {
+ const guardian = useGuardianContext();
+ return guardian.api;
+};
+
+export const useGuardianState = (): GuardianAppState => {
+ const guardian = useGuardianContext();
+ return guardian.state;
+};
+
+export const useGuardianStatus = (): GuardianStatus => {
+ const guardian = useGuardianContext();
+ if (!guardian) return GuardianStatus.Loading;
+ return guardian.state.status;
+};
+
+export const useGuardianAdminApi = (): AdminApiInterface => {
+ const guardian = useGuardianContext();
+ return guardian.api;
+};
+
+export const useGuardianSetupContext = (): SetupContextValue => {
+ const setup = useContext(SetupContext);
+ if (!setup)
+ throw new Error(
+ 'useGuardianSetupContext must be used within a SetupContextProvider'
+ );
+ return setup;
+};
+
+export const useGuardianSetupApi = (): SetupApiInterface => {
+ const guardian = useGuardianContext();
+ return guardian.api;
+};
+
+/**
+ * Tells the guardian context to poll for updates. Handles turning off polling
+ * on dismount.
+ */
+export function useConsensusPolling(shouldPoll = true) {
+ const { toggleConsensusPolling } = useGuardianSetupContext();
+
+ useEffect(() => {
+ if (!shouldPoll) return;
+ toggleConsensusPolling(true);
+ return () => toggleConsensusPolling(false);
+ }, [shouldPoll, toggleConsensusPolling]);
+}
+
+export const useHandleSetupServerStatus = (
+ initServerStatus: GuardianServerStatus,
+ dispatch: Dispatch
+): void => {
+ useEffect(() => {
+ switch (initServerStatus) {
+ case GuardianServerStatus.AwaitingPassword:
+ // If we're still waiting for a password, restart the whole thing.
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_INITIAL_STATE,
+ payload: null,
+ });
+ break;
+ case GuardianServerStatus.ReadyForConfigGen:
+ // If we're ready for DKG, move them to approve the config to start.
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_PROGRESS,
+ payload: SetupProgress.ConnectGuardians,
+ });
+ break;
+ case GuardianServerStatus.VerifyingConfigs:
+ case GuardianServerStatus.VerifiedConfigs:
+ // If we're supposed to be verifying, or have verified, jump to peer validation screen
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_PROGRESS,
+ payload: SetupProgress.VerifyGuardians,
+ });
+ break;
+ case GuardianServerStatus.ConsensusRunning:
+ default:
+ // We should never boot into these states with the setup UI. We probably should show error
+ // For now, skip past all setup, and transition to admin.
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_IS_SETUP_COMPLETE,
+ payload: true,
+ });
+ break;
+ }
+ }, [initServerStatus, dispatch]);
+};
+
+export const useUpdateLocalStorageOnSetupStateChange = (
+ state: SetupState
+): void => {
+ useEffect(() => {
+ localStorage.setItem(
+ LOCAL_STORAGE_SETUP_KEY,
+ JSON.stringify({
+ role: state.role,
+ progress: state.progress,
+ myName: state.myName,
+ numPeers: state.numPeers,
+ configGenParams: state.configGenParams,
+ ourCurrentId: state.ourCurrentId,
+ })
+ );
+
+ return () => {
+ // Clear local storage on setup complete.
+ // This happens when we transition to admin experience.
+ if (state.progress === SetupProgress.SetupComplete) {
+ localStorage.removeItem(LOCAL_STORAGE_SETUP_KEY);
+ }
+ };
+ }, [
+ state.role,
+ state.progress,
+ state.myName,
+ state.numPeers,
+ state.configGenParams,
+ state.ourCurrentId,
+ ]);
+};
+
+export type HostConfigs = ConfigGenParams & {
+ numPeers: number;
+};
+
+export type FollowerConfigs = ConfigGenParams & {
+ hostServerUrl: string;
+};
+
+const isHostConfigs = (
+ configs: HostConfigs | FollowerConfigs
+): configs is HostConfigs => {
+ return (configs as HostConfigs).numPeers !== undefined;
+};
+
+const isFollowerConfigs = (
+ configs: HostConfigs | FollowerConfigs
+): configs is FollowerConfigs => {
+ return (configs as FollowerConfigs).hostServerUrl !== undefined;
+};
+
+export const useHandleBackgroundGuardianSetupActions = (
+ state: SetupState,
+ dispatch: Dispatch
+): {
+ submitConfiguration: SetupContextValue['submitConfiguration'];
+ connectToHost: SetupContextValue['connectToHost'];
+ fetchConsensusState: SetupContextValue['fetchConsensusState'];
+ toggleConsensusPolling: SetupContextValue['toggleConsensusPolling'];
+} => {
+ const api = useGuardianApi();
+ const { password, myName } = state;
+ const [isPollingConsensus, setIsPollingConsensus] = useState(false);
+
+ // Fetch consensus state, dispatch updates with it.
+ const fetchConsensusState = useCallback(async () => {
+ const consensusState = await api.getConsensusConfigGenParams();
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_OUR_CURRENT_ID,
+ payload: consensusState.our_current_id,
+ });
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_PEERS,
+ payload: Object.values(consensusState.consensus.peers),
+ });
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_CONFIG_GEN_PARAMS,
+ payload: consensusState.consensus,
+ });
+ }, [api, dispatch]);
+
+ // Poll for peer state every 2 seconds when isPollingPeers.
+ useEffect(() => {
+ if (!isPollingConsensus) return;
+ let timeout: ReturnType;
+ const pollPeers = () => {
+ fetchConsensusState()
+ .catch((err) => {
+ console.warn('Failed to poll for peers', err);
+ })
+ .finally(() => {
+ timeout = setTimeout(pollPeers, 2000);
+ });
+ };
+ pollPeers();
+ return () => clearTimeout(timeout);
+ }, [isPollingConsensus, fetchConsensusState]);
+
+ // Single call to save all of the host / follower configurations
+ const submitConfiguration: SetupContextValue['submitConfiguration'] =
+ useCallback(
+ async ({ password: newPassword, myName, configs }) => {
+ if (!password) {
+ await api.setPassword(newPassword);
+
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_PASSWORD,
+ payload: newPassword,
+ });
+ }
+
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_MY_NAME,
+ payload: myName,
+ });
+
+ if (isHostConfigs(configs)) {
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_NUM_PEERS,
+ payload: configs.numPeers,
+ });
+
+ // Hosts set their own connection name only.
+ await api.setConfigGenConnections(myName);
+
+ // Hosts submit both their local and the consensus config gen params.
+ await api.setConfigGenParams(configs);
+ dispatch({
+ type: SETUP_ACTION_TYPE.SET_CONFIG_GEN_PARAMS,
+ payload: configs,
+ });
+ }
+
+ if (isFollowerConfigs(configs)) {
+ // Followers set their own connection name, and hosts server URL to connect to.
+ await api.setConfigGenConnections(myName, configs.hostServerUrl);
+
+ // Followers submit ONLY their local config gen params.
+ await api.setConfigGenParams(configs);
+
+ // Followers fetch consensus config gen params from the host.
+ await fetchConsensusState();
+ }
+ },
+ [password, api, dispatch, fetchConsensusState]
+ );
+
+ const connectToHost = useCallback(
+ async (url: string) => {
+ await api.setConfigGenConnections(myName, url);
+ return await fetchConsensusState();
+ },
+ [myName, api, fetchConsensusState]
+ );
+
+ const toggleConsensusPolling = useCallback((poll: boolean) => {
+ setIsPollingConsensus(poll);
+ }, []);
+
+ return {
+ submitConfiguration,
+ connectToHost,
+ fetchConsensusState,
+ toggleConsensusPolling,
+ };
+};
+
+export const useGatewayContext = (): GatewayContextValue => {
+ const gateway = useContext(GatewayContext);
+ if (!gateway)
+ throw new Error(
+ 'useGatewayContext must be used within a GatewayContextProvider'
+ );
+ return gateway;
+};
+
+export const useGatewayApi = (): GatewayApi => {
+ const gateway = useGatewayContext();
+ return gateway.api;
+};
+
+export const useGatewayState = (): GatewayAppState => {
+ const gateway = useGatewayContext();
+ return gateway.state;
+};
+
+export const useGatewayDispatch = (): Dispatch => {
+ const gateway = useGatewayContext();
+ if (!gateway)
+ throw new Error(
+ 'useGatewayDispatch must be used within a GatewayContextProvider'
+ );
+ return gateway.dispatch;
+};
+
+export const useGatewayInfo = (): GatewayInfo => {
+ const gateway = useGatewayContext();
+ if (!gateway.state.gatewayInfo)
+ throw new Error(
+ 'useGatewayInfo must be used within a GatewayContextProvider'
+ );
+ return gateway.state.gatewayInfo;
+};
+
+export const useLoadGateway = () => {
+ const state = useGatewayState();
+ const dispatch = useGatewayDispatch();
+
+ const api = useGatewayApi();
+
+ useEffect(() => {
+ if (!state.needsAuth) {
+ const fetchInfoAndConfigs = async () => {
+ try {
+ const gatewayInfo = await api.fetchInfo();
+
+ const configs = await api.fetchConfigs();
+
+ const updatedFederations = gatewayInfo.federations.map(
+ (federation) => ({
+ ...federation,
+ config: configs.federations[federation.federation_id],
+ })
+ );
+
+ const updatedGatewayInfo = {
+ ...gatewayInfo,
+ federations: updatedFederations,
+ };
+
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_GATEWAY_INFO,
+ payload: updatedGatewayInfo,
+ });
+ } catch (error: unknown) {
+ console.error(error);
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_ERROR,
+ payload: (error as Error).message,
+ });
+ }
+ };
+
+ const fetchBalances = () => {
+ api
+ .fetchBalances()
+ .then((balances) => {
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_BALANCES,
+ payload: balances,
+ });
+ })
+ .catch(({ message, error }) => {
+ console.error(error);
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_ERROR,
+ payload: message,
+ });
+ });
+ };
+
+ fetchInfoAndConfigs();
+ fetchBalances();
+
+ const interval = setInterval(fetchInfoAndConfigs, 5000);
+ return () => clearInterval(interval);
+ }
+ }, [state.needsAuth, api, dispatch]);
+};
diff --git a/apps/router/src/gateway-ui/Gateway.tsx b/apps/router/src/gateway-ui/Gateway.tsx
new file mode 100644
index 000000000..0139b432a
--- /dev/null
+++ b/apps/router/src/gateway-ui/Gateway.tsx
@@ -0,0 +1,87 @@
+import React, { useState } from 'react';
+import { Flex } from '@chakra-ui/react';
+import { ConnectFederationModal, LightningCard } from './components';
+import { FederationsTable } from './components/federations/FederationsTable';
+import { Loading } from './components/Loading';
+import { HeaderWithUnitSelector } from './components/HeaderWithUnitSelector';
+import { WalletCard } from './components/walletCard/WalletCard';
+import {
+ WalletModal,
+ WalletModalAction,
+ WalletModalState,
+ WalletModalType,
+} from './components/walletModal/WalletModal';
+import { useGatewayContext, useLoadGateway } from '../context/hooks';
+import { ErrorMessage } from './components/ErrorMessage';
+import { Login } from '@fedimint/ui';
+import { GATEWAY_APP_ACTION_TYPE } from './types';
+
+export const UNIT_OPTIONS = ['msats', 'sats', 'btc'] as const;
+export type Unit = (typeof UNIT_OPTIONS)[number];
+
+export const Gateway = () => {
+ const { state, dispatch, api } = useGatewayContext();
+ const [showConnectFed, setShowConnectFed] = useState(false);
+ const [walletModalState, setWalletModalState] = useState({
+ isOpen: false,
+ action: WalletModalAction.Receive,
+ type: WalletModalType.Onchain,
+ selectedFederation: null,
+ });
+
+ useLoadGateway();
+ if (state.needsAuth) {
+ return (
+
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_NEEDS_AUTH,
+ payload: false,
+ })
+ }
+ parseError={(err) => (err as Error).message}
+ />
+ );
+ }
+ if (state.gatewayError) return ;
+ if (state.gatewayInfo === null) return ;
+
+ return (
+
+
+ {state.balances && (
+
+ )}
+
+ setShowConnectFed(true)}
+ setWalletModalState={setWalletModalState}
+ />
+ setShowConnectFed(false)}
+ />
+
+
+ );
+};
diff --git a/apps/gateway-ui/src/GatewayApi.ts b/apps/router/src/gateway-ui/GatewayApi.ts
similarity index 98%
rename from apps/gateway-ui/src/GatewayApi.ts
rename to apps/router/src/gateway-ui/GatewayApi.ts
index a909d4bf7..b3feedf3c 100644
--- a/apps/gateway-ui/src/GatewayApi.ts
+++ b/apps/router/src/gateway-ui/GatewayApi.ts
@@ -14,12 +14,17 @@ import {
ReceiveEcashResponse,
GatewayBalances,
} from '@fedimint/types';
+import { GatewayConfig } from './types';
export const SESSION_STORAGE_KEY = 'gateway-ui-key';
// GatewayApi is an implementation of the ApiInterface
export class GatewayApi {
- private baseUrl: string | undefined = process.env.REACT_APP_FM_GATEWAY_API;
+ private baseUrl: string;
+
+ constructor(config: GatewayConfig) {
+ this.baseUrl = config.baseUrl;
+ }
// Tests a provided password or the one in session storage
testPassword = async (password?: string): Promise => {
diff --git a/apps/gateway-ui/README.md b/apps/router/src/gateway-ui/README.md
similarity index 100%
rename from apps/gateway-ui/README.md
rename to apps/router/src/gateway-ui/README.md
diff --git a/apps/gateway-ui/src/assets/svgs/check-circle.svg b/apps/router/src/gateway-ui/assets/svgs/check-circle.svg
similarity index 100%
rename from apps/gateway-ui/src/assets/svgs/check-circle.svg
rename to apps/router/src/gateway-ui/assets/svgs/check-circle.svg
diff --git a/apps/gateway-ui/src/assets/svgs/copy.svg b/apps/router/src/gateway-ui/assets/svgs/copy.svg
similarity index 100%
rename from apps/gateway-ui/src/assets/svgs/copy.svg
rename to apps/router/src/gateway-ui/assets/svgs/copy.svg
diff --git a/apps/gateway-ui/src/assets/svgs/info-solid.svg b/apps/router/src/gateway-ui/assets/svgs/info-solid.svg
similarity index 100%
rename from apps/gateway-ui/src/assets/svgs/info-solid.svg
rename to apps/router/src/gateway-ui/assets/svgs/info-solid.svg
diff --git a/apps/gateway-ui/src/assets/svgs/linkIcon.svg b/apps/router/src/gateway-ui/assets/svgs/linkIcon.svg
similarity index 100%
rename from apps/gateway-ui/src/assets/svgs/linkIcon.svg
rename to apps/router/src/gateway-ui/assets/svgs/linkIcon.svg
diff --git a/apps/gateway-ui/src/assets/svgs/x-circle.svg b/apps/router/src/gateway-ui/assets/svgs/x-circle.svg
similarity index 100%
rename from apps/gateway-ui/src/assets/svgs/x-circle.svg
rename to apps/router/src/gateway-ui/assets/svgs/x-circle.svg
diff --git a/apps/gateway-ui/src/components/ConnectFederationModal.tsx b/apps/router/src/gateway-ui/components/ConnectFederationModal.tsx
similarity index 85%
rename from apps/gateway-ui/src/components/ConnectFederationModal.tsx
rename to apps/router/src/gateway-ui/components/ConnectFederationModal.tsx
index cb2fcaa17..d53f5f4c5 100644
--- a/apps/gateway-ui/src/components/ConnectFederationModal.tsx
+++ b/apps/router/src/gateway-ui/components/ConnectFederationModal.tsx
@@ -13,26 +13,31 @@ import {
ModalContent,
ModalCloseButton,
} from '@chakra-ui/react';
-import { FederationInfo } from '@fedimint/types';
+import { GatewayInfo } from '@fedimint/types';
import { useTranslation } from '@fedimint/utils';
-import { ApiContext } from '../ApiProvider';
+import {
+ useGatewayApi,
+ useGatewayContext,
+ useGatewayInfo,
+} from '../../context/hooks';
+import { GATEWAY_APP_ACTION_TYPE } from '../types';
export type ConnectFederationModalProps = {
isOpen: boolean;
onClose: () => void;
- renderConnectedFedCallback: (federation: FederationInfo) => void;
};
export const ConnectFederationModal = React.memo(
function ConnectFederationModal({
isOpen,
onClose,
- renderConnectedFedCallback,
}: ConnectFederationModalProps) {
const { t } = useTranslation();
- const { gateway } = React.useContext(ApiContext);
- const [errorMsg, setErrorMsg] = useState('');
+ const api = useGatewayApi();
+ const { dispatch } = useGatewayContext();
+ const gatewayInfo = useGatewayInfo();
const [connectInfo, setConnectInfo] = useState('');
+ const [errorMsg, setErrorMsg] = useState('');
const [loading, setLoading] = useState(false);
const theme = useTheme();
@@ -45,10 +50,16 @@ export const ConnectFederationModal = React.memo(
const handleConnectFederation = () => {
setLoading(true);
- gateway
+ api
.connectFederation(connectInfo.trim())
.then((federation) => {
- renderConnectedFedCallback(federation);
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_GATEWAY_INFO,
+ payload: {
+ ...gatewayInfo,
+ federations: [...gatewayInfo.federations, federation],
+ } as GatewayInfo,
+ });
setConnectInfo('');
})
.catch(({ message, error }) => {
diff --git a/apps/gateway-ui/src/components/ErrorMessage.tsx b/apps/router/src/gateway-ui/components/ErrorMessage.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/ErrorMessage.tsx
rename to apps/router/src/gateway-ui/components/ErrorMessage.tsx
diff --git a/apps/gateway-ui/src/components/GatewayCard.tsx b/apps/router/src/gateway-ui/components/GatewayCard.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/GatewayCard.tsx
rename to apps/router/src/gateway-ui/components/GatewayCard.tsx
diff --git a/apps/gateway-ui/src/components/HeaderWithUnitSelector.tsx b/apps/router/src/gateway-ui/components/HeaderWithUnitSelector.tsx
similarity index 70%
rename from apps/gateway-ui/src/components/HeaderWithUnitSelector.tsx
rename to apps/router/src/gateway-ui/components/HeaderWithUnitSelector.tsx
index 81a014b7b..e36992ae1 100644
--- a/apps/gateway-ui/src/components/HeaderWithUnitSelector.tsx
+++ b/apps/router/src/gateway-ui/components/HeaderWithUnitSelector.tsx
@@ -1,15 +1,12 @@
import React from 'react';
import { Flex, Heading, Tabs, TabList, Tab, useTheme } from '@chakra-ui/react';
import { useTranslation } from '@fedimint/utils';
-import { Unit, UNIT_OPTIONS } from '../App';
+import { UNIT_OPTIONS } from '../Gateway';
+import { useGatewayContext } from '../../context/hooks';
+import { GATEWAY_APP_ACTION_TYPE } from '../types';
-interface HeaderWithUnitSelectorProps {
- setUnit: (unit: Unit) => void;
-}
-
-export const HeaderWithUnitSelector: React.FC = ({
- setUnit,
-}) => {
+export const HeaderWithUnitSelector: React.FC = () => {
+ const { dispatch } = useGatewayContext();
const theme = useTheme();
const { t } = useTranslation();
@@ -31,7 +28,12 @@ export const HeaderWithUnitSelector: React.FC = ({
size='sm'
variant='soft-rounded'
defaultIndex={1}
- onChange={(index) => setUnit(UNIT_OPTIONS[index])}
+ onChange={(index) => {
+ dispatch({
+ type: GATEWAY_APP_ACTION_TYPE.SET_UNIT,
+ payload: UNIT_OPTIONS[index],
+ });
+ }}
>
{UNIT_OPTIONS.map((option) => (
diff --git a/apps/gateway-ui/src/components/Loading.tsx b/apps/router/src/gateway-ui/components/Loading.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/Loading.tsx
rename to apps/router/src/gateway-ui/components/Loading.tsx
diff --git a/apps/gateway-ui/src/components/federations/ConnectFederation.tsx b/apps/router/src/gateway-ui/components/federations/ConnectFederation.tsx
similarity index 97%
rename from apps/gateway-ui/src/components/federations/ConnectFederation.tsx
rename to apps/router/src/gateway-ui/components/federations/ConnectFederation.tsx
index ecc63a620..7935df2f0 100644
--- a/apps/gateway-ui/src/components/federations/ConnectFederation.tsx
+++ b/apps/router/src/gateway-ui/components/federations/ConnectFederation.tsx
@@ -18,7 +18,7 @@ import {
} from '@chakra-ui/react';
import { FederationInfo } from '@fedimint/types';
import { useTranslation } from '@fedimint/utils';
-import { ApiContext } from '../../ApiProvider';
+import { useGatewayApi } from '../../../context/hooks';
export interface ConnectFedModalProps {
isOpen: boolean;
@@ -84,7 +84,7 @@ export const ConnectFederation = React.memo(function ConnectFederation({
onClose,
}: ConnectFederationProps) {
const { t } = useTranslation();
- const { gateway } = React.useContext(ApiContext);
+ const api = useGatewayApi();
const [errorMsg, setErrorMsg] = useState('');
const [connectInfo, setConnectInfo] = useState('');
const [loading, setLoading] = useState(false);
@@ -97,7 +97,7 @@ export const ConnectFederation = React.memo(function ConnectFederation({
const handleConnectFederation = () => {
setLoading(true);
- gateway
+ api
.connectFederation(connectInfo.trim())
.then((federation) => {
renderConnectedFedCallback(federation);
diff --git a/apps/gateway-ui/src/components/federations/FederationsTable.tsx b/apps/router/src/gateway-ui/components/federations/FederationsTable.tsx
similarity index 98%
rename from apps/gateway-ui/src/components/federations/FederationsTable.tsx
rename to apps/router/src/gateway-ui/components/federations/FederationsTable.tsx
index 702d7cd27..3ba493f1f 100644
--- a/apps/gateway-ui/src/components/federations/FederationsTable.tsx
+++ b/apps/router/src/gateway-ui/components/federations/FederationsTable.tsx
@@ -13,7 +13,7 @@ import { FederationInfo, MSats } from '@fedimint/types';
import { useTranslation, formatEllipsized, formatValue } from '@fedimint/utils';
import { Table, TableColumn, TableRow } from '@fedimint/ui';
import { ViewConfigModal } from './ViewConfig';
-import { Unit } from '../../App';
+import { Unit } from '../../Gateway';
import {
WalletModalAction,
WalletModalState,
diff --git a/apps/gateway-ui/src/components/federations/ViewConfig.tsx b/apps/router/src/gateway-ui/components/federations/ViewConfig.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/federations/ViewConfig.tsx
rename to apps/router/src/gateway-ui/components/federations/ViewConfig.tsx
diff --git a/apps/gateway-ui/src/components/index.tsx b/apps/router/src/gateway-ui/components/index.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/index.tsx
rename to apps/router/src/gateway-ui/components/index.tsx
diff --git a/apps/gateway-ui/src/components/lightning/LightningCard.tsx b/apps/router/src/gateway-ui/components/lightning/LightningCard.tsx
similarity index 99%
rename from apps/gateway-ui/src/components/lightning/LightningCard.tsx
rename to apps/router/src/gateway-ui/components/lightning/LightningCard.tsx
index 026591059..44b5efc07 100644
--- a/apps/gateway-ui/src/components/lightning/LightningCard.tsx
+++ b/apps/router/src/gateway-ui/components/lightning/LightningCard.tsx
@@ -47,7 +47,7 @@ export const LightningCard = React.memo(function LightningCard({
{label}:
- {value}
+ {value}
);
diff --git a/apps/gateway-ui/src/components/walletCard/WalletCard.tsx b/apps/router/src/gateway-ui/components/walletCard/WalletCard.tsx
similarity index 99%
rename from apps/gateway-ui/src/components/walletCard/WalletCard.tsx
rename to apps/router/src/gateway-ui/components/walletCard/WalletCard.tsx
index 9ec5b5db6..6cc3e5697 100644
--- a/apps/gateway-ui/src/components/walletCard/WalletCard.tsx
+++ b/apps/router/src/gateway-ui/components/walletCard/WalletCard.tsx
@@ -10,7 +10,7 @@ import {
WalletModalState,
WalletModalType,
} from '../walletModal/WalletModal';
-import { Unit } from '../../App';
+import { Unit } from '../../Gateway';
interface WalletCardProps {
unit: Unit;
diff --git a/apps/gateway-ui/src/components/walletModal/FederationSelector.tsx b/apps/router/src/gateway-ui/components/walletModal/FederationSelector.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/walletModal/FederationSelector.tsx
rename to apps/router/src/gateway-ui/components/walletModal/FederationSelector.tsx
diff --git a/apps/gateway-ui/src/components/walletModal/WalletActionSelector.tsx b/apps/router/src/gateway-ui/components/walletModal/WalletActionSelector.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/walletModal/WalletActionSelector.tsx
rename to apps/router/src/gateway-ui/components/walletModal/WalletActionSelector.tsx
diff --git a/apps/gateway-ui/src/components/walletModal/WalletModal.tsx b/apps/router/src/gateway-ui/components/walletModal/WalletModal.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/walletModal/WalletModal.tsx
rename to apps/router/src/gateway-ui/components/walletModal/WalletModal.tsx
diff --git a/apps/gateway-ui/src/components/walletModal/WalletTypeButtons.tsx b/apps/router/src/gateway-ui/components/walletModal/WalletTypeButtons.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/walletModal/WalletTypeButtons.tsx
rename to apps/router/src/gateway-ui/components/walletModal/WalletTypeButtons.tsx
diff --git a/apps/gateway-ui/src/components/walletModal/index.tsx b/apps/router/src/gateway-ui/components/walletModal/index.tsx
similarity index 98%
rename from apps/gateway-ui/src/components/walletModal/index.tsx
rename to apps/router/src/gateway-ui/components/walletModal/index.tsx
index db6d29c3f..aeb9fae38 100644
--- a/apps/gateway-ui/src/components/walletModal/index.tsx
+++ b/apps/router/src/gateway-ui/components/walletModal/index.tsx
@@ -18,7 +18,7 @@ import {
import { useTranslation } from '@fedimint/utils';
import { FederationInfo, Sats } from '@fedimint/types';
import { WalletModalState } from './WalletModal';
-import QRCode from 'qrcode.react';
+import { QRCodeSVG } from 'qrcode.react';
import { FiCheck, FiCopy } from 'react-icons/fi';
import { motion } from 'framer-motion';
@@ -132,7 +132,7 @@ const QRCodePanel: React.FC<{ value: string; onCopy: () => void }> = ({
justifyContent='center'
width='100%'
>
-
+ = ({ setShowSelector }) => {
const { t } = useTranslation();
const [ecashNote, setEcashNote] = useState('');
const [claimedAmount, setClaimedAmount] = useState(null);
- const gatewayApi = new GatewayApi();
+ const api = useGatewayApi();
const handlePaste = async () => {
try {
const text = await navigator.clipboard.readText();
setEcashNote(text);
- const result = await gatewayApi.receiveEcash(text);
+ const result = await api.receiveEcash(text);
setClaimedAmount(result);
setShowSelector(false);
} catch (err) {
diff --git a/apps/gateway-ui/src/components/walletModal/receive/ReceiveLightning.tsx b/apps/router/src/gateway-ui/components/walletModal/receive/ReceiveLightning.tsx
similarity index 93%
rename from apps/gateway-ui/src/components/walletModal/receive/ReceiveLightning.tsx
rename to apps/router/src/gateway-ui/components/walletModal/receive/ReceiveLightning.tsx
index cfb68f251..586124ba4 100644
--- a/apps/gateway-ui/src/components/walletModal/receive/ReceiveLightning.tsx
+++ b/apps/router/src/gateway-ui/components/walletModal/receive/ReceiveLightning.tsx
@@ -4,8 +4,8 @@ import { useTranslation } from '@fedimint/utils';
import { FederationInfo, IncomingContract, Sats } from '@fedimint/types';
import { WalletModalState } from '../WalletModal';
import FederationSelector from '../FederationSelector';
-import { ApiContext } from '../../../ApiProvider';
import { AmountInput, CreateButton, QRCodeTabs } from '..';
+import { useGatewayApi } from '../../../../context/hooks';
interface ReceiveLightningProps {
federations: FederationInfo[];
@@ -21,7 +21,7 @@ const ReceiveLightning: React.FC = ({
setShowSelector,
}) => {
const { t } = useTranslation();
- const { gateway } = React.useContext(ApiContext);
+ const api = useGatewayApi();
const [amount, setAmount] = useState(0 as Sats);
const [invoice, setInvoice] = useState();
const [showInvoiceInfo, setShowInvoiceInfo] = useState(false);
@@ -33,7 +33,7 @@ const ReceiveLightning: React.FC = ({
commitment: 'test',
ciphertext: 'test',
};
- const invoice = await gateway.createBolt11InvoiceV2({
+ const invoice = await api.createBolt11InvoiceV2({
federation_id: walletModalState.selectedFederation?.federation_id ?? '',
contract: incomingContract,
invoice_amount: amount as number,
@@ -47,7 +47,7 @@ const ReceiveLightning: React.FC = ({
console.error('Failed to create invoice:', error);
}
}, [
- gateway,
+ api,
setShowSelector,
setShowInvoiceInfo,
walletModalState.selectedFederation?.federation_id,
diff --git a/apps/gateway-ui/src/components/walletModal/receive/ReceiveOnchain.tsx b/apps/router/src/gateway-ui/components/walletModal/receive/ReceiveOnchain.tsx
similarity index 91%
rename from apps/gateway-ui/src/components/walletModal/receive/ReceiveOnchain.tsx
rename to apps/router/src/gateway-ui/components/walletModal/receive/ReceiveOnchain.tsx
index 9a5203ec9..60d96b747 100644
--- a/apps/gateway-ui/src/components/walletModal/receive/ReceiveOnchain.tsx
+++ b/apps/router/src/gateway-ui/components/walletModal/receive/ReceiveOnchain.tsx
@@ -4,8 +4,8 @@ import { useTranslation } from '@fedimint/utils';
import { Bip21Uri, FederationInfo, Sats } from '@fedimint/types';
import { WalletModalState } from '../WalletModal';
import FederationSelector from '../FederationSelector';
-import { ApiContext } from '../../../ApiProvider';
import { AmountInput, CreateButton, QRCodeTabs } from '..';
+import { useGatewayApi } from '../../../../context/hooks';
interface ReceiveOnchainProps {
federations: FederationInfo[];
@@ -21,7 +21,7 @@ const ReceiveOnchain: React.FC = ({
setShowSelector,
}) => {
const { t } = useTranslation();
- const { gateway } = React.useContext(ApiContext);
+ const api = useGatewayApi();
const [amount, setAmount] = useState(0 as Sats);
const [bip21Uri, setBip21Uri] = useState();
const [showAddressInfo, setShowAddressInfo] = useState(false);
@@ -30,9 +30,9 @@ const ReceiveOnchain: React.FC = ({
const handleCreateDepositAddress = useCallback(() => {
if (!walletModalState.selectedFederation) return;
- gateway
+ api
.fetchPegInAddress(walletModalState.selectedFederation.federation_id)
- .then((newAddress) => {
+ .then((newAddress: string) => {
const bip21Uri = new Bip21Uri(newAddress, amount);
setBip21Uri(bip21Uri);
setShowSelector(false);
@@ -42,13 +42,7 @@ const ReceiveOnchain: React.FC = ({
console.error(error, message);
alert(t('wallet-modal.receive.address-error', { error: message }));
});
- }, [
- gateway,
- walletModalState.selectedFederation,
- amount,
- setShowSelector,
- t,
- ]);
+ }, [api, walletModalState.selectedFederation, amount, setShowSelector, t]);
if (showAddressInfo) {
return (
diff --git a/apps/gateway-ui/src/components/walletModal/send/SendEcash.tsx b/apps/router/src/gateway-ui/components/walletModal/send/SendEcash.tsx
similarity index 91%
rename from apps/gateway-ui/src/components/walletModal/send/SendEcash.tsx
rename to apps/router/src/gateway-ui/components/walletModal/send/SendEcash.tsx
index d13c78df5..b67626d27 100644
--- a/apps/gateway-ui/src/components/walletModal/send/SendEcash.tsx
+++ b/apps/router/src/gateway-ui/components/walletModal/send/SendEcash.tsx
@@ -5,7 +5,7 @@ import { FederationInfo, Sats } from '@fedimint/types';
import { WalletModalState } from '../WalletModal';
import FederationSelector from '../FederationSelector';
import { AmountInput, CreateButton, QRCodeTabs } from '..';
-import { ApiContext } from '../../../ApiProvider';
+import { useGatewayApi } from '../../../../context/hooks';
interface SendEcashProps {
federations: FederationInfo[];
@@ -21,7 +21,7 @@ const SendEcash: React.FC = ({
setShowSelector,
}) => {
const { t } = useTranslation();
- const { gateway } = React.useContext(ApiContext);
+ const api = useGatewayApi();
const [amount, setAmount] = useState(0 as Sats);
const [ecash, setEcash] = useState('');
const [showEcash, setShowEcash] = useState(false);
@@ -29,7 +29,7 @@ const SendEcash: React.FC = ({
const handleCreateEcash = useCallback(() => {
if (!walletModalState.selectedFederation) return;
- gateway
+ api
.spendEcash(walletModalState.selectedFederation.federation_id, amount)
.then((newEcash) => {
setEcash(newEcash);
@@ -40,13 +40,7 @@ const SendEcash: React.FC = ({
console.error(error, message);
alert(t('wallet-modal.send.ecash-error', { error: message }));
});
- }, [
- gateway,
- walletModalState.selectedFederation,
- amount,
- setShowSelector,
- t,
- ]);
+ }, [api, walletModalState.selectedFederation, amount, setShowSelector, t]);
if (showEcash) {
return (
diff --git a/apps/gateway-ui/src/components/walletModal/send/SendLightning.tsx b/apps/router/src/gateway-ui/components/walletModal/send/SendLightning.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/walletModal/send/SendLightning.tsx
rename to apps/router/src/gateway-ui/components/walletModal/send/SendLightning.tsx
diff --git a/apps/gateway-ui/src/components/walletModal/send/SendOnchain.tsx b/apps/router/src/gateway-ui/components/walletModal/send/SendOnchain.tsx
similarity index 94%
rename from apps/gateway-ui/src/components/walletModal/send/SendOnchain.tsx
rename to apps/router/src/gateway-ui/components/walletModal/send/SendOnchain.tsx
index a75eebf05..f0fbee450 100644
--- a/apps/gateway-ui/src/components/walletModal/send/SendOnchain.tsx
+++ b/apps/router/src/gateway-ui/components/walletModal/send/SendOnchain.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useContext } from 'react';
+import React, { useState } from 'react';
import {
Flex,
Input,
@@ -12,8 +12,8 @@ import { WalletModalState } from '../WalletModal';
import { FederationInfo, Sats } from '@fedimint/types';
import FederationSelector from '../FederationSelector';
import { AmountInput } from '..';
-import { ApiContext } from '../../../ApiProvider';
import SendOnchainSuccess from './SendOnchainSuccess';
+import { useGatewayApi } from '../../../../context/hooks';
interface SendOnchainProps {
federations: FederationInfo[];
@@ -29,7 +29,7 @@ const SendOnchain: React.FC = ({
setShowSelector,
}) => {
const { t } = useTranslation();
- const { gateway } = useContext(ApiContext);
+ const api = useGatewayApi();
const [bitcoinAddress, setBitcoinAddress] = useState('');
const [amountSats, setAmountSats] = useState(0 as Sats);
const [successTxid, setSuccessTxid] = useState(null);
@@ -67,7 +67,7 @@ const SendOnchain: React.FC = ({
}
try {
- const txid = await gateway.submitPegOut({
+ const txid = await api.submitPegOut({
federationId: walletModalState.selectedFederation.federation_id,
satAmountOrAll: amountSats,
address: bitcoinAddress,
diff --git a/apps/gateway-ui/src/components/walletModal/send/SendOnchainSuccess.tsx b/apps/router/src/gateway-ui/components/walletModal/send/SendOnchainSuccess.tsx
similarity index 100%
rename from apps/gateway-ui/src/components/walletModal/send/SendOnchainSuccess.tsx
rename to apps/router/src/gateway-ui/components/walletModal/send/SendOnchainSuccess.tsx
diff --git a/apps/gateway-ui/src/languages/ca.json b/apps/router/src/gateway-ui/languages/ca.json
similarity index 100%
rename from apps/gateway-ui/src/languages/ca.json
rename to apps/router/src/gateway-ui/languages/ca.json
diff --git a/apps/gateway-ui/src/languages/de.json b/apps/router/src/gateway-ui/languages/de.json
similarity index 100%
rename from apps/gateway-ui/src/languages/de.json
rename to apps/router/src/gateway-ui/languages/de.json
diff --git a/apps/gateway-ui/src/languages/en.json b/apps/router/src/gateway-ui/languages/en.json
similarity index 100%
rename from apps/gateway-ui/src/languages/en.json
rename to apps/router/src/gateway-ui/languages/en.json
diff --git a/apps/gateway-ui/src/languages/es.json b/apps/router/src/gateway-ui/languages/es.json
similarity index 100%
rename from apps/gateway-ui/src/languages/es.json
rename to apps/router/src/gateway-ui/languages/es.json
diff --git a/apps/gateway-ui/src/languages/fr.json b/apps/router/src/gateway-ui/languages/fr.json
similarity index 100%
rename from apps/gateway-ui/src/languages/fr.json
rename to apps/router/src/gateway-ui/languages/fr.json
diff --git a/apps/gateway-ui/src/languages/hu.json b/apps/router/src/gateway-ui/languages/hu.json
similarity index 100%
rename from apps/gateway-ui/src/languages/hu.json
rename to apps/router/src/gateway-ui/languages/hu.json
diff --git a/apps/gateway-ui/src/languages/index.ts b/apps/router/src/gateway-ui/languages/index.ts
similarity index 100%
rename from apps/gateway-ui/src/languages/index.ts
rename to apps/router/src/gateway-ui/languages/index.ts
diff --git a/apps/gateway-ui/src/languages/it.json b/apps/router/src/gateway-ui/languages/it.json
similarity index 100%
rename from apps/gateway-ui/src/languages/it.json
rename to apps/router/src/gateway-ui/languages/it.json
diff --git a/apps/gateway-ui/src/languages/ja.json b/apps/router/src/gateway-ui/languages/ja.json
similarity index 100%
rename from apps/gateway-ui/src/languages/ja.json
rename to apps/router/src/gateway-ui/languages/ja.json
diff --git a/apps/gateway-ui/src/languages/ko.json b/apps/router/src/gateway-ui/languages/ko.json
similarity index 100%
rename from apps/gateway-ui/src/languages/ko.json
rename to apps/router/src/gateway-ui/languages/ko.json
diff --git a/apps/gateway-ui/src/languages/pt.json b/apps/router/src/gateway-ui/languages/pt.json
similarity index 100%
rename from apps/gateway-ui/src/languages/pt.json
rename to apps/router/src/gateway-ui/languages/pt.json
diff --git a/apps/gateway-ui/src/languages/ru.json b/apps/router/src/gateway-ui/languages/ru.json
similarity index 100%
rename from apps/gateway-ui/src/languages/ru.json
rename to apps/router/src/gateway-ui/languages/ru.json
diff --git a/apps/gateway-ui/src/languages/zh.json b/apps/router/src/gateway-ui/languages/zh.json
similarity index 100%
rename from apps/gateway-ui/src/languages/zh.json
rename to apps/router/src/gateway-ui/languages/zh.json
diff --git a/apps/gateway-ui/src/react-app-env.d.ts b/apps/router/src/gateway-ui/react-app-env.d.ts
similarity index 100%
rename from apps/gateway-ui/src/react-app-env.d.ts
rename to apps/router/src/gateway-ui/react-app-env.d.ts
diff --git a/apps/gateway-ui/src/setupTests.ts b/apps/router/src/gateway-ui/setupTests.ts
similarity index 100%
rename from apps/gateway-ui/src/setupTests.ts
rename to apps/router/src/gateway-ui/setupTests.ts
diff --git a/apps/router/src/gateway-ui/types.ts b/apps/router/src/gateway-ui/types.ts
new file mode 100644
index 000000000..4de45fbeb
--- /dev/null
+++ b/apps/router/src/gateway-ui/types.ts
@@ -0,0 +1,59 @@
+import { GatewayBalances, GatewayInfo } from '@fedimint/types';
+import { Unit } from './Gateway';
+
+export type GatewayConfig = {
+ baseUrl: string;
+};
+
+export enum GatewayStatus {
+ Loading,
+ Initializing,
+ Configuring,
+ Connected,
+ Running,
+ Disconnected,
+}
+
+export interface GatewayAppState {
+ status: GatewayStatus;
+ needsAuth: boolean;
+ gatewayError: string | undefined;
+ balances: GatewayBalances | null;
+ gatewayInfo: GatewayInfo | null;
+ unit: Unit;
+}
+
+export enum GATEWAY_APP_ACTION_TYPE {
+ SET_STATUS = 'SET_STATUS',
+ SET_NEEDS_AUTH = 'SET_NEEDS_AUTH',
+ SET_ERROR = 'SET_ERROR',
+ SET_BALANCES = 'SET_BALANCES',
+ SET_GATEWAY_INFO = 'SET_GATEWAY_INFO',
+ SET_UNIT = 'SET_UNIT',
+}
+
+export type GatewayAppAction =
+ | {
+ type: GATEWAY_APP_ACTION_TYPE.SET_STATUS;
+ payload: GatewayStatus;
+ }
+ | {
+ type: GATEWAY_APP_ACTION_TYPE.SET_NEEDS_AUTH;
+ payload: boolean;
+ }
+ | {
+ type: GATEWAY_APP_ACTION_TYPE.SET_ERROR;
+ payload: string;
+ }
+ | {
+ type: GATEWAY_APP_ACTION_TYPE.SET_BALANCES;
+ payload: GatewayBalances;
+ }
+ | {
+ type: GATEWAY_APP_ACTION_TYPE.SET_GATEWAY_INFO;
+ payload: GatewayInfo;
+ }
+ | {
+ type: GATEWAY_APP_ACTION_TYPE.SET_UNIT;
+ payload: Unit;
+ };
diff --git a/apps/gateway-ui/src/typings/i18next.d.ts b/apps/router/src/gateway-ui/typings/i18next.d.ts
similarity index 100%
rename from apps/gateway-ui/src/typings/i18next.d.ts
rename to apps/router/src/gateway-ui/typings/i18next.d.ts
diff --git a/apps/gateway-ui/src/utils/index.ts b/apps/router/src/gateway-ui/utils/index.ts
similarity index 100%
rename from apps/gateway-ui/src/utils/index.ts
rename to apps/router/src/gateway-ui/utils/index.ts
diff --git a/apps/router/src/guardian-ui/Guardian.tsx b/apps/router/src/guardian-ui/Guardian.tsx
new file mode 100644
index 000000000..3e7927769
--- /dev/null
+++ b/apps/router/src/guardian-ui/Guardian.tsx
@@ -0,0 +1,88 @@
+import React, { useMemo } from 'react';
+import { Box, Flex, Spinner, Heading, Text, Center } from '@chakra-ui/react';
+import { Login } from '@fedimint/ui';
+import { SetupContextProvider } from '../context/guardian/SetupContext';
+import { AdminContextProvider } from '../context/guardian/AdminContext';
+import { FederationSetup } from './setup/FederationSetup';
+import { FederationAdmin } from './admin/FederationAdmin';
+import { useGuardianContext, useLoadGuardian } from '../context/hooks';
+import { useTranslation } from '@fedimint/utils';
+import { GUARDIAN_APP_ACTION_TYPE, GuardianStatus } from './types';
+import { formatApiErrorMessage } from './utils/api';
+
+export const Guardian: React.FC = () => {
+ const { api, state, dispatch } = useGuardianContext();
+ useLoadGuardian();
+ const { t } = useTranslation();
+
+ const content = useMemo(() => {
+ if (state.guardianError) {
+ return (
+
+
+ {t('common.error')}
+
+ {state.guardianError}
+
+ );
+ }
+
+ if (state.needsAuth) {
+ return (
+ api.testPassword(password || '')}
+ setAuthenticated={() =>
+ dispatch({
+ type: GUARDIAN_APP_ACTION_TYPE.SET_NEEDS_AUTH,
+ payload: false,
+ })
+ }
+ parseError={formatApiErrorMessage}
+ />
+ );
+ }
+
+ if (state.status === GuardianStatus.Setup && state.initServerStatus) {
+ return (
+
+
+
+ );
+ }
+
+ if (state.status === GuardianStatus.Admin) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+