diff --git a/src/languages/de.ts b/src/languages/de.ts index 8ac304f70aad..c426efeb3ca7 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'Zurücksetzen', done: 'Fertig', more: 'Mehr', + other: 'Andere', debitCard: 'Debitkarte', bankAccount: 'Bankkonto', personalBankAccount: 'Persönliches Bankkonto', @@ -7078,8 +7079,32 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc }, hr: { title: 'Personalwesen', + connections: 'Verbindungen', subtitle: 'HR-Tools verbinden und Mitarbeitergenehmigungen synchron halten.', - settingsTitle: 'Gusto-Einstellungen', + connect: 'Verbinden', + syncNow: 'Jetzt synchronisieren', + disconnect: 'Trennen', + disconnectTitle: (providerName: string) => `${providerName} trennen`, + disconnectPrompt: (providerName: string) => `Möchten Sie ${providerName} wirklich trennen?`, + lastSync: (relativeDate: string) => `Zuletzt synchronisiert ${relativeDate}`, + syncError: (providerName: string) => `Verbindung zu ${providerName} nicht möglich`, + connectionDescription: (providerName: string) => `Verbinden Sie ${providerName}, um Mitarbeitergenehmigungen mit Ihrem Workspace zu synchronisieren.`, + approvalMode: 'Genehmigungsmodus', + finalApprover: 'Endgültige:r Genehmiger:in', + notSet: 'Nicht festgelegt', + approvalModeDescription: (providerName: string) => `Mitglieder und Manager sind für die Synchronisation mit ${providerName} eingerichtet.`, + approvalModeWarningTitle: 'Genehmigungsmodus ändern?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Möchten Sie den Genehmigungsmodus für diesen Workspace wirklich ändern? Erfahren Sie mehr über die verschiedenen ${providerName}-aktivierten Workflow-Modi auf unserer Hilfeseite.`, + approvalModeWarningConfirm: 'Genehmigungsmodus ändern', + approvalModes: { + basic: {label: 'Einfache Genehmigung', description: 'Alle Benutzer reichen zur Bearbeitung und Genehmigung bei einer einzigen Person ein.'}, + manager: { + label: 'Manager-Genehmigung', + description: (providerName: string) => `Mitarbeitende reichen Berichte bei ihrer in ${providerName} hinterlegten direkten Führungskraft ein.`, + }, + custom: {label: 'Benutzerdefinierte Genehmigung', description: 'Ich richte Genehmigungs-Workflows in Expensify manuell ein.'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7103,27 +7128,6 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc }, gusto: { title: 'Gusto', - approvalMode: 'Genehmigungsmodus', - finalApprover: 'Endgültige:r Genehmiger:in', - notSet: 'Nicht festgelegt', - approvalModeDescription: 'Mitglieder und Manager sind für die Synchronisation mit Gusto eingerichtet.', - approvalModeWarningTitle: 'Genehmigungsmodus ändern?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Möchten Sie den Genehmigungsmodus für diesen Workspace wirklich ändern? Erfahren Sie mehr über die verschiedenen Gusto-aktivierten Workflow-Modi auf unserer Hilfeseite.`, - approvalModeWarningConfirm: 'Genehmigungsmodus ändern', - approvalModes: { - basic: {label: 'Einfache Genehmigung', description: 'Alle Benutzer reichen zur Bearbeitung und Genehmigung bei einer einzigen Person ein.'}, - manager: {label: 'Managergenehmigung', description: 'Mitarbeitende reichen Berichte bei ihrer in Gusto hinterlegten direkten Führungskraft ein.'}, - custom: {label: 'Benutzerdefinierte Genehmigung', description: 'Ich richte Genehmigungs-Workflows in Expensify manuell ein.'}, - }, - connect: 'Verbinden', - connectionDescription: 'Verbinde Gusto, um Mitarbeitergenehmigungen mit deinem Workspace zu synchronisieren.', - syncNow: 'Jetzt synchronisieren', - disconnect: 'Trennen', - lastSync: (relativeDate: string) => `Zuletzt synchronisiert ${relativeDate}`, - syncError: 'Verbindung zu Gusto nicht möglich', - disconnectTitle: 'Gusto trennen', - disconnectPrompt: 'Bist du sicher, dass du Gusto trennen möchtest?', syncResults: { title: 'Gusto-Synchronisierungsergebnisse', successTitle: 'Ihre Gusto-Verbindung wurde erfolgreich synchronisiert!', @@ -7136,33 +7140,8 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc }), }, }, - merge: { - approvalMode: 'Genehmigungsmodus', - finalApprover: 'Endgültige:r Genehmiger:in', - }, zenefits: { title: 'TriNet', - connect: 'Verbinden', - syncNow: 'Jetzt synchronisieren', - disconnect: 'Verbindung trennen', - lastSync: (relativeDate: string) => `Zuletzt synchronisiert ${relativeDate}`, - syncError: 'Verbindung zu TriNet nicht möglich', - disconnectTitle: 'TriNet trennen', - disconnectPrompt: 'Sind Sie sicher, dass Sie die Verbindung zu TriNet trennen möchten?', - connectionDescription: 'Verbinden Sie TriNet, um Mitarbeitergenehmigungen mit Ihrem Workspace zu synchronisieren.', - approvalMode: 'Genehmigungsmodus', - finalApprover: 'Letzte genehmigende Person', - notSet: 'Nicht festgelegt', - approvalModeDescription: 'Mitglieder und Manager sind für die Synchronisierung mit TriNet eingerichtet.', - approvalModeWarningTitle: 'Genehmigungsmodus ändern?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Sind Sie sicher, dass Sie den Genehmigungsmodus für diesen Workspace ändern möchten? Erfahren Sie mehr über die verschiedenen TriNet-fähigen Workflow-Modi auf unserer Hilfeseite.`, - approvalModeWarningConfirm: 'Genehmigungsmodus ändern', - approvalModes: { - basic: {label: 'Einfache Genehmigung', description: 'Alle Benutzer reichen an eine einzige Person zur Bearbeitung und Genehmigung ein.'}, - manager: {label: 'Managergenehmigung', description: 'Mitarbeitende reichen Berichte bei ihrer in TriNet hinterlegten direkten Führungskraft ein.'}, - custom: {label: 'Benutzerdefinierte Genehmigung', description: 'Ich richte Genehmigungsabläufe in Expensify manuell ein.'}, - }, }, }, }, diff --git a/src/languages/en.ts b/src/languages/en.ts index bfd66782bc73..dcd723575c4e 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -270,6 +270,7 @@ const translations = { // @context Status or button indicating that an action or process has been completed. Should reflect completion. done: 'Done', more: 'More', + other: 'Other', debitCard: 'Debit card', bankAccount: 'Bank account', personalBankAccount: 'Personal bank account', @@ -6433,8 +6434,32 @@ const translations = { }, hr: { title: 'HR', + connections: 'Connections', subtitle: 'Connect HR tools and keep employee approvals in sync.', - settingsTitle: 'Gusto settings', + connect: 'Connect', + syncNow: 'Sync now', + disconnect: 'Disconnect', + disconnectTitle: (providerName: string) => `Disconnect ${providerName}`, + disconnectPrompt: (providerName: string) => `Are you sure you want to disconnect ${providerName}?`, + lastSync: (relativeDate: string) => `Last synced ${relativeDate}`, + syncError: (providerName: string) => `Can't connect to ${providerName}`, + connectionDescription: (providerName: string) => `Connect ${providerName} to keep employee approvals in sync with your workspace.`, + approvalMode: 'Approval mode', + finalApprover: 'Final approver', + notSet: 'Not set', + approvalModeDescription: (providerName: string) => `Members and managers are set up to sync with ${providerName}.`, + approvalModeWarningTitle: 'Change approval mode?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Are you sure you would like to change the approval mode for this workspace? Learn more about the different ${providerName}-enabled workflow modes in our help site.`, + approvalModeWarningConfirm: 'Change approval mode', + approvalModes: { + basic: {label: 'Basic approval', description: 'All users submit to a single person for processing and approval.'}, + manager: { + label: 'Manager approval', + description: (providerName: string) => `Employees submit reports to their direct manager configured in ${providerName}.`, + }, + custom: {label: 'Custom approval', description: "I'll manually setup approval workflows in Expensify."}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -6449,6 +6474,8 @@ const translations = { return 'Loading data from TriNet'; case 'zenefitsSyncProvisioning': return 'Provisioning employees in policy'; + case 'mergeHRSyncTitle': + return 'Synchronizing HR Employees'; case 'jobDone': return 'Waiting for imported data to load'; default: { @@ -6458,36 +6485,6 @@ const translations = { }, gusto: { title: 'Gusto', - connect: 'Connect', - syncNow: 'Sync now', - disconnect: 'Disconnect', - lastSync: (relativeDate: string) => `Last synced ${relativeDate}`, - syncError: "Can't connect to Gusto", - disconnectTitle: 'Disconnect Gusto', - disconnectPrompt: 'Are you sure you want to disconnect Gusto?', - connectionDescription: 'Connect Gusto to keep employee approvals in sync with your workspace.', - approvalMode: 'Approval mode', - finalApprover: 'Final approver', - notSet: 'Not set', - approvalModeDescription: 'Members and managers are set up to sync with Gusto.', - approvalModeWarningTitle: 'Change approval mode?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Are you sure you would like to change the approval mode for this workspace? Learn more about the different Gusto-enabled workflow modes in our help site.`, - approvalModeWarningConfirm: 'Change approval mode', - approvalModes: { - basic: { - label: 'Basic approval', - description: 'All users submit to a single person for processing and approval.', - }, - manager: { - label: 'Manager approval', - description: 'Employees submit reports to their direct manager configured in Gusto.', - }, - custom: { - label: 'Custom approval', - description: 'I’ll manually setup approval workflows in Expensify.', - }, - }, syncResults: { title: 'Gusto sync results', successTitle: 'Successfully synced your Gusto connection!', @@ -6500,42 +6497,8 @@ const translations = { }), }, }, - merge: { - approvalMode: 'Approval mode', - finalApprover: 'Final approver', - }, zenefits: { title: 'TriNet', - connect: 'Connect', - syncNow: 'Sync now', - disconnect: 'Disconnect', - lastSync: (relativeDate: string) => `Last synced ${relativeDate}`, - syncError: "Can't connect to TriNet", - disconnectTitle: 'Disconnect TriNet', - disconnectPrompt: 'Are you sure you want to disconnect TriNet?', - connectionDescription: 'Connect TriNet to keep employee approvals in sync with your workspace.', - approvalMode: 'Approval mode', - finalApprover: 'Final approver', - notSet: 'Not set', - approvalModeDescription: 'Members and managers are set up to sync with TriNet.', - approvalModeWarningTitle: 'Change approval mode?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Are you sure you would like to change the approval mode for this workspace? Learn more about the different TriNet-enabled workflow modes in our help site.`, - approvalModeWarningConfirm: 'Change approval mode', - approvalModes: { - basic: { - label: 'Basic approval', - description: 'All users submit to a single person for processing and approval.', - }, - manager: { - label: 'Manager approval', - description: 'Employees submit reports to their direct manager configured in TriNet.', - }, - custom: { - label: 'Custom approval', - description: "I'll manually setup approval workflows in Expensify.", - }, - }, }, }, export: { diff --git a/src/languages/es.ts b/src/languages/es.ts index 59d55843e76c..f57b98681fa3 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -217,6 +217,7 @@ const translations: TranslationDeepObject = { reset: 'Restablecer', done: 'Listo', more: 'Más', + other: 'Otro', debitCard: 'Tarjeta de débito', bankAccount: 'Cuenta bancaria', personalBankAccount: 'Cuenta bancaria personal', @@ -6245,8 +6246,32 @@ ${amount} para ${merchant} - ${date}`, }, hr: { title: 'HR', + connections: 'Conexiones', subtitle: 'Conecta herramientas de HR y mantén sincronizadas las aprobaciones de empleados.', - settingsTitle: 'Configuración de Gusto', + connect: 'Conectar', + syncNow: 'Sincronizar ahora', + disconnect: 'Desconectar', + disconnectTitle: (providerName: string) => `Desconectar ${providerName}`, + disconnectPrompt: (providerName: string) => `¿Seguro que quieres desconectar ${providerName}?`, + lastSync: (relativeDate: string) => `Última sincronización ${relativeDate}`, + syncError: (providerName: string) => `No se puede conectar con ${providerName}`, + connectionDescription: (providerName: string) => `Conecta ${providerName} para mantener sincronizadas las aprobaciones de empleados con tu espacio de trabajo.`, + approvalMode: 'Modo de aprobación', + finalApprover: 'Aprobador final', + notSet: 'No configurado', + approvalModeDescription: (providerName: string) => `Los miembros y gerentes están configurados para sincronizarse con ${providerName}.`, + approvalModeWarningTitle: '¿Cambiar modo de aprobación?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `¿Seguro que quieres cambiar el modo de aprobación de este espacio de trabajo? Obtén más información sobre los diferentes modos de flujo de trabajo con ${providerName} en nuestro sitio de ayuda.`, + approvalModeWarningConfirm: 'Cambiar modo de aprobación', + approvalModes: { + basic: {label: 'Aprobación básica', description: 'Todos los usuarios envían a una sola persona para su procesamiento y aprobación.'}, + manager: { + label: 'Aprobación del gerente', + description: (providerName: string) => `Los empleados envían informes a su gerente directo configurado en ${providerName}.`, + }, + custom: {label: 'Aprobación personalizada', description: 'Configuraré manualmente los flujos de aprobación en Expensify.'}, + }, syncStageName: ({stage}) => { switch (stage) { case 'gustoSyncTitle': @@ -6261,6 +6286,8 @@ ${amount} para ${merchant} - ${date}`, return 'Cargando datos desde TriNet'; case 'zenefitsSyncProvisioning': return 'Aprovisionar empleados en la política'; + case 'mergeHRSyncTitle': + return 'Sincronización de empleados de HR'; case 'jobDone': return 'Esperando a que se carguen los datos importados'; default: { @@ -6270,36 +6297,6 @@ ${amount} para ${merchant} - ${date}`, }, gusto: { title: 'Gusto', - connect: 'Conectar', - syncNow: 'Sincronizar ahora', - disconnect: 'Desconectar', - lastSync: (relativeDate) => `Última sincronización ${relativeDate}`, - syncError: 'No se puede conectar con Gusto', - disconnectTitle: 'Desconectar Gusto', - disconnectPrompt: '¿Seguro que quieres desconectar Gusto?', - connectionDescription: 'Conecta Gusto para mantener sincronizadas las aprobaciones de empleados con tu espacio de trabajo.', - approvalMode: 'Modo de aprobación', - finalApprover: 'Aprobador final', - notSet: 'No configurado', - approvalModeDescription: 'Los miembros y gerentes están configurados para sincronizarse con Gusto.', - approvalModeWarningTitle: '¿Cambiar modo de aprobación?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `¿Seguro que quieres cambiar el modo de aprobación de este espacio de trabajo? Obtén más información sobre los diferentes modos de flujo de trabajo con Gusto en nuestro sitio de ayuda.`, - approvalModeWarningConfirm: 'Cambiar modo de aprobación', - approvalModes: { - basic: { - label: 'Aprobación básica', - description: 'Todos los usuarios envían a una sola persona para su procesamiento y aprobación.', - }, - manager: { - label: 'Aprobación del gerente', - description: 'Los empleados envían informes a su gerente directo configurado en Gusto.', - }, - custom: { - label: 'Aprobación personalizada', - description: 'Configuraré manualmente los flujos de aprobación en Expensify.', - }, - }, syncResults: { title: 'Resultados de la sincronización de Gusto', successTitle: '¡Se sincronizó correctamente tu conexión con Gusto!', @@ -6312,33 +6309,8 @@ ${amount} para ${merchant} - ${date}`, }), }, }, - merge: { - approvalMode: 'Modo de aprobación', - finalApprover: 'Aprobador final', - }, zenefits: { title: 'TriNet', - connect: 'Conectar', - syncNow: 'Sincronizar ahora', - disconnect: 'Desconectar', - lastSync: (relativeDate: string) => `Última sincronización ${relativeDate}`, - syncError: 'No se puede conectar con TriNet', - disconnectTitle: 'Desconectar TriNet', - disconnectPrompt: '¿Seguro que quieres desconectar TriNet?', - connectionDescription: 'Conecta TriNet para mantener las aprobaciones de empleados sincronizadas con tu espacio de trabajo.', - approvalMode: 'Modo de aprobación', - finalApprover: 'Aprobador final', - notSet: 'No establecido', - approvalModeDescription: 'Los miembros y gestores están configurados para sincronizarse con TriNet.', - approvalModeWarningTitle: '¿Cambiar el modo de aprobación?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `¿Seguro que quieres cambiar el modo de aprobación de este espacio de trabajo? Obtén más información sobre los distintos modos de flujo de trabajo habilitados por TriNet en nuestro sitio de ayuda.`, - approvalModeWarningConfirm: 'Cambiar el modo de aprobación', - approvalModes: { - basic: {label: 'Aprobación básica', description: 'Todos los usuarios envían a una sola persona para su procesamiento y aprobación.'}, - manager: {label: 'Aprobación del responsable', description: 'Los empleados envían informes a su responsable directo configurado en TriNet.'}, - custom: {label: 'Aprobación personalizada', description: 'Configuraré manualmente los flujos de aprobación en Expensify.'}, - }, }, }, export: { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 4ec6dad932ff..78e6cd917c12 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'Réinitialiser', done: 'Terminé', more: 'Plus', + other: 'Autre', debitCard: 'Carte de débit', bankAccount: 'Compte bancaire', personalBankAccount: 'Compte bancaire personnel', @@ -7100,8 +7101,38 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e }, hr: { title: 'RH', + connections: 'Connexions', subtitle: 'Connectez vos outils RH et gardez les approbations des employés synchronisées.', - settingsTitle: 'Paramètres Gusto', + connect: 'Connecter', + syncNow: 'Synchroniser maintenant', + disconnect: 'Déconnecter', + disconnectTitle: (providerName: string) => `Déconnecter ${providerName}`, + disconnectPrompt: (providerName: string) => `Êtes-vous sûr de vouloir déconnecter ${providerName} ?`, + lastSync: (relativeDate: string) => `Dernière synchronisation ${relativeDate}`, + syncError: (providerName: string) => `Impossible de se connecter à ${providerName}`, + connectionDescription: (providerName: string) => `Connectez ${providerName} pour synchroniser les approbations des employés avec votre espace de travail.`, + approvalMode: "Mode d'approbation", + finalApprover: 'Approbateur final', + notSet: 'Non défini', + approvalModeDescription: (providerName: string) => `Les membres et les responsables sont configurés pour se synchroniser avec ${providerName}.`, + approvalModeWarningTitle: 'Changer le mode d’approbation ?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Êtes-vous sûr·e de vouloir modifier le mode d’approbation de cet espace de travail ? En savoir plus sur les différents modes de workflow compatibles avec ${providerName} sur notre site d’aide.`, + approvalModeWarningConfirm: 'Modifier le mode d’approbation', + approvalModes: { + basic: { + label: 'Approbation simple', + description: 'Tous les utilisateurs soumettent à une seule personne pour traitement et approbation.', + }, + manager: { + label: 'Approbation du responsable', + description: (providerName: string) => `Les employé·e·s soumettent leurs rapports à leur responsable direct configuré dans ${providerName}.`, + }, + custom: { + label: 'Approbation personnalisée', + description: 'Je configurerai manuellement les circuits de validation dans Expensify.', + }, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7125,27 +7156,6 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e }, gusto: { title: 'Gusto', - approvalMode: 'Mode d’approbation', - finalApprover: 'Approbateur final', - notSet: 'Non défini', - approvalModeDescription: 'Les membres et les responsables sont configurés pour se synchroniser avec Gusto.', - approvalModeWarningTitle: 'Changer le mode d’approbation ?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Êtes-vous sûr·e de vouloir modifier le mode d’approbation de cet espace de travail ? En savoir plus sur les différents modes de workflow compatibles avec Gusto sur notre site d’aide.`, - approvalModeWarningConfirm: 'Modifier le mode d’approbation', - approvalModes: { - basic: {label: 'Approbation simple', description: 'Tous les utilisateurs soumettent à une seule personne pour traitement et approbation.'}, - manager: {label: 'Approbation du responsable', description: 'Les employé·e·s soumettent leurs rapports à leur responsable direct configuré dans Gusto.'}, - custom: {label: 'Approbation personnalisée', description: 'Je configurerai manuellement les circuits de validation dans Expensify.'}, - }, - connect: 'Connect', - connectionDescription: 'Connectez Gusto pour synchroniser les validations des employé·e·s avec votre espace de travail.', - syncNow: 'Synchroniser maintenant', - disconnect: 'Déconnecter', - lastSync: (relativeDate: string) => `Dernière synchronisation ${relativeDate}`, - syncError: 'Impossible de se connecter à Gusto', - disconnectTitle: 'Déconnecter Gusto', - disconnectPrompt: 'Voulez-vous vraiment déconnecter Gusto ?', syncResults: { title: 'Résultats de la synchronisation Gusto', successTitle: 'Connexion Gusto synchronisée avec succès !', @@ -7158,33 +7168,8 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e }), }, }, - merge: { - approvalMode: 'Mode d’approbation', - finalApprover: 'Approbateur final', - }, zenefits: { title: 'TriNet', - connect: 'Connecter', - syncNow: 'Synchroniser maintenant', - disconnect: 'Déconnecter', - lastSync: (relativeDate: string) => `Dernière synchronisation ${relativeDate}`, - syncError: 'Impossible de se connecter à TriNet', - disconnectTitle: 'Déconnecter TriNet', - disconnectPrompt: 'Voulez-vous vraiment déconnecter TriNet ?', - connectionDescription: 'Connectez TriNet pour synchroniser les approbations des employés avec votre espace de travail.', - approvalMode: 'Mode d’approbation', - finalApprover: 'Approbateur final', - notSet: 'Non défini', - approvalModeDescription: 'Les membres et les responsables sont configurés pour se synchroniser avec TriNet.', - approvalModeWarningTitle: 'Changer le mode d’approbation ?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Voulez-vous vraiment modifier le mode d’approbation de cet espace de travail ? En savoir plus sur les différents modes de workflow compatibles TriNet sur notre site d’aide.`, - approvalModeWarningConfirm: 'Modifier le mode d’approbation', - approvalModes: { - basic: {label: 'Approbation de base', description: 'Tous les utilisateurs soumettent à une seule personne pour traitement et approbation.'}, - manager: {label: 'Approbation du responsable', description: 'Les employés soumettent des notes de frais à leur supérieur hiérarchique direct configuré dans TriNet.'}, - custom: {label: 'Approbation personnalisée', description: 'Je configurerai manuellement les workflows d’approbation dans Expensify.'}, - }, }, }, }, diff --git a/src/languages/it.ts b/src/languages/it.ts index 7caa746dda7c..6e04ab1376fa 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'Reimposta', done: 'Completato', more: 'Altro', + other: 'Altro', debitCard: 'Carta di debito', bankAccount: 'Conto bancario', personalBankAccount: 'Conto bancario personale', @@ -7064,8 +7065,32 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, }, hr: { title: 'Risorse umane', + connections: 'Connessioni', subtitle: 'Collega gli strumenti HR e mantieni sincronizzate le approvazioni dei dipendenti.', - settingsTitle: 'Impostazioni Gusto', + connect: 'Connetti', + syncNow: 'Sincronizza ora', + disconnect: 'Disconnetti', + disconnectTitle: (providerName: string) => `Disconnetti ${providerName}`, + disconnectPrompt: (providerName: string) => `Sei sicuro di voler disconnettere ${providerName}?`, + lastSync: (relativeDate: string) => `Ultima sincronizzazione ${relativeDate}`, + syncError: (providerName: string) => `Impossibile connettersi a ${providerName}`, + connectionDescription: (providerName: string) => `Collega ${providerName} per mantenere sincronizzate le approvazioni dei dipendenti con il tuo spazio di lavoro.`, + approvalMode: 'Modalità di approvazione', + finalApprover: 'Approvatore finale', + notSet: 'Non impostato', + approvalModeDescription: (providerName: string) => `I membri e i responsabili sono configurati per la sincronizzazione con ${providerName}.`, + approvalModeWarningTitle: 'Cambiare modalità di approvazione?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Sei sicuro di voler cambiare la modalità di approvazione per questo spazio di lavoro? Scopri di più sulle diverse modalità di flusso di lavoro abilitate per ${providerName} nel nostro sito di assistenza.`, + approvalModeWarningConfirm: 'Cambia modalità di approvazione', + approvalModes: { + basic: {label: 'Approvazione di base', description: 'Tutti gli utenti inviano a una singola persona per l’elaborazione e l’approvazione.'}, + manager: { + label: 'Approvazione del responsabile', + description: (providerName: string) => `I dipendenti inviano i report al proprio responsabile diretto configurato in ${providerName}.`, + }, + custom: {label: 'Approvazione personalizzata', description: 'Imposterò manualmente i flussi di approvazione in Expensify.'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7089,27 +7114,6 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, }, gusto: { title: 'Gusto', - approvalMode: 'Modalità approvazione', - finalApprover: 'Approvazione finale', - notSet: 'Non impostato', - approvalModeDescription: 'I membri e i responsabili sono configurati per la sincronizzazione con Gusto.', - approvalModeWarningTitle: 'Cambiare modalità di approvazione?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Sei sicuro di voler cambiare la modalità di approvazione per questo spazio di lavoro? Scopri di più sulle diverse modalità di flusso di lavoro abilitate per Gusto nel nostro sito di assistenza.`, - approvalModeWarningConfirm: 'Cambia modalità di approvazione', - approvalModes: { - basic: {label: 'Approvazione di base', description: 'Tutti gli utenti inviano a una singola persona per l’elaborazione e l’approvazione.'}, - manager: {label: 'Approvazione del responsabile', description: 'I dipendenti inviano i report al proprio responsabile diretto configurato in Gusto.'}, - custom: {label: 'Approvazione personalizzata', description: 'Imposterò manualmente i flussi di approvazione in Expensify.'}, - }, - connect: 'Collega', - connectionDescription: 'Collega Gusto per sincronizzare le approvazioni dei dipendenti con il tuo spazio di lavoro.', - syncNow: 'Sincronizza ora', - disconnect: 'Disconnetti', - lastSync: (relativeDate: string) => `Ultima sincronizzazione ${relativeDate}`, - syncError: 'Impossibile connettersi a Gusto', - disconnectTitle: 'Disconnetti Gusto', - disconnectPrompt: 'Sei sicuro di voler disconnettere Gusto?', syncResults: { title: 'Risultati sincronizzazione Gusto', successTitle: 'Connessione a Gusto sincronizzata con successo!', @@ -7122,33 +7126,8 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, }), }, }, - merge: { - approvalMode: 'Modalità approvazione', - finalApprover: 'Approvazione finale', - }, zenefits: { title: 'TriNet', - connect: 'Connetti', - syncNow: 'Sincronizza ora', - disconnect: 'Disconnetti', - lastSync: (relativeDate: string) => `Ultima sincronizzazione ${relativeDate}`, - syncError: 'Impossibile connettersi a TriNet', - disconnectTitle: 'Disconnetti TriNet', - disconnectPrompt: 'Sei sicuro di voler disconnettere TriNet?', - connectionDescription: 'Collega TriNet per mantenere sincronizzate le approvazioni dei dipendenti con il tuo spazio di lavoro.', - approvalMode: 'Modalità approvazione', - finalApprover: 'Responsabile finale approvazione', - notSet: 'Non impostato', - approvalModeDescription: 'Membri e responsabili sono configurati per sincronizzarsi con TriNet.', - approvalModeWarningTitle: 'Cambiare modalità di approvazione?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Sei sicuro di voler cambiare la modalità di approvazione per questo workspace? Scopri di più sulle diverse modalità di workflow abilitate per TriNet nel nostro sito di assistenza.`, - approvalModeWarningConfirm: 'Modifica modalità di approvazione', - approvalModes: { - basic: {label: 'Approvazione di base', description: 'Tutti gli utenti inviano a una sola persona per l’elaborazione e l’approvazione.'}, - manager: {label: 'Approvazione del manager', description: 'I dipendenti inviano i report al loro responsabile diretto configurato in TriNet.'}, - custom: {label: 'Approvazione personalizzata', description: 'Imposterò manualmente i flussi di approvazione in Expensify.'}, - }, }, }, }, diff --git a/src/languages/ja.ts b/src/languages/ja.ts index c191fbf38b2f..c8b40f50c116 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'リセット', done: '完了', more: 'その他', + other: 'その他', debitCard: 'デビットカード', bankAccount: '銀行口座', personalBankAccount: '個人銀行口座', @@ -6986,8 +6987,32 @@ ${reportName} }, hr: { title: '人事', + connections: '接続', subtitle: '人事ツールを連携して、従業員の承認を常に同期させます。', - settingsTitle: 'Gusto 設定', + connect: '接続', + syncNow: '今すぐ同期', + disconnect: '切断', + disconnectTitle: (providerName: string) => `${providerName}を切断`, + disconnectPrompt: (providerName: string) => `${providerName}を切断してもよろしいですか?`, + lastSync: (relativeDate: string) => `最終同期: ${relativeDate}`, + syncError: (providerName: string) => `${providerName}に接続できません`, + connectionDescription: (providerName: string) => `${providerName}を接続して、従業員の承認をワークスペースと同期させましょう。`, + approvalMode: '承認モード', + finalApprover: '最終承認者', + notSet: '未設定', + approvalModeDescription: (providerName: string) => `メンバーとマネージャーは ${providerName} と同期するように設定されています。`, + approvalModeWarningTitle: '承認モードを変更しますか?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `このワークスペースの承認モードを変更してもよろしいですか?${providerName} 対応の各ワークフローモードについては、ヘルプサイトで詳しくご覧いただけます。`, + approvalModeWarningConfirm: '承認モードを変更', + approvalModes: { + basic: {label: '基本承認', description: 'すべてのユーザーは、処理と承認のために 1 人の担当者に提出します。'}, + manager: { + label: 'マネージャー承認', + description: (providerName: string) => `従業員は、${providerName} で設定された直属のマネージャーにレポートを提出します。`, + }, + custom: {label: 'カスタム承認', description: 'Expensify で承認ワークフローを手動で設定します。'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7011,27 +7036,6 @@ ${reportName} }, gusto: { title: 'Gusto', - approvalMode: '承認モード', - finalApprover: '最終承認者', - notSet: '未設定', - approvalModeDescription: 'メンバーとマネージャーは Gusto と同期するように設定されています。', - approvalModeWarningTitle: '承認モードを変更しますか?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `このワークスペースの承認モードを変更してもよろしいですか?Gusto 対応の各ワークフローモードについては、ヘルプサイトで詳しくご覧いただけます。`, - approvalModeWarningConfirm: '承認モードを変更', - approvalModes: { - basic: {label: '基本承認', description: 'すべてのユーザーは、処理と承認のために 1 人の担当者に提出します。'}, - manager: {label: 'マネージャー承認', description: '従業員は、Gusto で設定された直属のマネージャーにレポートを提出します。'}, - custom: {label: 'カスタム承認', description: 'Expensify で承認ワークフローを手動で設定します。'}, - }, - connect: '接続', - connectionDescription: 'Gusto を接続して、従業員の承認をワークスペースと同期させましょう。', - syncNow: '今すぐ同期', - disconnect: '切断', - lastSync: (relativeDate: string) => `最終同期:${relativeDate}`, - syncError: 'Gusto に接続できません', - disconnectTitle: 'Gusto の接続を解除', - disconnectPrompt: 'Gusto との接続を本当に解除しますか?', syncResults: { title: 'Gusto 同期結果', successTitle: 'Gusto との連携が正常に同期されました!', @@ -7044,33 +7048,8 @@ ${reportName} }), }, }, - merge: { - approvalMode: '承認モード', - finalApprover: '最終承認者', - }, zenefits: { title: 'TriNet', - connect: '接続', - syncNow: '今すぐ同期', - disconnect: '切断する', - lastSync: (relativeDate: string) => `最終同期日時:${relativeDate}`, - syncError: 'TriNet に接続できません', - disconnectTitle: 'TriNet の接続を解除', - disconnectPrompt: 'TriNet との接続を解除してもよろしいですか?', - connectionDescription: 'TriNet を接続して、従業員の承認をワークスペースと同期させましょう。', - approvalMode: '承認モード', - finalApprover: '最終承認者', - notSet: '未設定', - approvalModeDescription: 'メンバーとマネージャーは TriNet と同期するように設定されています。', - approvalModeWarningTitle: '承認モードを変更しますか?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `このワークスペースの承認モードを本当に変更してもよろしいですか?TriNet に対応した各種ワークフローモードの詳細は、ヘルプサイトをご覧ください。`, - approvalModeWarningConfirm: '承認モードを変更', - approvalModes: { - basic: {label: '基本承認', description: 'すべてのユーザーが、処理と承認のために 1 人の担当者へ経費を提出します。'}, - manager: {label: 'マネージャー承認', description: '従業員は、TriNet で設定された直属のマネージャーにレポートを提出します。'}, - custom: {label: 'カスタム承認', description: 'Expensify で承認ワークフローを手動で設定します。'}, - }, }, }, }, diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 107b8f440280..ce2a913de53c 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'Opnieuw instellen', done: 'Klaar', more: 'Meer', + other: 'Overig', debitCard: 'Debetkaart', bankAccount: 'Bankrekening', personalBankAccount: 'Persoonlijke bankrekening', @@ -7041,8 +7042,32 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, }, hr: { title: 'HR', + connections: 'Verbindingen', subtitle: 'Koppel HR-tools en houd goedkeuringen van medewerkers gesynchroniseerd.', - settingsTitle: 'Gusto-instellingen', + connect: 'Verbinden', + syncNow: 'Nu synchroniseren', + disconnect: 'Ontkoppelen', + disconnectTitle: (providerName: string) => `${providerName} ontkoppelen`, + disconnectPrompt: (providerName: string) => `Weet je zeker dat je ${providerName} wilt ontkoppelen?`, + lastSync: (relativeDate: string) => `Laatst gesynchroniseerd ${relativeDate}`, + syncError: (providerName: string) => `Kan geen verbinding maken met ${providerName}`, + connectionDescription: (providerName: string) => `Verbind ${providerName} om goedkeuringen van werknemers gesynchroniseerd te houden met je werkruimte.`, + approvalMode: 'Goedkeuringsmodus', + finalApprover: 'Eindgoedkeurder', + notSet: 'Niet ingesteld', + approvalModeDescription: (providerName: string) => `Leden en managers zijn ingesteld om te synchroniseren met ${providerName}.`, + approvalModeWarningTitle: 'Goedkeuringsmodus wijzigen?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Weet je zeker dat je de goedkeuringsmodus voor deze werkruimte wilt wijzigen? Lees meer over de verschillende ${providerName}-ondersteunde workflowmodi op onze help-site.`, + approvalModeWarningConfirm: 'Goedkeuringsmodus wijzigen', + approvalModes: { + basic: {label: 'Basisgoedkeuring', description: 'Alle gebruikers dienen bij één persoon in voor verwerking en goedkeuring.'}, + manager: { + label: 'Managergoedkeuring', + description: (providerName: string) => `Werknemers dienen rapporten in bij hun direct leidinggevende die is ingesteld in ${providerName}.`, + }, + custom: {label: 'Aangepaste goedkeuring', description: 'Ik stel goedkeuringsworkflows handmatig in in Expensify.'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7066,27 +7091,6 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, }, gusto: { title: 'Gusto', - approvalMode: 'Goedkeuringsmodus', - finalApprover: 'Laatste fiatteur', - notSet: 'Niet ingesteld', - approvalModeDescription: 'Leden en managers zijn ingesteld om te synchroniseren met Gusto.', - approvalModeWarningTitle: 'Goedkeuringsmodus wijzigen?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Weet je zeker dat je de goedkeuringsmodus voor deze werkruimte wilt wijzigen? Lees meer over de verschillende Gusto-ondersteunde workflowmodi op onze help-site.`, - approvalModeWarningConfirm: 'Goedkeuringsmodus wijzigen', - approvalModes: { - basic: {label: 'Basisgoedkeuring', description: 'Alle gebruikers dienen bij één persoon in voor verwerking en goedkeuring.'}, - manager: {label: 'Goedkeuring manager', description: 'Werknemers dienen rapporten in bij hun direct leidinggevende die is ingesteld in Gusto.'}, - custom: {label: 'Aangepaste goedkeuring', description: 'Ik stel goedkeuringsworkflows handmatig in in Expensify.'}, - }, - connect: 'Verbinden', - connectionDescription: 'Verbind Gusto om goedkeuringen van werknemers gesynchroniseerd te houden met je workspace.', - syncNow: 'Nu synchroniseren', - disconnect: 'Verbreken', - lastSync: (relativeDate: string) => `Laatste synchronisatie ${relativeDate}`, - syncError: 'Kan geen verbinding maken met Gusto', - disconnectTitle: 'Verbinding met Gusto verbreken', - disconnectPrompt: 'Weet je zeker dat je de verbinding met Gusto wilt verbreken?', syncResults: { title: 'Gusto-synchronisatieresultaten', successTitle: 'Je Gusto-verbinding is succesvol gesynchroniseerd!', @@ -7099,33 +7103,8 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, }), }, }, - merge: { - approvalMode: 'Goedkeuringsmodus', - finalApprover: 'Laatste fiatteur', - }, zenefits: { title: 'TriNet', - connect: 'Verbinden', - syncNow: 'Nu synchroniseren', - disconnect: 'Verbinding verbreken', - lastSync: (relativeDate: string) => `Laatst gesynchroniseerd ${relativeDate}`, - syncError: 'Kan geen verbinding maken met TriNet', - disconnectTitle: 'Koppeling met TriNet verbreken', - disconnectPrompt: 'Weet je zeker dat je TriNet wilt loskoppelen?', - connectionDescription: 'Verbind TriNet om goedkeuringen van medewerkers synchroon te houden met je werkruimte.', - approvalMode: 'Goedkeuringsmodus', - finalApprover: 'Laatste fiatteur', - notSet: 'Niet ingesteld', - approvalModeDescription: 'Leden en managers zijn ingesteld om te synchroniseren met TriNet.', - approvalModeWarningTitle: 'Goedkeuringsmodus wijzigen?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Weet je zeker dat je de goedkeuringsmodus voor deze workspace wilt wijzigen? Lees meer over de verschillende TriNet-ondersteunde workflowmodi op onze help-pagina.`, - approvalModeWarningConfirm: 'Goedkeuringsmodus wijzigen', - approvalModes: { - basic: {label: 'Eenvoudige goedkeuring', description: 'Alle gebruikers dienen in bij één persoon voor verwerking en goedkeuring.'}, - manager: {label: 'Goedkeuring door manager', description: 'Werknemers dienen rapporten in bij hun direct leidinggevende die is ingesteld in TriNet.'}, - custom: {label: 'Aangepaste goedkeuring', description: 'Ik stel handmatig goedkeuringsworkflows in Expensify in.'}, - }, }, }, }, diff --git a/src/languages/pl.ts b/src/languages/pl.ts index af6f01873175..821b725e378d 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'Reset', done: 'Gotowe', more: 'Więcej', + other: 'Inne', debitCard: 'Karta debetowa', bankAccount: 'Konto bankowe', personalBankAccount: 'Prywatne konto bankowe', @@ -7035,8 +7036,32 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, }, hr: { title: 'HR', + connections: 'Połączenia', subtitle: 'Połącz narzędzia HR i utrzymuj zgody pracowników w synchronizacji.', - settingsTitle: 'Ustawienia Gusto', + connect: 'Połącz', + syncNow: 'Synchronizuj teraz', + disconnect: 'Odłącz', + disconnectTitle: (providerName: string) => `Odłącz ${providerName}`, + disconnectPrompt: (providerName: string) => `Czy na pewno chcesz odłączyć ${providerName}?`, + lastSync: (relativeDate: string) => `Ostatnia synchronizacja ${relativeDate}`, + syncError: (providerName: string) => `Nie można połączyć z ${providerName}`, + connectionDescription: (providerName: string) => `Połącz ${providerName}, aby synchronizować akceptacje pracowników z Twoim miejscem pracy.`, + approvalMode: 'Tryb zatwierdzania', + finalApprover: 'Ostateczny zatwierdzający', + notSet: 'Nie ustawiono', + approvalModeDescription: (providerName: string) => `Członkowie i menedżerowie są skonfigurowani do synchronizacji z ${providerName}.`, + approvalModeWarningTitle: 'Zmienić tryb zatwierdzania?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Czy na pewno chcesz zmienić tryb zatwierdzania dla tego obszaru roboczego? Dowiedz się więcej o różnych trybach przepływu pracy obsługiwanych przez ${providerName} w naszej witrynie pomocy.`, + approvalModeWarningConfirm: 'Zmień tryb zatwierdzania', + approvalModes: { + basic: {label: 'Podstawowe zatwierdzanie', description: 'Wszyscy użytkownicy przesyłają wydatki do jednej osoby w celu ich przetworzenia i zatwierdzenia.'}, + manager: { + label: 'Zatwierdzanie przez menedżera', + description: (providerName: string) => `Pracownicy przesyłają raporty do swojego bezpośredniego menedżera skonfigurowanego w ${providerName}.`, + }, + custom: {label: 'Niestandardowe zatwierdzanie', description: 'Ręcznie skonfiguruję procesy zatwierdzania w Expensify.'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7060,27 +7085,6 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, }, gusto: { title: 'Gusto', - approvalMode: 'Tryb zatwierdzania', - finalApprover: 'Ostateczny zatwierdzający', - notSet: 'Nie ustawiono', - approvalModeDescription: 'Członkowie i menedżerowie są skonfigurowani do synchronizacji z Gusto.', - approvalModeWarningTitle: 'Zmienić tryb zatwierdzania?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Czy na pewno chcesz zmienić tryb zatwierdzania dla tego obszaru roboczego? Dowiedz się więcej o różnych trybach przepływu pracy obsługiwanych przez Gusto w naszej witrynie pomocy.`, - approvalModeWarningConfirm: 'Zmień tryb zatwierdzania', - approvalModes: { - basic: {label: 'Podstawowa akceptacja', description: 'Wszyscy użytkownicy przesyłają wydatki do jednej osoby w celu ich przetworzenia i zatwierdzenia.'}, - manager: {label: 'Zatwierdzenie przez menedżera', description: 'Pracownicy przesyłają raporty do swojego bezpośredniego menedżera skonfigurowanego w Gusto.'}, - custom: {label: 'Niestandardowa akceptacja', description: 'Ręcznie skonfiguruję procesy zatwierdzania w Expensify.'}, - }, - connect: 'Połącz', - connectionDescription: 'Połącz Gusto, aby synchronizować akceptacje pracowników z Twoim miejscem pracy.', - syncNow: 'Synchronizuj teraz', - disconnect: 'Odłącz', - lastSync: (relativeDate: string) => `Ostatnia synchronizacja: ${relativeDate}`, - syncError: 'Nie można połączyć się z Gusto', - disconnectTitle: 'Odłącz Gusto', - disconnectPrompt: 'Czy na pewno chcesz odłączyć Gusto?', syncResults: { title: 'Wyniki synchronizacji Gusto', successTitle: 'Pomyślnie zsynchronizowano Twoje połączenie z Gusto!', @@ -7093,33 +7097,8 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, }), }, }, - merge: { - approvalMode: 'Tryb zatwierdzania', - finalApprover: 'Ostateczny zatwierdzający', - }, zenefits: { title: 'TriNet', - connect: 'Połącz', - syncNow: 'Synchronizuj teraz', - disconnect: 'Odłącz', - lastSync: (relativeDate: string) => `Ostatnia synchronizacja: ${relativeDate}`, - syncError: 'Nie można połączyć się z TriNet', - disconnectTitle: 'Odłącz TriNet', - disconnectPrompt: 'Czy na pewno chcesz odłączyć TriNet?', - connectionDescription: 'Połącz TriNet, żeby utrzymywać zatwierdzenia pracowników w synchronizacji z twoim workspace’em.', - approvalMode: 'Tryb zatwierdzania', - finalApprover: 'Ostateczny zatwierdzający', - notSet: 'Nie ustawiono', - approvalModeDescription: 'Członkowie i menedżerowie są skonfigurowani do synchronizacji z TriNet.', - approvalModeWarningTitle: 'Zmienić tryb zatwierdzania?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Czy na pewno chcesz zmienić tryb zatwierdzania dla tego workspace? Dowiedz się więcej o różnych trybach workflow obsługiwanych przez TriNet na naszej stronie pomocy.`, - approvalModeWarningConfirm: 'Zmień tryb akceptacji', - approvalModes: { - basic: {label: 'Podstawowa akceptacja', description: 'Wszyscy użytkownicy przesyłają wydatki do jednej osoby w celu ich przetworzenia i zatwierdzenia.'}, - manager: {label: 'Akceptacja przez menedżera', description: 'Pracownicy składają raporty do swojego bezpośredniego przełożonego skonfigurowanego w TriNet.'}, - custom: {label: 'Niestandardowe zatwierdzanie', description: 'Ręcznie skonfiguruję przepływy akceptacji w Expensify.'}, - }, }, }, }, diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 75592a0d4982..9662a9caa1f1 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: 'Redefinir', done: 'Concluído', more: 'Mais', + other: 'Outro', debitCard: 'Cartão de débito', bankAccount: 'Conta bancária', personalBankAccount: 'Conta bancária pessoal', @@ -7041,8 +7042,32 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, }, hr: { title: 'RH', + connections: 'Conexões', subtitle: 'Conecte ferramentas de RH e mantenha as aprovações de funcionários em sincronia.', - settingsTitle: 'Configurações do Gusto', + connect: 'Conectar', + syncNow: 'Sincronizar agora', + disconnect: 'Desconectar', + disconnectTitle: (providerName: string) => `Desconectar ${providerName}`, + disconnectPrompt: (providerName: string) => `Tem certeza de que deseja desconectar ${providerName}?`, + lastSync: (relativeDate: string) => `Última sincronização ${relativeDate}`, + syncError: (providerName: string) => `Não é possível conectar ao ${providerName}`, + connectionDescription: (providerName: string) => `Conecte ${providerName} para manter as aprovações de funcionários sincronizadas com seu workspace.`, + approvalMode: 'Modo de aprovação', + finalApprover: 'Aprovador final', + notSet: 'Não definido', + approvalModeDescription: (providerName: string) => `Membros e gerentes estão configurados para sincronizar com ${providerName}.`, + approvalModeWarningTitle: 'Alterar modo de aprovação?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `Tem certeza de que deseja alterar o modo de aprovação deste workspace? Saiba mais sobre os diferentes modos de fluxo de trabalho com ${providerName} em nosso site de ajuda.`, + approvalModeWarningConfirm: 'Alterar modo de aprovação', + approvalModes: { + basic: {label: 'Aprovação básica', description: 'Todos os usuários enviam para uma única pessoa para processamento e aprovação.'}, + manager: { + label: 'Aprovação do gerente', + description: (providerName: string) => `Os funcionários enviam relatórios ao gestor direto configurado no ${providerName}.`, + }, + custom: {label: 'Aprovação personalizada', description: 'Vou configurar manualmente os fluxos de aprovação no Expensify.'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -7066,27 +7091,6 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, }, gusto: { title: 'Gusto', - approvalMode: 'Modo de aprovação', - finalApprover: 'Aprovador final', - notSet: 'Não definido', - approvalModeDescription: 'Membros e gerentes estão configurados para sincronizar com o Gusto.', - approvalModeWarningTitle: 'Alterar modo de aprovação?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Tem certeza de que deseja alterar o modo de aprovação deste workspace? Saiba mais sobre os diferentes modos de fluxo de trabalho com Gusto em nosso site de ajuda.`, - approvalModeWarningConfirm: 'Alterar modo de aprovação', - approvalModes: { - basic: {label: 'Aprovação básica', description: 'Todos os usuários enviam para uma única pessoa para processamento e aprovação.'}, - manager: {label: 'Aprovação do gerente', description: 'Os funcionários enviam relatórios ao gestor direto configurado no Gusto.'}, - custom: {label: 'Aprovação personalizada', description: 'Vou configurar manualmente os fluxos de aprovação no Expensify.'}, - }, - connect: 'Conectar', - connectionDescription: 'Conecte o Gusto para manter as aprovações de funcionários sincronizadas com seu workspace.', - syncNow: 'Sincronizar agora', - disconnect: 'Desconectar', - lastSync: (relativeDate: string) => `Última sincronização ${relativeDate}`, - syncError: 'Não é possível conectar ao Gusto', - disconnectTitle: 'Desconectar Gusto', - disconnectPrompt: 'Tem certeza de que deseja desconectar o Gusto?', syncResults: { title: 'Resultados da sincronização com Gusto', successTitle: 'Sua conexão com o Gusto foi sincronizada com sucesso!', @@ -7099,33 +7103,8 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, }), }, }, - merge: { - approvalMode: 'Modo de aprovação', - finalApprover: 'Aprovador final', - }, zenefits: { title: 'TriNet', - connect: 'Conectar', - syncNow: 'Sincronizar agora', - disconnect: 'Desconectar', - lastSync: (relativeDate: string) => `Última sincronização ${relativeDate}`, - syncError: 'Não é possível conectar ao TriNet', - disconnectTitle: 'Desconectar TriNet', - disconnectPrompt: 'Tem certeza de que quer desconectar a TriNet?', - connectionDescription: 'Conecte o TriNet para manter as aprovações de funcionários sincronizadas com o seu espaço de trabalho.', - approvalMode: 'Modo de aprovação', - finalApprover: 'Aprovador final', - notSet: 'Não definido', - approvalModeDescription: 'Os membros e gerentes estão configurados para sincronizar com o TriNet.', - approvalModeWarningTitle: 'Alterar modo de aprovação?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `Tem certeza de que deseja alterar o modo de aprovação deste espaço de trabalho? Saiba mais sobre os diferentes modos de fluxo de trabalho habilitados pelo TriNet no nosso site de ajuda.`, - approvalModeWarningConfirm: 'Alterar modo de aprovação', - approvalModes: { - basic: {label: 'Aprovação básica', description: 'Todos os usuários enviam para uma única pessoa para processamento e aprovação.'}, - manager: {label: 'Aprovação do gerente', description: 'Os funcionários enviam relatórios para o gerente direto configurado no TriNet.'}, - custom: {label: 'Aprovação personalizada', description: 'Vou configurar manualmente fluxos de aprovação no Expensify.'}, - }, }, }, }, diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index fe9f58ee820a..8eb560866b18 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -261,6 +261,7 @@ const translations: TranslationDeepObject = { reset: '重置', done: '完成', more: '更多', + other: '其他', debitCard: '借记卡', bankAccount: '银行账户', personalBankAccount: '个人银行账户', @@ -6866,8 +6867,32 @@ ${reportName} }, hr: { title: '人力资源', + connections: '连接', subtitle: '连接人力资源工具,保持员工审批同步。', - settingsTitle: 'Gusto 设置', + connect: '连接', + syncNow: '立即同步', + disconnect: '断开连接', + disconnectTitle: (providerName: string) => `断开 ${providerName}`, + disconnectPrompt: (providerName: string) => `确定要断开 ${providerName} 吗?`, + lastSync: (relativeDate: string) => `上次同步 ${relativeDate}`, + syncError: (providerName: string) => `无法连接到 ${providerName}`, + connectionDescription: (providerName: string) => `连接 ${providerName},以在您的工作区中同步员工审批。`, + approvalMode: '审批模式', + finalApprover: '最终审批人', + notSet: '未设置', + approvalModeDescription: (providerName: string) => `成员和管理员已设置为与 ${providerName} 同步。`, + approvalModeWarningTitle: '更改审批模式?', + approvalModeWarningPrompt: (providerName: string, helpSiteURL: string) => + `您确定要更改此工作区的审批模式吗?在我们的帮助网站中了解更多关于不同 ${providerName} 启用的工作流模式的信息。`, + approvalModeWarningConfirm: '更改审批模式', + approvalModes: { + basic: {label: '基本审批', description: '所有用户都提交给同一个人进行处理和审批。'}, + manager: { + label: '经理审批', + description: (providerName: string) => `员工会将报销单提交给在 ${providerName} 中配置的直属经理。`, + }, + custom: {label: '自定义审批', description: '我将在 Expensify 中手动设置审批工作流程。'}, + }, syncStageName: ({stage}: SyncStageNameConnectionsParams) => { switch (stage) { case 'gustoSyncTitle': @@ -6891,27 +6916,6 @@ ${reportName} }, gusto: { title: 'Gusto', - approvalMode: '审批模式', - finalApprover: '最终审批人', - notSet: '未设置', - approvalModeDescription: '成员和管理员已设置为与 Gusto 同步。', - approvalModeWarningTitle: '更改审批模式?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `您确定要更改此工作区的审批模式吗?在我们的帮助网站中了解更多关于不同 Gusto 启用的工作流模式的信息。`, - approvalModeWarningConfirm: '更改审批模式', - approvalModes: { - basic: {label: '基础审批', description: '所有用户都提交给同一个人进行处理和审批。'}, - manager: {label: '经理审批', description: '员工会将报销单提交给在 Gusto 中配置的直属经理。'}, - custom: {label: '自定义审批', description: '我将在 Expensify 中手动设置审批工作流程。'}, - }, - connect: '连接', - connectionDescription: '连接 Gusto,以在您的工作区中同步员工审批。', - syncNow: '立即同步', - disconnect: '断开连接', - lastSync: (relativeDate: string) => `上次同步时间:${relativeDate}`, - syncError: '无法连接到 Gusto', - disconnectTitle: '断开 Gusto', - disconnectPrompt: '确定要断开与 Gusto 的连接吗?', syncResults: { title: 'Gusto 同步结果', successTitle: '已成功同步你的 Gusto 连接!', @@ -6924,33 +6928,8 @@ ${reportName} }), }, }, - merge: { - approvalMode: '审批模式', - finalApprover: '最终审批人', - }, zenefits: { title: 'TriNet', - connect: '连接', - syncNow: '立即同步', - disconnect: '断开连接', - lastSync: (relativeDate: string) => `上次同步时间:${relativeDate}`, - syncError: '无法连接到 TriNet', - disconnectTitle: '断开 TriNet 连接', - disconnectPrompt: '确定要断开 TriNet 吗?', - connectionDescription: '连接 TriNet,将员工审批与你的工作区保持同步。', - approvalMode: '审批模式', - finalApprover: '最终审批人', - notSet: '未设置', - approvalModeDescription: '成员和管理者已设置为与 TriNet 同步。', - approvalModeWarningTitle: '更改审批模式?', - approvalModeWarningPrompt: (helpSiteURL: string) => - `您确定要更改此工作区的审批模式吗?在我们的帮助网站中了解更多关于不同 TriNet 启用的工作流模式的信息。`, - approvalModeWarningConfirm: '更改审批模式', - approvalModes: { - basic: {label: '基础审批', description: '所有用户都提交给同一个人进行处理和审批。'}, - manager: {label: '经理审批', description: '员工会将报销报告提交给在 TriNet 中配置的直属经理。'}, - custom: {label: '自定义审批', description: '我会在 Expensify 中手动设置审批流程。'}, - }, }, }, }, diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 71b06cb7c7d9..990371551a6d 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -1269,7 +1269,6 @@ const READ_COMMANDS = { CONNECT_POLICY_TO_GUSTO: 'ConnectPolicyToGusto', CONNECT_POLICY_TO_ZENEFITS: 'ConnectPolicyToZenefits', CONNECT_POLICY_TO_MERGE: 'ConnectPolicyToMerge', - SYNC_POLICY_TO_MERGE_HR: 'SyncPolicyToMergeHR', SYNC_POLICY_TO_QUICKBOOKS_ONLINE: 'SyncPolicyToQuickbooksOnline', SYNC_POLICY_TO_XERO: 'SyncPolicyToXero', SYNC_POLICY_TO_NETSUITE: 'SyncPolicyToNetSuite', @@ -1277,6 +1276,7 @@ const READ_COMMANDS = { SYNC_POLICY_TO_QUICKBOOKS_DESKTOP: 'SyncPolicyToQuickbooksDesktop', SYNC_POLICY_TO_GUSTO: 'SyncPolicyToGusto', SYNC_POLICY_TO_ZENEFITS: 'SyncPolicyToZenefits', + SYNC_POLICY_TO_MERGE_HR: 'SyncPolicyToMergeHR', SYNC_POLICY_TO_FINANCIAL_FORCE: 'SyncPolicyToFinancialForce', CONNECT_POLICY_TO_FINANCIAL_FORCE: 'ConnectPolicyToFinancialForce', OPEN_REIMBURSEMENT_ACCOUNT_PAGE: 'OpenReimbursementAccountPage', @@ -1372,7 +1372,6 @@ type ReadCommandParameters = { [READ_COMMANDS.CONNECT_POLICY_TO_GUSTO]: Parameters.ConnectPolicyToGustoParams; [READ_COMMANDS.CONNECT_POLICY_TO_ZENEFITS]: Parameters.ConnectPolicyToZenefitsParams; [READ_COMMANDS.CONNECT_POLICY_TO_MERGE]: Parameters.ConnectPolicyToMergeParams; - [READ_COMMANDS.SYNC_POLICY_TO_MERGE_HR]: Parameters.SyncPolicyToMergeHRParams; [READ_COMMANDS.CONNECT_POLICY_TO_FINANCIAL_FORCE]: Parameters.ConnectPolicyToFinancialForceParams; [READ_COMMANDS.SYNC_POLICY_TO_QUICKBOOKS_ONLINE]: Parameters.SyncPolicyToQuickbooksOnlineParams; [READ_COMMANDS.SYNC_POLICY_TO_XERO]: Parameters.SyncPolicyToXeroParams; @@ -1381,6 +1380,7 @@ type ReadCommandParameters = { [READ_COMMANDS.SYNC_POLICY_TO_QUICKBOOKS_DESKTOP]: Parameters.SyncPolicyToQuickbooksDesktopParams; [READ_COMMANDS.SYNC_POLICY_TO_GUSTO]: Parameters.SyncPolicyToGustoParams; [READ_COMMANDS.SYNC_POLICY_TO_ZENEFITS]: Parameters.SyncPolicyToZenefitsParams; + [READ_COMMANDS.SYNC_POLICY_TO_MERGE_HR]: Parameters.SyncPolicyToMergeHRParams; [READ_COMMANDS.SYNC_POLICY_TO_FINANCIAL_FORCE]: {policyID: string}; [READ_COMMANDS.OPEN_REIMBURSEMENT_ACCOUNT_PAGE]: Parameters.OpenReimbursementAccountPageParams; [READ_COMMANDS.OPEN_WORKSPACE_VIEW]: Parameters.OpenWorkspaceViewParams; diff --git a/src/libs/PolicyUtils.ts b/src/libs/PolicyUtils.ts index fd3c443b233d..44e7667b1357 100644 --- a/src/libs/PolicyUtils.ts +++ b/src/libs/PolicyUtils.ts @@ -5,6 +5,7 @@ import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleCon import type {SelectorType} from '@components/SelectionScreen'; import CONST from '@src/CONST'; import MERGE_HR_PROVIDERS from '@src/CONST/MERGE_HR_PROVIDERS'; +import type {MergeHRProviderSlug} from '@src/CONST/MERGE_HR_PROVIDERS'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm'; @@ -73,6 +74,9 @@ type HRProviderInfo = { /** Optional logo URL. Populated only for Merge HR providers when their slug resolves in `MERGE_HR_PROVIDERS`. */ iconUrl?: string; + + /** Merge HR integration slug (e.g. `'bamboohr'`, `'workday'`). Only set when `connectionName` is Merge HR. */ + mergeSlug?: MergeHRProviderSlug; }; type WorkspaceDetails = { @@ -1917,6 +1921,7 @@ function getConnectedHRProvider(policy?: OnyxEntry): HRProviderInfo | nu connectionName: CONST.POLICY.CONNECTIONS.NAME.MERGE_HR, displayName: providerInfo?.displayName ?? CONST.POLICY.CONNECTIONS.NAME_USER_FRIENDLY.merge_hris, iconUrl: providerInfo?.iconUrl ?? undefined, + mergeSlug: slug, }; } return null; @@ -2523,4 +2528,4 @@ export { isPolicyEditor, }; -export type {MemberEmailsToAccountIDs, PolicyFeature, PolicyFeatureAccess, HRProviderInfo}; +export type {MemberEmailsToAccountIDs, PolicyFeature, PolicyFeatureAccess, HRProviderInfo, HRConnectionName}; diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 44e148622921..74cc2a133349 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -168,7 +168,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac [CONST.POLICY.MORE_FEATURES.ARE_COMPANY_CARDS_ENABLED]: policy?.areCompanyCardsEnabled, [CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED]: !!policy?.areConnectionsEnabled || hasAccountingFeatureConnection(policy), [CONST.POLICY.MORE_FEATURES.IS_HR_ENABLED]: - (isBetaEnabled(CONST.BETAS.GUSTO) || isBetaEnabled(CONST.BETAS.ZENEFITS)) && + (isBetaEnabled(CONST.BETAS.GUSTO) || isBetaEnabled(CONST.BETAS.ZENEFITS) || isBetaEnabled(CONST.BETAS.MERGE_HR)) && (policy?.isHREnabled === true || isAnyHRConnected(policy)) && canPolicyAccessFeature(policy, CONST.POLICY.MORE_FEATURES.IS_HR_ENABLED), [CONST.POLICY.MORE_FEATURES.ARE_EXPENSIFY_CARDS_ENABLED]: policy?.areExpensifyCardsEnabled, diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage/index.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage/index.tsx index dbb530c5cdc0..47737384de90 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage/index.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage/index.tsx @@ -322,7 +322,7 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro Navigation.navigate(ROUTES.WORKSPACE_RECEIPT_PARTNERS.getRoute(policyID)); }} /> - {(isBetaEnabled(CONST.BETAS.GUSTO) || isBetaEnabled(CONST.BETAS.ZENEFITS)) && ( + {(isBetaEnabled(CONST.BETAS.GUSTO) || isBetaEnabled(CONST.BETAS.ZENEFITS) || isBetaEnabled(CONST.BETAS.MERGE_HR)) && ( void; +}; + +function HRProviderCard({card, policy, handleConnect}: HRProviderCardProps) { + const {translate, datetimeToRelative} = useLocalize(); + const styles = useThemeStyles(); + const {isOffline} = useNetwork(); + const icons = useMemoizedLazyExpensifyIcons(['Sync', 'Trashcan', 'Building']); + const {showConfirmModal} = useConfirmModal(); + + const fallbackIcon = icons.Building; + // Some integrations have a hardcoded icon, others are passing icon url. + const cardIcon = typeof card.icon === 'string' && card.icon.startsWith('http') ? card.icon : (card.icon as IconAsset) || fallbackIcon; + + let connectionDescription: string | undefined; + if (card.isSyncInProgress && card.syncStageInProgress) { + connectionDescription = translate('workspace.hr.syncStageName', {stage: card.syncStageInProgress}); + } else if (card.successfulDate && !card.hasError) { + connectionDescription = translate('workspace.hr.lastSync', datetimeToRelative(card.successfulDate)); + } + + let lastSyncErrorMessage: string | undefined; + if (card.hasError) { + const genericError = translate('workspace.hr.syncError', card.displayName); + lastSyncErrorMessage = card.lastSyncErrorMessage ? `${genericError} ("${card.lastSyncErrorMessage}")` : genericError; + } + + const overflowMenu: ThreeDotsMenuProps['menuItems'] = [ + { + icon: icons.Sync, + text: translate('workspace.hr.syncNow'), + onSelected: () => syncConnection(policy, card.connectionName), + disabled: isOffline, + }, + { + icon: icons.Trashcan, + text: translate('workspace.hr.disconnect'), + onSelected: () => { + showConfirmModal({ + title: translate('workspace.hr.disconnectTitle', card.displayName), + prompt: translate('workspace.hr.disconnectPrompt', card.displayName), + confirmText: translate('workspace.hr.disconnect'), + cancelText: translate('common.cancel'), + danger: true, + }).then((result) => { + if (result?.action !== ModalActions.CONFIRM || !policy) { + return; + } + removePolicyConnection(policy, card.connectionName); + }); + }, + shouldCallAfterModalHide: true, + }, + ]; + + let rightInset; + if (!card.isConnected) { + rightInset = ( +