From 1df430eb5b87c89d2a1bd851f2efc3ece8720bca Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Wed, 5 Feb 2025 15:40:22 +0000 Subject: [PATCH 1/2] feat: translations --- .github/workflows/languine.yml | 25 + apps/app/languine.json | 19 + apps/app/languine.lock | 771 ++++++++++++++++++++++ apps/app/src/components/locale-switch.tsx | 8 +- apps/app/src/locales/client.ts | 16 +- apps/app/src/locales/en.ts | 2 +- apps/app/src/locales/es.ts | 561 ++++++++++++++++ apps/app/src/locales/fr.ts | 5 + apps/app/src/locales/no.ts | 208 +----- apps/app/src/locales/pt.ts | 5 + apps/app/src/locales/server.ts | 1 + apps/app/src/middleware.ts | 6 +- 12 files changed, 1409 insertions(+), 218 deletions(-) create mode 100644 .github/workflows/languine.yml create mode 100644 apps/app/languine.json create mode 100644 apps/app/languine.lock create mode 100644 apps/app/src/locales/es.ts create mode 100644 apps/app/src/locales/fr.ts create mode 100644 apps/app/src/locales/pt.ts diff --git a/.github/workflows/languine.yml b/.github/workflows/languine.yml new file mode 100644 index 0000000000..785f7f441d --- /dev/null +++ b/.github/workflows/languine.yml @@ -0,0 +1,25 @@ +name: Deploy Website + +on: + push: + branches: + - '**' + paths: + - apps/app/** + +jobs: + translate: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + + - name: Languine Action + uses: languine/languine-action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + api-key: ${{ secrets.LANGUINE_API_KEY }} + project-id: ${{ secrets.LANGUINE_PROJECT_ID }} \ No newline at end of file diff --git a/apps/app/languine.json b/apps/app/languine.json new file mode 100644 index 0000000000..c692ec8255 --- /dev/null +++ b/apps/app/languine.json @@ -0,0 +1,19 @@ +{ + "projectId": "prj_T04K9GpppyBHE1kqa2QPV", + "locale": { + "source": "en", + "targets": [ + "es", + "pt", + "fr", + "no" + ] + }, + "files": { + "ts": { + "include": [ + "src/locales/[locale].ts" + ] + } + } +} \ No newline at end of file diff --git a/apps/app/languine.lock b/apps/app/languine.lock new file mode 100644 index 0000000000..e86f768d32 --- /dev/null +++ b/apps/app/languine.lock @@ -0,0 +1,771 @@ +version: 1 +files: + src/locales/en.ts: + language.title: 3a08e2e340ab29fd9263af48193cbf8e + language.description: 4860788282986eddb5f781b958eec2a2 + language.placeholder: 653777801f96237326d65205bc9129e3 + languages.en: 78463a384a5aa4fad5fa73e2f506ecfc + languages.no: 64435a0abd1ab6bcf0375f5c918b43b3 + common.actions.save: c9cc8cce247e49bae79f15173ce97354 + common.actions.edit: 7dce122004969d56ae2e0245cb754d35 + common.actions.delete: f2a6c498fb90ee345d997f888fce3b18 + common.actions.cancel: ea4788705e6873b424c65e91c2846b19 + common.actions.clear: dc30bc0c7914db5918da4263fce93ad2 + common.actions.create: 686e697538050e4664636337cc3b834f + common.actions.send: 94966d90747b97d1f0f206c98a8b1ac3 + common.actions.return: 988fd738de9c6d177440c5dcf69e73ce + common.actions.success: 505a83f220c02df2f85c3810cd9ceb38 + common.actions.error: 902b0d55fddef6f8d651fe1035b7d4bd + common.actions.next: 10ac3d04253ef7e1ddc73e6091c0cd55 + common.actions.complete: ae94f80b3ce82062a5dd7815daa04f9d + common.assignee.label: 780f85493892dc48b674ac9da8974133 + common.assignee.placeholder: 21931e5effc3e51b161a8cd1ad9553b4 + common.date.pick: 2badfa8fae80a36f4e2d4ee833e26d8c + common.date.due_date: 14c841eea7774b78caf79c58989f9625 + common.status.open: c3bf447eabe632720a3aa1a7ce401274 + common.status.pending: 2d13df6f8b5e4c5af9f87e0dc39df69d + common.status.closed: 03f4a47830f97377a35321051685071e + common.status.archived: 7d69b3cb4cada18ae61811304f8fbcb5 + common.status.compliant: 952358fc53c0167a1ea7354f338ed5af + common.status.non_compliant: a0ecb19f7c90c0d5c1e919aec4d33aac + common.status.not_started: 10db56f8b10dc989c43fbe33202e5339 + common.status.in_progress: c9413dd7682a45da9ecc9efa8cea47d7 + common.status.published: 9b9d8a976b42e0bd66381797644943d5 + common.status.needs_review: 994f197b212a0f4dc844cc3534e889c2 + common.status.draft: f03ab16cd58372c77ba45a3d9a5a1cb9 + common.status.not_assessed: 1a261b378451a287de3a8fbbb6f2a376 + common.status.assessed: 2c051fa737a0d6c7274f4508448b7f8a + common.status.active: 4d3d769b812b6faa6b76e1a8abaece2d + common.status.inactive: 3cab03c00dbd11bc3569afa0748013f0 + common.filters.clear: 0b275442d6556cff30b75f37f1918899 + common.filters.search: 2a37324bb4c331c859044121df3f576b + common.filters.status: ec53a8c4f07baed5d8825072c89799be + common.filters.department: 1d17cb9923b99f823da9f5a16dc460e5 + common.filters.owner.label: 780f85493892dc48b674ac9da8974133 + common.filters.owner.placeholder: 40f417d9ebe868b7aa1e61f27775a03e + common.table.title: b78a3223503896721cca1303f776159b + common.table.status: ec53a8c4f07baed5d8825072c89799be + common.table.assigned_to: 0056a7841e032922f086add6ff46bdf7 + common.table.due_date: 14c841eea7774b78caf79c58989f9625 + common.table.last_updated: 4221d3e17c6eca2ca6337251a3cf9c4e + common.table.no_results: e576c23d915755d83e2d1f47bd9f6c22 + common.empty_states.no_results.title: c49c29bb6656c1f25f2cfac84f83b5ba + common.empty_states.no_results.title_tasks: 8edbb9c85d4b7cce148cb9a886dc1213 + common.empty_states.no_results.title_risks: 20c62e3370120c70750d361567eacc26 + common.empty_states.no_results.description: 3d7c5718545b591caa83edfd8d5f42b0 + common.empty_states.no_results.description_filters: 3d7c5718545b591caa83edfd8d5f42b0 + common.empty_states.no_results.description_no_tasks: f3353fd1d22393a3e418424c9b2a27a9 + common.empty_states.no_results.description_no_risks: 88e49457bb65cb2668438d440241db25 + common.empty_states.no_items.title: 5ece607071fe59ddc4c88dc6abfe2310 + common.empty_states.no_items.description: a591e2d56600c3fb2f2faeed5d770622 + common.pagination.of: 8bf8854bebe108183caeb845c7676ae4 + common.pagination.items_per_page: aaaa3c0a0086a0eedaf3350d3cfe92c1 + common.pagination.rows_per_page: 3995e76cfbc85dea7472c8a1aa627244 + common.pagination.page_x_of_y: 6208c273bcbf684c7714e0667608aa88 + common.pagination.go_to_first_page: e987e3128b4e18b03c5a22b0b0e9167a + common.pagination.go_to_previous_page: bbaeea4b59d37bd6e0927044f9a00047 + common.pagination.go_to_next_page: 406b6936d95a8acd48be844ec706e22c + common.pagination.go_to_last_page: 261e818736ac3798b888949dd433e318 + common.comments.title: 8413c683b4b27cc3f4dbd4c90329d8ba + common.comments.description: 08359c42a550b6de768196bb7a57572e + common.comments.add: a508cd6ee07b35ea8efdf98d6520ce83 + common.comments.new: 73da8a9e52c10215e474553f4266c277 + common.comments.save: b665daa2bba746f14cfd89ff7da8d5e5 + common.comments.success: eb493b3987aa6dab3977b22ce64394aa + common.comments.error: 736e866635076789f50e49f6afad6b4a + common.comments.placeholder: dc11131e02964ba21e7418a386add056 + common.comments.empty.title: f3a648d591b6c76efb96f7a77071d23c + common.comments.empty.description: 0a0df874a9a6b1f3b710b48f10bcd494 + common.attachments.title: 7e2708aeb65763c54052f57ed1a1ec1d + common.attachments.description: b8f87f50e2e7eb3a7e67cd28395428d1 + common.attachments.upload: fa0354450b4127b5105471ad9bcd12cd + common.attachments.upload_description: 91475bf0f0e5ecf5315b4c96fa9c6367 + common.attachments.drop: 74ea35329104cad8e805ffa86e613cfb + common.attachments.drop_description: b97d68051d1914fd89cbab928a6277bd + common.attachments.drop_files_description: 72d020376981e4260e91c99c8ad0a576 + common.attachments.empty.title: c4f38f80a0d6824916df985cb97c13c2 + common.attachments.empty.description: b8f87f50e2e7eb3a7e67cd28395428d1 + common.attachments.toasts.error: 9e78ff392dee43a6c78a8c4e29ff4dc2 + common.attachments.toasts.error_uploading_files: 0ce4e97491f9ec754c873777f060b94f + common.attachments.toasts.error_uploading_files_multiple: 25feb6bad088f953ac42d7b2d643f2c8 + common.attachments.toasts.error_no_files_selected: 0d3c324c094a82a004ccc03a2caf90ae + common.attachments.toasts.error_file_rejected: b2b300d579afddcee1ca89adc18ce422 + common.attachments.toasts.error_failed_to_upload_files: 45fabec46ef79d7a7d140c5238e5d99c + common.attachments.toasts.error_failed_to_upload_files_multiple: 45fabec46ef79d7a7d140c5238e5d99c + common.attachments.toasts.error_failed_to_upload_files_single: d831d180862fc4b9c2bb734c2f722461 + common.attachments.toasts.success_uploading_files: aa464b4f6882ac902a9cbf01c04aaec6 + common.attachments.toasts.success_uploading_files_multiple: aa464b4f6882ac902a9cbf01c04aaec6 + common.attachments.toasts.success_uploading_files_single: 40070e1f0867f97db0fa33039fae2063 + common.attachments.toasts.success_uploading_files_target: 293fc6e4068205eefc9df77baa941b5f + common.attachments.toasts.uploading_files: a538c6cacc535cf165533cc65510248f + common.attachments.toasts.remove_file: b21f085d08623fc7a5a9da204cc66c8c + header.discord.button: 1d403edd5e9a373b882ebba790de6f05 + header.feedback.button: bea4c2c8eb82d05891ddd71584881b56 + header.feedback.title: d62968e1245fc470aa53ae9e5646215a + header.feedback.description: ae302ed9b4b7788323017c960c96e1b7 + header.feedback.placeholder: ccc39ab05feae98c0ed3755ea75aa6ac + header.feedback.success: d62968e1245fc470aa53ae9e5646215a + header.feedback.error: 4c55f18f5736e288cb2ef4ba40193589 + header.feedback.send: 6f97affc01668e2b1d9bb6175e012d83 + not_found.title: 2278b18b76bf7efe94add9898a319e3b + not_found.description: b321d61a0e8fe08a8065e04c5ba0755d + not_found.return: 6c2673fcfc773430b4ad7e03fbfe5e04 + theme.options.light: 9914a0ce04a7b7b6a8e39bec55064b82 + theme.options.dark: a18366b217ebf811ad1886e4f4f865b2 + theme.options.system: a45da96d0bf6575970f2d27af22be28a + sidebar.overview: 3b878279a04dc47d60932cb294d96259 + sidebar.policies: 9e476387322a5c250893cf9c5c4ce78c + sidebar.risk: 59ca88f7b0e80cdd9af330af600a9ff6 + sidebar.vendors: dfcc5efe778e6340336015dc02617922 + sidebar.integrations: e01aecb528730f3bfe10f9d57f1317bf + sidebar.settings: f4f70727dc34561dfde1a3c529b6205c + sidebar.evidence: 63b1eb1a39194d82271ec937fba19714 + auth.title: 4b33d501b99fef8f85f32b942fcd0b1f + auth.description: 1fd4b045f6d46683c611e45b8de4bcf6 + auth.options: 4dab36ac83853282fc0d7bae20c19e90 + auth.google: a7f3dfc629e5a526d9d85a9feb574b0e + auth.email.description: 7f031c366f949ea465783e938f80f502 + auth.email.placeholder: 0a7e62bed14b39cf005db653e04fb3b3 + auth.email.button: 3bc7d6ea2fba554132c7b9650c764c91 + auth.email.magic_link_sent: 110748a3ce0c0da299c2c432e575fc73 + auth.email.magic_link_description: 5344fb66f0ffc2779b5cdc7a2bcfacc6 + auth.email.magic_link_try_again: 3eee5af66b8ebba3c4db32a3dd17c2d2 + auth.email.success: e68bdc84bc988f4022337c3af077ba5a + auth.email.error: ed239af1d84d25fd9bb99251114b488c + auth.terms: bb73614638d9a468c878278692a71a5e + onboarding.title: deecac09e6560d6f0f98401d9852d514 + onboarding.setup: ad2376beebecdcf7846ba973fa1a005b + onboarding.description: 7cd2a7692cfacbbea2045f2e6416b805 + onboarding.fields.name.label: c1ca926603dc454ba981aa514db8402b + onboarding.fields.name.placeholder: 0ad99cd46646d542668f0f40ab982477 + onboarding.fields.website.label: 15bbb9d0bbf25e8d2978de1168c749dc + onboarding.fields.website.placeholder: 4ebd8773cbf5dc2531d6b28b6fe32a26 + onboarding.success: 13ff66cec7127e895b2e463771341c13 + onboarding.error: 9e78ff392dee43a6c78a8c4e29ff4dc2 + overview.title: 3b878279a04dc47d60932cb294d96259 + overview.framework_chart.title: 9c53d5a3379ee2c9bc7c1c55f54724b9 + overview.requirement_chart.title: 69d9304854b767112e32573d7eeddc24 + policies.dashboard.title: 2938c7f7e560ed972f8a4f68e80ff834 + policies.dashboard.all: 4992678c2f629035e5c3bcde296b596a + policies.dashboard.policy_status: 52786fa7ae1ab7c63781647461d378ae + policies.dashboard.policies_by_assignee: 78a5313bf44384663f9ddf1253a26d02 + policies.dashboard.policies_by_framework: b6c2212b46c6baa166b653aae7d5b014 + policies.table.name: 002f7378a5fcfc2f66cfea851a7fd5f4 + policies.table.statuses.draft: f03ab16cd58372c77ba45a3d9a5a1cb9 + policies.table.statuses.published: 9b9d8a976b42e0bd66381797644943d5 + policies.table.filters.owner.label: 780f85493892dc48b674ac9da8974133 + policies.table.filters.owner.placeholder: 40f417d9ebe868b7aa1e61f27775a03e + policies.filters.search: 417253920390e1fdb5f07216a44d61c7 + policies.filters.all: 4992678c2f629035e5c3bcde296b596a + policies.status.draft: f03ab16cd58372c77ba45a3d9a5a1cb9 + policies.status.published: 9b9d8a976b42e0bd66381797644943d5 + policies.status.needs_review: 994f197b212a0f4dc844cc3534e889c2 + policies.policies: 94422fa6b0fe23d0ab463703c0022a63 + evidence_tasks.evidence_tasks: 63b1eb1a39194d82271ec937fba19714 + evidence_tasks.overview: 3b878279a04dc47d60932cb294d96259 + risk.risks: 2bb550bd7d03efff73cd7152d6092af1 + risk.overview: 3b878279a04dc47d60932cb294d96259 + risk.create: 6b6a9ddf03b83e9b55d753debff485cc + risk.vendor.title: 97f6291ea1000272b34fdfaeb3a9e2d2 + risk.vendor.dashboard.title: 4331630c8206f1f5f5b2d26133997482 + risk.vendor.dashboard.overview: 003dd1a6f6efb2ac33fa8519c89dedcc + risk.vendor.dashboard.vendor_status: 17029fbe5ad4d2af5feaf37bb4604225 + risk.vendor.dashboard.vendor_category: 273bcc0a45ba3b2256086f10966dfb99 + risk.vendor.dashboard.vendors_by_assignee: efbb5ed45de13ae274678ea91b656d08 + risk.vendor.dashboard.inherent_risk_description: f65c38062d37923bfd4850e78e25772a + risk.vendor.dashboard.residual_risk_description: 7e1b11b661aa2704e378dd1ca7f33757 + risk.vendor.register.title: 122b14e8fa33bc9d4f389700439dfc71 + risk.vendor.register.table.name: 49ee3087348e8d44e1feda1917443987 + risk.vendor.register.table.category: 3adbdb3ac060038aa0e6e6c138ef9873 + risk.vendor.register.table.status: ec53a8c4f07baed5d8825072c89799be + risk.vendor.register.table.owner: b6f4a2ec6356bbd56d49f2096bf9d3d3 + risk.vendor.assessment.title: 379e6cfc424d72e4c96726872918ec6a + risk.vendor.assessment.update_success: 7e0e4867356e95f04e471be06bb8de88 + risk.vendor.assessment.update_error: 2acd20fb7755340657e45ca0a5dd57cf + risk.vendor.assessment.inherent_risk: 40fff66e1ace971207ed5d211ae7e9f9 + risk.vendor.assessment.residual_risk: 198743176f93dea0b5a5ba6cb7b8fff0 + risk.vendor.form.vendor_details: c594485dedf99a5bbae0ce0b1e08c57a + risk.vendor.form.vendor_name: 49ee3087348e8d44e1feda1917443987 + risk.vendor.form.vendor_name_placeholder: 76d22a64aa21a6f1fe356624bb42487e + risk.vendor.form.vendor_website: 15bbb9d0bbf25e8d2978de1168c749dc + risk.vendor.form.vendor_website_placeholder: 0edbf3ae0d36cb35fdae8df56396e8f0 + risk.vendor.form.vendor_description: b5a7adde1af5c87d7fd797b6245c2a39 + risk.vendor.form.vendor_description_placeholder: edd59fcb97919e8a914f29d1b8c94a84 + risk.vendor.form.vendor_category: 3adbdb3ac060038aa0e6e6c138ef9873 + risk.vendor.form.vendor_category_placeholder: 03368e3c1eb4d2a9048775874301b19f + risk.vendor.form.vendor_status: ec53a8c4f07baed5d8825072c89799be + risk.vendor.form.vendor_status_placeholder: 9aadb017cc5b335be77ba090d5029259 + risk.vendor.form.create_vendor_success: 86783216c2055e4b01d9a6d920e418c7 + risk.vendor.form.create_vendor_error: ca4cedd93fdb023d6f9748dd3b66b456 + risk.vendor.form.update_vendor: 13002cf3244d871685ebac44761efa0f + risk.vendor.form.update_vendor_success: eaedfa5b3ca431e1ca8900a8f0d5c924 + risk.vendor.form.update_vendor_error: 92b965a71c44a134e2eae6d71493e4d9 + risk.vendor.form.add_comment: a508cd6ee07b35ea8efdf98d6520ce83 + risk.vendor.table.name: 49ee3087348e8d44e1feda1917443987 + risk.vendor.table.category: 3adbdb3ac060038aa0e6e6c138ef9873 + risk.vendor.table.status: ec53a8c4f07baed5d8825072c89799be + risk.vendor.table.owner: b6f4a2ec6356bbd56d49f2096bf9d3d3 + risk.vendor.filters.search_placeholder: f40df41fdaa46e2d0503adf12a9304fe + risk.vendor.filters.status_placeholder: 5dd5cd6670a0fc8e47a47aa94d27b8b2 + risk.vendor.filters.category_placeholder: 42d00bc24fd43cfe3e2e30d01f39ee95 + risk.vendor.filters.owner_placeholder: 2cf13cb9c60a98dee6767692b12e9c2e + risk.vendor.empty_states.no_vendors.title: 69c843f9cf71049dacacff0c48edb7b2 + risk.vendor.empty_states.no_vendors.description: 955707a384c1cfc46fafbdebc508f9e0 + risk.vendor.empty_states.no_results.title: e576c23d915755d83e2d1f47bd9f6c22 + risk.vendor.empty_states.no_results.description: d7fd5c52726c5016a59fb01e74069441 + risk.vendor.empty_states.no_results.description_with_filters: 2b70f835ed5a08e817ec9388ce25b41a + risk.vendor.actions.create: ef1c7d5e555d7fe288bf0bf16b88723d + risk.vendor.status.not_assessed: 1a261b378451a287de3a8fbbb6f2a376 + risk.vendor.status.in_progress: c9413dd7682a45da9ecc9efa8cea47d7 + risk.vendor.status.assessed: 2c051fa737a0d6c7274f4508448b7f8a + risk.vendor.category.cloud: c8e2277ecfb1427838c488c217f99466 + risk.vendor.category.infrastructure: cba4f4cee5c6a3e6d8be8da68fa1234e + risk.vendor.category.software_as_a_service: 68c0c53c6a8ab47f4b611dbf1c347a26 + risk.vendor.category.finance: c482980d384a9d0e7bc39e1140270870 + risk.vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b + risk.vendor.category.sales: 11ff9f68afb6b8b5b8eda218d7c83a65 + risk.vendor.category.hr: fd4c638da5f85d025963f99fe90b1b1a + risk.vendor.category.other: 6311ae17c1ee52b36e68aaf4ad066387 + risk.vendor.risk_level.low: 36b15248f0ecaeea29717628a3b3e7f2 + risk.vendor.risk_level.medium: 286e8fc384ea1215440694f1cf95bd7e + risk.vendor.risk_level.high: d0bf2dd713c128a9624bf27e78f9b1bf + risk.vendor.risk_level.unknown: 64abc18d6248f7d5c9108d85ba99973f + risk.dashboard.title: 2938c7f7e560ed972f8a4f68e80ff834 + risk.dashboard.overview: 5226ebb7d548f2d3a8f8c4fd08851405 + risk.dashboard.risk_status: 6ce5e6fa832289748023cb773a4e89ac + risk.dashboard.risks_by_department: 0ef508d7e840bc5f85547c3b25e5d87b + risk.dashboard.risks_by_assignee: cb5989d54b044bb7ac403f59accf646d + risk.dashboard.inherent_risk_description: ff9969a313721960f2d98b6071aca3a1 + risk.dashboard.residual_risk_description: 40b92149c54944ed7667b005323e0895 + risk.dashboard.risk_assessment_description: 2d0b6c77a79f103f6f59828736fb1e96 + risk.register.title: e4c28136d96146bd5fe9dfe41214138c + risk.register.table.risk: 59ca88f7b0e80cdd9af330af600a9ff6 + risk.register.empty.no_risks.title: 88e49457bb65cb2668438d440241db25 + risk.register.empty.no_risks.description: 48d82a045e2fff17332ecc2afe4640d1 + risk.register.empty.create_risk: cafd0f4e8384c5e8b08fd1f540bd7b08 + risk.metrics.probability: 0d2765b30694ee9f4fb7be2ae3b676dc + risk.metrics.impact: 21f59b54f62b5b8b4bc0f63f0f617fc1 + risk.metrics.inherentRisk: 40fff66e1ace971207ed5d211ae7e9f9 + risk.metrics.residualRisk: 198743176f93dea0b5a5ba6cb7b8fff0 + risk.form.update_inherent_risk: 429cfe3a626ff1546f0291384780f826 + risk.form.update_inherent_risk_description: 6e35a54a2971a2108469031648596a1f + risk.form.update_inherent_risk_success: 5bf2942775436e5203ad3f5e11247185 + risk.form.update_inherent_risk_error: f24841f76eb36a71bb66e9431d1b4496 + risk.form.update_residual_risk: 7bc6f7d936bc18bf40d2361718fd4ad5 + risk.form.update_residual_risk_description: d2e349ee6d505701af81f69983764902 + risk.form.update_residual_risk_success: 9abe72c076c990ac1c7c513c053a76fa + risk.form.update_residual_risk_error: d056fe9d4c50e4b7fb8545878ac36b64 + risk.form.update_risk: 20bb7dfcf3decfb169ccdf2fc3037291 + risk.form.update_risk_description: 939b7343ed50268fd114fc45345049ee + risk.form.update_risk_success: 8c1fc320855e2a76900366b2c44d2a7c + risk.form.update_risk_error: abbcd9315b9cbee5f4e37ed651ed2071 + risk.form.create_risk_success: 91afb68c74fa3daeebe8c65152fac342 + risk.form.create_risk_error: ecbac6979e7564b73de49bc3b8f1c71c + risk.form.risk_details: b5a89d075e89aa7a49144fb394dbe1d7 + risk.form.risk_title: fbb8bdf45e37c67e0bcabb393add46e7 + risk.form.risk_title_description: 85e53a8fb7c2e11ed45b1cdf01827076 + risk.form.risk_description: b5a7adde1af5c87d7fd797b6245c2a39 + risk.form.risk_description_description: 4457cc98b1d6fb1d0e2e6f0a0c404f68 + risk.form.risk_category: 3adbdb3ac060038aa0e6e6c138ef9873 + risk.form.risk_category_placeholder: b02d8b2c78dfd6cc791eff6f283e5008 + risk.form.risk_department: 1d17cb9923b99f823da9f5a16dc460e5 + risk.form.risk_department_placeholder: aa4fd23252b4fcf84f40febb6271bf2b + risk.form.risk_status: 6ce5e6fa832289748023cb773a4e89ac + risk.form.risk_status_placeholder: 41603a077f54030ebfe0926f2ee782c3 + risk.tasks.title: ef615563c8e8ea902c7fcac3cd2c4246 + risk.tasks.attachments: 7e2708aeb65763c54052f57ed1a1ec1d + risk.tasks.overview: d5a893e5bfa69efefb2667f8e7ec600c + risk.tasks.form.title: 05bf73cee83e93c631eccfb54f0d6304 + risk.tasks.form.task_title: d6ee55f593f922b08897bdd0020dd78f + risk.tasks.form.status: 645fb7e7e0bc0db4a20436c963c683fd + risk.tasks.form.status_placeholder: 05d6a5fa8867274c634566a369458146 + risk.tasks.form.task_title_description: 45c40777dc0603af4d002116049368ad + risk.tasks.form.description: b5a7adde1af5c87d7fd797b6245c2a39 + risk.tasks.form.description_description: 87cb996e412747e69717e3a1860f6dbb + risk.tasks.form.due_date: 14c841eea7774b78caf79c58989f9625 + risk.tasks.form.due_date_description: 6efb5fa44843e643968f87ef4585684a + risk.tasks.form.success: 50b6488825a184919fe9b3e1bfd07855 + risk.tasks.form.error: 4916b05ad49d023cfe9a7194ddd45aa2 + risk.tasks.sheet.title: a5a65f03604c8c15dfec7e7a2e645e4f + risk.tasks.sheet.update: 4986b7d86bc9802a74158895b131d84d + risk.tasks.sheet.update_description: 78765e8e89a67c813e41dfb5c8040a2a + risk.tasks.empty.description_create: cdce579691e73a04fd291956adab6ff0 + settings.general.title: 0db377921f4ce762c62526131097968f + settings.general.org_name: 9f6806ada2d5069898dd5d21ca6529cd + settings.general.org_name_description: c4e6879ed601093e1765258d46270ade + settings.general.org_name_tip: 1d9872bc27d142b25b907943cf7a0675 + settings.general.org_website: fc36c9211c6e2088a76bb7c4c5e3ffee + settings.general.org_website_description: b99e37801c801b4a6f7c82bcc05158a2 + settings.general.org_website_tip: 9839d1a96cb18af1d415f76a8aa1f56c + settings.general.org_website_error: 444aae2b5756dff2412b2a7eadbf62a5 + settings.general.org_website_updated: eaaf13b5d0b8680315683487f71cc053 + settings.general.org_delete: 8916172ef3da57c94296f890820fd4aa + settings.general.org_delete_description: 8888950d2f51db34e5b0299af732080d + settings.general.org_delete_alert_title: 99b418f62bde2c0a85d1e388ac803677 + settings.general.org_delete_alert_description: b2fda5ff2334ffcd564699dcd274464b + settings.general.org_delete_error: 862f9ed0b86c0c0355a0c29a5e0f200f + settings.general.org_delete_success: c090f60c6934cebd137360f64176b815 + settings.general.org_name_updated: 2f1bea8cdf76a2b06fc1f5ff1c6b29bf + settings.general.org_name_error: 6f1f02ee0fe9102a388eb2f922b23b1b + settings.general.save_button: c9cc8cce247e49bae79f15173ce97354 + settings.general.delete_button: f2a6c498fb90ee345d997f888fce3b18 + settings.general.delete_confirm: 32f68a60cef40faedbc6af20298c1a1e + settings.general.delete_confirm_tip: 97e957e2354c8329aa437ed16be68eef + settings.general.cancel_button: ea4788705e6873b424c65e91c2846b19 + settings.members.title: ef53538ae41a651c7f72ab6cb1135d8c + settings.billing.title: 780c462e85ba4399a5d42e88f69a15ca + user_menu.theme: d721757161f7f70c5b0949fdb6ec2c30 + user_menu.language: 4994a8ffeba4ac3140beb89e8d41f174 + user_menu.sign_out: c87aacf5673fada1108c9f809d354311 + user_menu.account: 08bd40c7543007ad06e4fce31618f6ec + user_menu.support: db5eb84117d06047c97c9a0191b5fffe + user_menu.settings: f4f70727dc34561dfde1a3c529b6205c + user_menu.teams: 1fe1b6cf4f52930c301b03e5a69c42c2 + frameworks.title: 04fb5df59766a9852e5dd2d0430ca27e + frameworks.controls.title: 24b6472fcfa59cddd3f7bbc326582b5f + frameworks.controls.description: de7fdb6cf858368e9e60bb991149b912 + frameworks.controls.table.status: ec53a8c4f07baed5d8825072c89799be + frameworks.controls.table.control: a1595abbb4c3a326636dd178757cd6c1 + frameworks.controls.table.artifacts: 08004d9d4c599f44814a861568d200cb + frameworks.controls.table.actions: 06df33001c1d7187fdd81ea1f5b277aa + frameworks.controls.statuses.not_started: 10db56f8b10dc989c43fbe33202e5339 + frameworks.controls.statuses.compliant: 952358fc53c0167a1ea7354f338ed5af + frameworks.controls.statuses.non_compliant: a0ecb19f7c90c0d5c1e919aec4d33aac + vendor.title: 2938c7f7e560ed972f8a4f68e80ff834 + vendor.register_title: 97f6291ea1000272b34fdfaeb3a9e2d2 + vendor.dashboard.title: 2938c7f7e560ed972f8a4f68e80ff834 + vendor.dashboard.overview: 003dd1a6f6efb2ac33fa8519c89dedcc + vendor.dashboard.vendor_status: 17029fbe5ad4d2af5feaf37bb4604225 + vendor.dashboard.vendor_category: 273bcc0a45ba3b2256086f10966dfb99 + vendor.dashboard.vendors_by_assignee: efbb5ed45de13ae274678ea91b656d08 + vendor.dashboard.inherent_risk_description: f65c38062d37923bfd4850e78e25772a + vendor.dashboard.residual_risk_description: 7e1b11b661aa2704e378dd1ca7f33757 + vendor.register.title: 122b14e8fa33bc9d4f389700439dfc71 + vendor.register.table.name: 49ee3087348e8d44e1feda1917443987 + vendor.register.table.category: 3adbdb3ac060038aa0e6e6c138ef9873 + vendor.register.table.status: ec53a8c4f07baed5d8825072c89799be + vendor.register.table.owner: b6f4a2ec6356bbd56d49f2096bf9d3d3 + vendor.category.cloud: c8e2277ecfb1427838c488c217f99466 + vendor.category.infrastructure: cba4f4cee5c6a3e6d8be8da68fa1234e + vendor.category.software_as_a_service: b0ca9e41d61885345eef09f928c9ea58 + vendor.category.finance: c482980d384a9d0e7bc39e1140270870 + vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b + vendor.category.sales: 11ff9f68afb6b8b5b8eda218d7c83a65 + vendor.category.hr: fd4c638da5f85d025963f99fe90b1b1a + vendor.category.other: 6311ae17c1ee52b36e68aaf4ad066387 + vendor.vendors: 2bc28e228525b75e14c07dbc14850c34 + vendor.form.vendor_details: c594485dedf99a5bbae0ce0b1e08c57a + vendor.form.vendor_name: 49ee3087348e8d44e1feda1917443987 + vendor.form.vendor_name_placeholder: 76d22a64aa21a6f1fe356624bb42487e + vendor.form.vendor_website: 15bbb9d0bbf25e8d2978de1168c749dc + vendor.form.vendor_website_placeholder: 0edbf3ae0d36cb35fdae8df56396e8f0 + vendor.form.vendor_description: b5a7adde1af5c87d7fd797b6245c2a39 + vendor.form.vendor_description_placeholder: edd59fcb97919e8a914f29d1b8c94a84 + vendor.form.vendor_category: 3adbdb3ac060038aa0e6e6c138ef9873 + vendor.form.vendor_category_placeholder: 03368e3c1eb4d2a9048775874301b19f + vendor.form.vendor_status: ec53a8c4f07baed5d8825072c89799be + vendor.form.vendor_status_placeholder: 9aadb017cc5b335be77ba090d5029259 + vendor.form.create_vendor_success: 86783216c2055e4b01d9a6d920e418c7 + vendor.form.create_vendor_error: ca4cedd93fdb023d6f9748dd3b66b456 + vendor.form.update_vendor_success: eaedfa5b3ca431e1ca8900a8f0d5c924 + vendor.form.update_vendor_error: 92b965a71c44a134e2eae6d71493e4d9 + vendor.form.contacts: be184fa710244f6c783e6eb68fd427d7 + vendor.form.contact_name: 7cfd883d5d55fccfcfb13b3fcf29e3a6 + vendor.form.contact_email: 3c2292f30e636ecf522743c3fa73749d + vendor.form.contact_role: ccde9b292717d5a0133304d27acfa669 + vendor.form.add_contact: 4e58c159d031b956f9ee227f87df3fcf + vendor.form.new_contact: 636c575a94e9a0c957277e432fb1d49b + vendor.form.min_one_contact_required: 92b341dc8c72591d66252794dfb00f48 + vendor.empty_states.no_vendors.title: 69c843f9cf71049dacacff0c48edb7b2 + vendor.empty_states.no_vendors.description: 955707a384c1cfc46fafbdebc508f9e0 + vendor.empty_states.no_results.title: e576c23d915755d83e2d1f47bd9f6c22 + vendor.empty_states.no_results.description: d7fd5c52726c5016a59fb01e74069441 + vendor.empty_states.no_results.description_with_filters: 2b70f835ed5a08e817ec9388ce25b41a + src/locales/es.ts: + language.title: c88b33a3250b4e28f34e1ececba69206 + language.description: b74d060770289b75ba34d38ea1e05251 + language.placeholder: c90ff5580c52057484a4002000bccd8a + languages.en: 216df59d4dca0cc05c7678221afc6c97 + languages.no: 64435a0abd1ab6bcf0375f5c918b43b3 + languages.es: de92bbe05815c4eb756acb5897baa99c + common.actions.save: d3270bdb8d2c1caaca4178dbe19be03a + common.actions.edit: ef485eb67ac89238a4fede745a0ae94c + common.actions.delete: 5b5c9f9dc839dcc858b3c4371b014930 + common.actions.cancel: 847607d75e504090b5aff16a6e6c8351 + common.actions.clear: 476e7d19b5be911bd99a3de6c31771d1 + common.actions.create: 4f74549a5b17e88d7dd15b2fd7789a59 + common.actions.send: 30cc00aea30ec70b7c1292b6458181c0 + common.actions.return: e52ece59a8a5b16a2c9fe070ac32c3fe + common.actions.success: 560650554df187b9bf972d95229b8b15 + common.actions.error: 902b0d55fddef6f8d651fe1035b7d4bd + common.actions.next: 1ffed09a945050b91aa1f46c7dd45087 + common.actions.complete: 8d7c2bd0727190e37da6f27a86205b2b + common.assignee.label: c6bed77956f79c7a9657a15f010a773f + common.assignee.placeholder: e262b3b4d20573cbdcb5b3adef9660de + common.date.pick: bd29a1cd952610bfeeb0b02ca164aebd + common.date.due_date: 1cbb3bd12a8661902fe6eb8983e9bb6b + common.status.open: 12ec8f316bcb560d33dd087ecfa68fc0 + common.status.pending: 17fd638337290609a7ae308115a63611 + common.status.closed: 4e2af90d29d253ccbcff2ce2b459c9ae + common.status.archived: 1d0d86348d657b60e5f8cc3cc3bc37f3 + common.status.compliant: 447b6bc7e7847f0abe61d2869edf9015 + common.status.non_compliant: 6875f1e57c0dabd95fd3a872414e3e4a + common.status.not_started: a9b06b1d4b6cd8b230a54306a318fd42 + common.status.in_progress: 5af8d2e40ce41d4dcbe8306a9a1c9c6e + common.status.published: 1f10a7861d15aaf098ad564a7d8a9506 + common.status.needs_review: 906a777038d2ebda5738cd53a71e74ae + common.status.draft: a1c7b53d72d9db871a2f3ea94d06f113 + common.status.not_assessed: 873ff59465c27a78413d843b190a5919 + common.status.assessed: 3a752f70d3615e5edc52168cb4819e49 + common.status.active: ca49d6ff0b13ddea1e094ce3420b279d + common.status.inactive: 5b6532a325ae02229cfaeab843a2a682 + common.filters.clear: af85d57c83ad1d84bce2c9b15c24f23f + common.filters.search: 7ae8b43332fae10e1930f45401046425 + common.filters.status: 3397e69cce37e37c8605f57b367d6b33 + common.filters.department: 8295f968e1676d62158d33a57b26963b + common.filters.owner.label: c6bed77956f79c7a9657a15f010a773f + common.filters.owner.placeholder: 7c3c087d24211c351e870e9b836aa166 + common.table.title: 09b79d379db0c82b4615d749b22475f0 + common.table.status: 3397e69cce37e37c8605f57b367d6b33 + common.table.assigned_to: c6bed77956f79c7a9657a15f010a773f + common.table.due_date: 1cbb3bd12a8661902fe6eb8983e9bb6b + common.table.last_updated: 00a700d0871cf1500c833c9f73062250 + common.table.no_results: 3fcc064a645e61dd3d642ff1e52b3754 + common.empty_states.no_results.title: 08cc2aa4ba9453e2c51af3d4d621e3f5 + common.empty_states.no_results.title_tasks: 51160346497dd7744ce81258b3c405c7 + common.empty_states.no_results.title_risks: 62e0e8d16ec115a0731c00d6ad229541 + common.empty_states.no_results.description: 96e17a898f418a572561fef5284fd7c8 + common.empty_states.no_results.description_filters: 96e17a898f418a572561fef5284fd7c8 + common.empty_states.no_results.description_no_tasks: c55852211c6ff8a81e27eef485055c59 + common.empty_states.no_results.description_no_risks: d2a2fdeed9b560c7e88edc3796bc1609 + common.empty_states.no_items.title: 75993eb72edfb39dd53a38a56e92f678 + common.empty_states.no_items.description: e0591e3b836afdf0de7a705061610bc9 + common.pagination.of: 5f02f0889301fd7be1ac972c11bf3e7d + common.pagination.items_per_page: 4e2c07359b02a88b897029fc23506a5b + common.pagination.rows_per_page: 0cdfc20f48b9b095456ddcf01c9145aa + common.pagination.page_x_of_y: c18a6102c5d20acaa6d56e0cd4117fc3 + common.pagination.go_to_first_page: e67449d2dad15f8463d934da8ba59c19 + common.pagination.go_to_previous_page: 47393a1a90500772329cce74b628d948 + common.pagination.go_to_next_page: 83fc9e8dae730acca1538378cc9b09dd + common.pagination.go_to_last_page: 1bbcb7318f62d1a2289d6d71879901de + common.comments.title: 30045922163d87daf194d9bcb2aa8ac4 + common.comments.description: b2aae6f8b735bef7bf0246d1ead17d49 + common.comments.add: d7c0f6427402512c742347babca1f0c2 + common.comments.new: 1cedf59ff856d0c6293af4e8bee06b8b + common.comments.save: d136cf0668d2d020699fe6aa3bdebb25 + common.comments.success: b175901ef041b80825390b2f1a8180ae + common.comments.error: 449bd40e8f1eede9f9a957a11e1d4fda + common.comments.placeholder: 9351a1212cd1b53e72b6a31769fffe44 + common.comments.empty.title: 98a81265d2761078a38b37e7d2cda68f + common.comments.empty.description: c5d9c882ed4c78ea628afd9db3146b30 + common.attachments.title: 3c675ef97f2e8c747c72f7e29e75ca03 + common.attachments.description: edc822d92ea10ec0c78724263095e13a + common.attachments.upload: 66faa15820a6155e9c4cb66df196a86d + common.attachments.upload_description: 0b405ecac1cebf12c53fb1a94ac63f5f + common.attachments.drop: c7792783b2de81d23da293c491c72be6 + common.attachments.drop_description: ee8213173b9a1fd5b98545b83491bfd9 + common.attachments.drop_files_description: 073e9438c8729438e3a268a551ae479c + common.attachments.empty.title: 2e5ced3a75e0ff843189c6f835c5625b + common.attachments.empty.description: edc822d92ea10ec0c78724263095e13a + common.attachments.toasts.error: 361a117ad725951e608753f81ef12e5b + common.attachments.toasts.error_uploading_files: 2616b5cda9937ffd56c82c2cd8cbfea0 + common.attachments.toasts.error_uploading_files_multiple: 45c6c9461240d67ddafd31b03097ce6e + common.attachments.toasts.error_no_files_selected: fd5d1d03cb1f3ead611bcf5b0f91fd4e + common.attachments.toasts.error_file_rejected: 35b81afa54e5590dcf5d69e5e086edfd + common.attachments.toasts.error_failed_to_upload_files: 76374981ca7701a93226d3647db20f5e + common.attachments.toasts.error_failed_to_upload_files_multiple: 76374981ca7701a93226d3647db20f5e + common.attachments.toasts.error_failed_to_upload_files_single: 1114768d410514b0fcdb14f27948fdd7 + common.attachments.toasts.success_uploading_files: d3ff7960a885465625c95198731ab5ee + common.attachments.toasts.success_uploading_files_multiple: d3ff7960a885465625c95198731ab5ee + common.attachments.toasts.success_uploading_files_single: 89cf650484c02f327f925bc1c573f33a + common.attachments.toasts.success_uploading_files_target: ae773c93e2011f8c9b7856cc8eea060d + common.attachments.toasts.uploading_files: 150272cacb23559b293696a7d6fc3ec3 + common.attachments.toasts.remove_file: b586f93a2f8ee26c7fbe0276475aa277 + header.discord.button: bb1d159e917b3b1f930b1a94546e284e + header.feedback.button: 30045922163d87daf194d9bcb2aa8ac4 + header.feedback.title: 655af1f75ab10f676b65f8eb1ab9f500 + header.feedback.description: 72eeffe43e7bb9c2d60a9696767c9c35 + header.feedback.placeholder: 8c97d3fd1885ff7d2ace81ff70cb051a + header.feedback.success: 655af1f75ab10f676b65f8eb1ab9f500 + header.feedback.error: 71cf23dcb04bfc5d324f0e482e046ca3 + header.feedback.send: 3ad5963e1a2d72cb72bdb3ab3110ff1a + not_found.title: d51c5646e3ecaecea876a931be98d0a6 + not_found.description: 76296f2db5b7725bf728b49b5ab61f6b + not_found.return: 5cee76a8c096296dfb17f29e248dc6b1 + theme.options.light: abfd24adfebef98d653b605aa62baf2f + theme.options.dark: e453a886a3295deb0ede87645ede5646 + theme.options.system: b431d1485aa37ae09fa4bfa7883356ca + sidebar.overview: 8332fbec31ac4a3cd9d819230e7a6087 + sidebar.policies: 4baeafc5b98154e818683d92ca8db26e + sidebar.risk: 3620a2f5d04be0ef2ecd685297baf1d3 + sidebar.vendors: 915a50509a5b968903bdb788f448639e + sidebar.integrations: adcecead84f6cfdbff4dcbf48f3042f8 + sidebar.settings: 4d3c4eb9f350e268f00f8097de526194 + sidebar.evidence: 2588e6aa8938f60682e23b2f6fb0d4ee + auth.title: 5fc2b1a1eed0a1823159ab106f2aed7e + auth.description: 6a082bb3b49331c16f102861ff2ab31d + auth.options: ef4e58e8acedb82c35fed30955ca137c + auth.google: 81e754bba3423b76f625af09bb1fcf2c + auth.email.description: 1ffb6589352c18ddd6fc586036f2e7b2 + auth.email.placeholder: ef2fc7b5a10529a04fa8f06b3f5b9581 + auth.email.button: b717acee66cb275bea78b19c5c6133b7 + auth.email.magic_link_sent: b53dd0e981aa51e21b23ede8579a03be + auth.email.magic_link_description: b6e4cc34ca6d3fa8ad455ed567717032 + auth.email.magic_link_try_again: 0186c3c01b4329be8b889c2b85c564a0 + auth.email.success: 4b79b5012aab181d9a3e4f0eb7a34ba5 + auth.email.error: b438025bbb832d1ae0e569d74fe8aa2d + auth.terms: c0cbd618f8f3bfaa7c895c1a6bd05945 + onboarding.title: 0661b25bd7c77c70e4d7b0a930aee5b8 + onboarding.setup: 1a0150117e807caf279cde8bdf66f406 + onboarding.description: 8bc7d119900568c15836bfa5dfc80a8e + onboarding.fields.name.label: f57583eb2f3841ce79b704a8e945a8ac + onboarding.fields.name.placeholder: 7f68a09fe2691b6ed382f6dff70d906d + onboarding.fields.website.label: f95f0517fa32b80cd16325c4c28291b3 + onboarding.fields.website.placeholder: 82d35d943316a67baaf429734ff1528c + onboarding.success: f754711017865b6d8cd17ac78bf990b7 + onboarding.error: 361a117ad725951e608753f81ef12e5b + overview.title: 8332fbec31ac4a3cd9d819230e7a6087 + overview.framework_chart.title: 28ab94749a075e5c0485994bf71de1ae + overview.requirement_chart.title: 81ebb7d71c25f790c417c8c8c1f9bffe + policies.dashboard.title: b8da6df14bf06283cbf588df6998722e + policies.dashboard.all: 0357f080f91c24ea0f233561ef828c40 + policies.dashboard.policy_status: 298f1b71d8b4fcce6f3e3c01c29fe63f + policies.dashboard.policies_by_assignee: 75943a8ff82717510e319689202ceba1 + policies.dashboard.policies_by_framework: 8c3cb8aef0c46f5eb836ebc877372811 + policies.table.name: c44a478ab23a921aac17d69e34bcba6d + policies.table.statuses.draft: a1c7b53d72d9db871a2f3ea94d06f113 + policies.table.statuses.published: 1f10a7861d15aaf098ad564a7d8a9506 + policies.table.filters.owner.label: 14c125d88444bd12e79ddb959d69c14e + policies.table.filters.owner.placeholder: 7c3c087d24211c351e870e9b836aa166 + policies.filters.search: 3214ab7f38a0af1eb4474df80c652d9f + policies.filters.all: 0357f080f91c24ea0f233561ef828c40 + policies.status.draft: a1c7b53d72d9db871a2f3ea94d06f113 + policies.status.published: 1f10a7861d15aaf098ad564a7d8a9506 + policies.status.needs_review: 906a777038d2ebda5738cd53a71e74ae + policies.policies: b1dc11822e33e5f1ecb29739878bb048 + evidence_tasks.evidence_tasks: 2588e6aa8938f60682e23b2f6fb0d4ee + evidence_tasks.overview: 8332fbec31ac4a3cd9d819230e7a6087 + risk.risks: 3624933eae9a60f077f9f2954c813828 + risk.overview: 8332fbec31ac4a3cd9d819230e7a6087 + risk.create: f1fc49a78264b7beca09b3932c6b9df6 + risk.vendor.title: 2986d415899d6faed8ad189f31a432aa + risk.vendor.dashboard.title: 9c03a54994928ce527a3599fe438a2c4 + risk.vendor.dashboard.overview: b5c8e712154fbd4d85ea2da1d22e57cf + risk.vendor.dashboard.vendor_status: 4045c50fafbf976963b2abe2ff758864 + risk.vendor.dashboard.vendor_category: b6bac422c578f759975cdccf39de2401 + risk.vendor.dashboard.vendors_by_assignee: 5a661e089c7124696f959a6b0cc29606 + risk.vendor.dashboard.inherent_risk_description: 2551381346d2c58885e11d2b8b988301 + risk.vendor.dashboard.residual_risk_description: b3df7c33bb9576f3e99f490c3ceac25f + risk.vendor.register.title: 5ff135435abe7b7a293282727d1d0248 + risk.vendor.register.table.name: 4777bbaaa0aebe104606b77947d0e22d + risk.vendor.register.table.category: 624c6b241d2d14bbd285596ffcf2a9e7 + risk.vendor.register.table.status: 3397e69cce37e37c8605f57b367d6b33 + risk.vendor.register.table.owner: 5f4d7cc1e658cea56da01b8945cec7d4 + risk.vendor.assessment.title: 7a104cdaf33ccdf2565b1856d2e39749 + risk.vendor.assessment.update_success: 63b1bd53b84ea7522e3e0462079ad004 + risk.vendor.assessment.update_error: f2453d2c74e4afe1a3dd461b67e554e1 + risk.vendor.assessment.inherent_risk: 841ad642101241bfb5a8e178d505d45a + risk.vendor.assessment.residual_risk: f3f3dd8b7ec390eb4b092758e8511269 + risk.vendor.form.vendor_details: a6493f216f4fccd070e4283ea652aa7a + risk.vendor.form.vendor_name: 4777bbaaa0aebe104606b77947d0e22d + risk.vendor.form.vendor_name_placeholder: f9724e7045086b3ba9b4579232b8c657 + risk.vendor.form.vendor_website: f95f0517fa32b80cd16325c4c28291b3 + risk.vendor.form.vendor_website_placeholder: 7850594aa937003e92139bd06c21396a + risk.vendor.form.vendor_description: ef918abfb53ea5bc4fde3764e4c199de + risk.vendor.form.vendor_description_placeholder: 4f0a6bc526ccf5985a69f595752b9f4e + risk.vendor.form.vendor_category: 624c6b241d2d14bbd285596ffcf2a9e7 + risk.vendor.form.vendor_category_placeholder: 9d74ee624d873cf13b64ee6aaed38bd8 + risk.vendor.form.vendor_status: 3397e69cce37e37c8605f57b367d6b33 + risk.vendor.form.vendor_status_placeholder: 4b432aae41faef3522bb0e16fa153e13 + risk.vendor.form.create_vendor_success: a225a3cf6ff8391735995a65c1b21542 + risk.vendor.form.create_vendor_error: eb9bdcae80e3274f478817d7a17f312c + risk.vendor.form.update_vendor: af068734645c7aa74b0659036246140a + risk.vendor.form.update_vendor_success: 4041caa00cdc188548d38d48be182f46 + risk.vendor.form.update_vendor_error: 82abe2e9169f9d3e5eabd0ffc4ee516f + risk.vendor.form.add_comment: d7c0f6427402512c742347babca1f0c2 + risk.vendor.table.name: 4777bbaaa0aebe104606b77947d0e22d + risk.vendor.table.category: 624c6b241d2d14bbd285596ffcf2a9e7 + risk.vendor.table.status: 3397e69cce37e37c8605f57b367d6b33 + risk.vendor.table.owner: 5f4d7cc1e658cea56da01b8945cec7d4 + risk.vendor.filters.search_placeholder: adefd23455f549bc301539d1f53941f8 + risk.vendor.filters.status_placeholder: b2d2be0f8cb7837bb5071ca1aac2e7dd + risk.vendor.filters.category_placeholder: fa395f277d79168d098cddebc1571864 + risk.vendor.filters.owner_placeholder: 5dcb2b8638fb2a00d999196414631ddd + risk.vendor.empty_states.no_vendors.title: bef550dbe6740bf746c41e7979896ed4 + risk.vendor.empty_states.no_vendors.description: c2303c495a5f1108062ae465394612c2 + risk.vendor.empty_states.no_results.title: 3fcc064a645e61dd3d642ff1e52b3754 + risk.vendor.empty_states.no_results.description: 5d3f1d31cec631239093a8da2e0c67aa + risk.vendor.empty_states.no_results.description_with_filters: b8662468f89ba12988a84dfbe186d959 + risk.vendor.actions.create: d0d6becbf94f98e981cc47b89b0ab1d6 + risk.vendor.status.not_assessed: 873ff59465c27a78413d843b190a5919 + risk.vendor.status.in_progress: 5af8d2e40ce41d4dcbe8306a9a1c9c6e + risk.vendor.status.assessed: 3a752f70d3615e5edc52168cb4819e49 + risk.vendor.category.cloud: 5c34769796428a071fefe395e879ead6 + risk.vendor.category.infrastructure: 4d1cdbb44a7d5e92555c45767478ba8c + risk.vendor.category.software_as_a_service: bd72a2b5c79769563d8bda8ef0482592 + risk.vendor.category.finance: c989712e880443a42d6e891e9ac1e5e8 + risk.vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b + risk.vendor.category.sales: adcc30327981bffd4f2f27d482e52e78 + risk.vendor.category.hr: 904ccf096c781e601bd74b5fbe5eb4fd + risk.vendor.category.other: c2295235a535ea3e85b7a0e5ab85afb0 + risk.vendor.risk_level.low: c3f5d0c1c069ca6c9090620a1ff3c938 + risk.vendor.risk_level.medium: d8e1f99f9ac1c9d7a6110c79daf2d7db + risk.vendor.risk_level.high: f615e2d9443eaa282c99891152c16584 + risk.vendor.risk_level.unknown: da71ed9cc9993f503aea4d64f2c5c9e2 + risk.dashboard.title: 629e199d421911b329a2909925beeb50 + risk.dashboard.overview: 26e76fbba4a3399549740e2eca1dce49 + risk.dashboard.risk_status: 830e598c54e18a5cc5b39f1d35fd7ec8 + risk.dashboard.risks_by_department: 7888a04699015e06cc29af328d5e423b + risk.dashboard.risks_by_assignee: 1ec19bb7b98e694f8948089e6f812a20 + risk.dashboard.inherent_risk_description: c9613e10af2a68cb4da908a7adc423a3 + risk.dashboard.residual_risk_description: dbcd670168c184733609234c23b2bd85 + risk.dashboard.risk_assessment_description: 30b8f812ab145f121995deb91193d4b2 + risk.register.title: 61d643869401b0def6f6e0e6e7933999 + risk.register.table.risk: 3620a2f5d04be0ef2ecd685297baf1d3 + risk.register.empty.no_risks.title: d2a2fdeed9b560c7e88edc3796bc1609 + risk.register.empty.no_risks.description: 59d96a7ae35a64898efbfb3d30c9bdf3 + risk.register.empty.create_risk: 4f2f6f3ae82433fa8e43c10678f5f762 + risk.metrics.probability: d3d5c9b1993c4b0dae7f8ee8d3e1d82e + risk.metrics.impact: 5c5a54a8bb5bb610beec1345cd62c2e9 + risk.metrics.inherentRisk: 841ad642101241bfb5a8e178d505d45a + risk.metrics.residualRisk: f3f3dd8b7ec390eb4b092758e8511269 + risk.form.update_inherent_risk: 6b8ae77751a43bceac1d9201c0f0aa94 + risk.form.update_inherent_risk_description: f8f2af5157c0a2e0ce0e0fc0cb057ff8 + risk.form.update_inherent_risk_success: be5b549489af3cf7e015eb51b03d6c34 + risk.form.update_inherent_risk_error: 809c88f1edb97468645362e9c55fd653 + risk.form.update_residual_risk: 9dac278cbcaf9fff450e1e2157dbe782 + risk.form.update_residual_risk_description: a061274d1986daf93fa530284a09d62d + risk.form.update_residual_risk_success: 3992b5db1b63cd9b708bcdfc77d0a86e + risk.form.update_residual_risk_error: 142f02264a202188b9d651f915a48ab3 + risk.form.update_risk: c3658c7b3b0c7ac09af1467c9fdda1ed + risk.form.update_risk_description: b2fa15881df6f8ccc32e11323f729a12 + risk.form.update_risk_success: 73cfa7fd713a79aa930d491e5708cd2c + risk.form.update_risk_error: 9abbfda76af7e4b8afc13f1b49de6fee + risk.form.create_risk_success: 3756811ec25fdaf619da644b06c6d8c7 + risk.form.create_risk_error: 885aa2dddd2fe6afd90fac6eea055edc + risk.form.risk_details: da8a061c175d7b3c716341be73d7423c + risk.form.risk_title: ce4c388c597e87c042bc75f127ead96d + risk.form.risk_title_description: 84c263a458392d15c99684919f1e2f20 + risk.form.risk_description: ef918abfb53ea5bc4fde3764e4c199de + risk.form.risk_description_description: 8876f07dfe8e3b9e917a2a5172118336 + risk.form.risk_category: 624c6b241d2d14bbd285596ffcf2a9e7 + risk.form.risk_category_placeholder: eef1eb3f6044522aa46e11ae63e25f31 + risk.form.risk_department: 8295f968e1676d62158d33a57b26963b + risk.form.risk_department_placeholder: 311cb58c4ec975e8a66ad3022298e64a + risk.form.risk_status: 0a627f8ea427c0e25dfc78522d5643c5 + risk.form.risk_status_placeholder: fd5662cabcd09101dfd36df3e755a2ab + risk.tasks.title: 8fa33a1f2be10005d07ff40ad5c07833 + risk.tasks.attachments: 3c675ef97f2e8c747c72f7e29e75ca03 + risk.tasks.overview: c97c3679892cd9f277a87e31f8f81de7 + risk.tasks.form.title: 061b8973c59e51c470b3f8fb43dc0a6c + risk.tasks.form.task_title: 45f740f8a769209786f678a35f304c7a + risk.tasks.form.status: 5dc811f6c15e1ee3b53a1eed289b9716 + risk.tasks.form.status_placeholder: 67782de260e8eadd7542c52ebc585bca + risk.tasks.form.task_title_description: 46d004214a5b4dcf6ba7d2f13f270940 + risk.tasks.form.description: ef918abfb53ea5bc4fde3764e4c199de + risk.tasks.form.description_description: cf292bd94791296e7a6915ed78270503 + risk.tasks.form.due_date: d152e4af87d6a196851755fc80feb3b9 + risk.tasks.form.due_date_description: b17c1659af2df64d0dd98662782581ae + risk.tasks.form.success: 3e28bb124bf2e69e269ba1a526396090 + risk.tasks.form.error: 81b6bb0707b7351093196248db51d0a3 + risk.tasks.sheet.title: ee9156ca95ea9a72b86b19e25aa1fb5f + risk.tasks.sheet.update: fdae7b5bb7c0a34bb97e38552ed1d98b + risk.tasks.sheet.update_description: 45a7233f773abc244687691805ec419c + risk.tasks.empty.description_create: 0f59a615a2666f81a343c706b605fc6a + settings.general.title: 0db377921f4ce762c62526131097968f + settings.general.org_name: 478342a6b4ea7f7168b7b8d581ec21c1 + settings.general.org_name_description: 80d33dac21009d44ea1176d249ff97d3 + settings.general.org_name_tip: 3733ffc1871bfb2f144c900911a72a94 + settings.general.org_website: f735803229ab695529f4043266591d30 + settings.general.org_website_description: 10710e24d8eb1dc89475647bfd28de11 + settings.general.org_website_tip: 235b243a6e4b9d6e2546649a29eb67c3 + settings.general.org_website_error: 5db8285329a18a7f31c52124b3812692 + settings.general.org_website_updated: 1a351c5a044de9fd4b45b64d38c29b9b + settings.general.org_delete: 673c9473e892eef78b5f527de5802443 + settings.general.org_delete_description: 0388cab4a442ef5d8869103197ea46cd + settings.general.org_delete_alert_title: 8d5bcff0f9cfcc18f9b15fedea3e34f5 + settings.general.org_delete_alert_description: a8e13760bf3daed5acd6b0ac1885ba7b + settings.general.org_delete_error: 40ab06fb663838d078976dac34d6d490 + settings.general.org_delete_success: 4a9d9e89698322c279786fdaa161d126 + settings.general.org_name_updated: ebeb359367b2c914c37360f4179b5062 + settings.general.org_name_error: f9a3a64b93b513032e60c0160aec55ef + settings.general.save_button: d3270bdb8d2c1caaca4178dbe19be03a + settings.general.delete_button: 5b5c9f9dc839dcc858b3c4371b014930 + settings.general.delete_confirm: 5b346a8cc9dcda80d2877a1978b31a42 + settings.general.delete_confirm_tip: fb571cee98c6a2e3c2601c77f89e1a05 + settings.general.cancel_button: 847607d75e504090b5aff16a6e6c8351 + settings.members.title: 9ea156a3d5841bad7dc6c133f02900c6 + settings.billing.title: 8982385e6e341d53c9a2dd9ab05dd687 + user_menu.theme: f055088fba41cb53e3806e55a9f6896e + user_menu.language: d62a3259ece127d00905fbe37f1b5cea + user_menu.sign_out: 0daed4d43928c4a72d4eabff46d766fe + user_menu.account: d1ef184f21c6a19615f873478fe03462 + user_menu.support: 54532bac0cc2df67791b1e6c2c172b32 + user_menu.settings: 4d3c4eb9f350e268f00f8097de526194 + user_menu.teams: 4b511bad2c32b63ff2afb991137d1d32 + frameworks.title: dfefdb66581190514404f57cdf74a8eb + frameworks.controls.title: 26beed84513191c01e2574d317c239d0 + frameworks.controls.description: a747725909371b592a7558622b233d1d + frameworks.controls.table.status: 3397e69cce37e37c8605f57b367d6b33 + frameworks.controls.table.control: a1595abbb4c3a326636dd178757cd6c1 + frameworks.controls.table.artifacts: 669da5aa8d89fb83aea89a92341f1f4f + frameworks.controls.table.actions: a6f0cb2b955bb2e7116afe7a52e40092 + frameworks.controls.statuses.not_started: 085cdbd670e41e8db6c3523e31ae29f8 + frameworks.controls.statuses.compliant: 13bb97d7dd701fecaffced3e1acf4cb7 + frameworks.controls.statuses.non_compliant: 7cd926d7fb316da0467bfcfcbc3aab9a + vendor.title: 629e199d421911b329a2909925beeb50 + vendor.register_title: 2986d415899d6faed8ad189f31a432aa + vendor.dashboard.title: 629e199d421911b329a2909925beeb50 + vendor.dashboard.overview: bb3de3c4e54f55743ba2bada40c9487b + vendor.dashboard.vendor_status: 4045c50fafbf976963b2abe2ff758864 + vendor.dashboard.vendor_category: b6bac422c578f759975cdccf39de2401 + vendor.dashboard.vendors_by_assignee: 5a661e089c7124696f959a6b0cc29606 + vendor.dashboard.inherent_risk_description: adc69bac3a41c0c8f4d5aed95c0736ea + vendor.dashboard.residual_risk_description: 8e9d27380029e475caeda793379f9339 + vendor.register.title: 5ff135435abe7b7a293282727d1d0248 + vendor.register.table.name: 4777bbaaa0aebe104606b77947d0e22d + vendor.register.table.category: 624c6b241d2d14bbd285596ffcf2a9e7 + vendor.register.table.status: 3397e69cce37e37c8605f57b367d6b33 + vendor.register.table.owner: 5f4d7cc1e658cea56da01b8945cec7d4 + vendor.category.cloud: 5c34769796428a071fefe395e879ead6 + vendor.category.infrastructure: 4d1cdbb44a7d5e92555c45767478ba8c + vendor.category.software_as_a_service: b0ca9e41d61885345eef09f928c9ea58 + vendor.category.finance: c989712e880443a42d6e891e9ac1e5e8 + vendor.category.marketing: 7cb15e416d62919b1b40298324fbe30b + vendor.category.sales: adcc30327981bffd4f2f27d482e52e78 + vendor.category.hr: 904ccf096c781e601bd74b5fbe5eb4fd + vendor.category.other: c2295235a535ea3e85b7a0e5ab85afb0 + vendor.vendors: 8de6d4c46d616eb4c358ba6f63bb54dc + vendor.form.vendor_details: a6493f216f4fccd070e4283ea652aa7a + vendor.form.vendor_name: 4777bbaaa0aebe104606b77947d0e22d + vendor.form.vendor_name_placeholder: b606a24b2214fab9e1c6f259a559ba01 + vendor.form.vendor_website: 4a4cb60dc8cd226c68ffffe713aa9fe3 + vendor.form.vendor_website_placeholder: e046e774515750b1a12fcabd5df79cab + vendor.form.vendor_description: ef918abfb53ea5bc4fde3764e4c199de + vendor.form.vendor_description_placeholder: b3fbfaaeaa94606716b62bf1cd7ba22e + vendor.form.vendor_category: 624c6b241d2d14bbd285596ffcf2a9e7 + vendor.form.vendor_category_placeholder: 297ab1643656f9ef43abb8e42c9a287b + vendor.form.vendor_status: 3397e69cce37e37c8605f57b367d6b33 + vendor.form.vendor_status_placeholder: 25afb41654b9f9232d6d6623b6cdcdfa + vendor.form.create_vendor_success: a225a3cf6ff8391735995a65c1b21542 + vendor.form.create_vendor_error: d12b23040e2ce06fa6e97f31c0525a5b + vendor.form.update_vendor_success: 4041caa00cdc188548d38d48be182f46 + vendor.form.update_vendor_error: be1d7970075b921eda0e874aef2b5504 + vendor.form.contacts: 4f3fe63e7510bb189abd1ed92c3e3b9f + vendor.form.contact_name: 75e396b27b7e58d98b4f9ca9daed19f3 + vendor.form.contact_email: b331d5f9f3bc3a1188ba7e0dfba4dda0 + vendor.form.contact_role: c09c3be7f615b0b33f1772c61b06a15b + vendor.form.add_contact: 2f3ac23fc0f52c9a90c504857897f4cd + vendor.form.new_contact: a03d3fb25ac29632b5707076c609690a + vendor.form.min_one_contact_required: 8b223d20058218bd5e6404469451f357 + vendor.empty_states.no_vendors.title: dc57302b77376ef37fe5a5d3f116d2bb + vendor.empty_states.no_vendors.description: 2bdb9c81c6a1da378e7cf7d99008750a + vendor.empty_states.no_results.title: 3fcc064a645e61dd3d642ff1e52b3754 + vendor.empty_states.no_results.description: 675eaaaa6fb5ea24545b726a9e9ab3d1 + vendor.empty_states.no_results.description_with_filters: 245a7d071a2dbd9df604e2a5d88e5b41 + src/locales/pt.ts: + languages.es: 4c00162f37c68542a6ff4928b0a54ddc + src/locales/fr.ts: + languages.es: 6a77de34cb21ce61732b71a27825c63a + src/locales/no.ts: + languages.es: b980859f1670214519fd5cd3942dddf8 diff --git a/apps/app/src/components/locale-switch.tsx b/apps/app/src/components/locale-switch.tsx index 2914c7c7be..0f6c4b949a 100644 --- a/apps/app/src/components/locale-switch.tsx +++ b/apps/app/src/components/locale-switch.tsx @@ -1,7 +1,7 @@ "use client"; -import { useChangeLocale, useCurrentLocale } from "@/locales/client"; -import { useI18n } from "@/locales/client"; +import { useChangeLocale, useCurrentLocale, useI18n } from "@/locales/client"; +import { languages } from "@/locales/client"; import { Select, SelectContent, @@ -12,10 +12,6 @@ import { } from "@bubba/ui/select"; import { Globe } from "lucide-react"; -const languages = { - en: "English", -} as const; - export const LocaleSwitch = () => { const t = useI18n(); const locale = useCurrentLocale(); diff --git a/apps/app/src/locales/client.ts b/apps/app/src/locales/client.ts index 217a6ce37d..3bc4a7b8c5 100644 --- a/apps/app/src/locales/client.ts +++ b/apps/app/src/locales/client.ts @@ -2,14 +2,24 @@ import { createI18nClient } from "next-international/client"; -export const languages = ["en"]; - export const { + useI18n, useScopedI18n, I18nProviderClient, useCurrentLocale, useChangeLocale, - useI18n, } = createI18nClient({ en: () => import("./en"), + es: () => import("./es"), + fr: () => import("./fr"), + no: () => import("./no"), + pt: () => import("./pt"), }); + +export const languages = { + en: "English", + es: "Español", + fr: "Français", + no: "Norsk", + pt: "Português", +} as const; diff --git a/apps/app/src/locales/en.ts b/apps/app/src/locales/en.ts index 6536895456..d1adfaec0d 100644 --- a/apps/app/src/locales/en.ts +++ b/apps/app/src/locales/en.ts @@ -6,7 +6,7 @@ export default { }, languages: { en: "English", - no: "Norsk", + es: "Spanish", }, common: { actions: { diff --git a/apps/app/src/locales/es.ts b/apps/app/src/locales/es.ts new file mode 100644 index 0000000000..bcd55eebb2 --- /dev/null +++ b/apps/app/src/locales/es.ts @@ -0,0 +1,561 @@ +export default { + language: { + title: "Idiomas", + description: "Cambia el idioma utilizado en la interfaz de usuario.", + placeholder: "Seleccionar idioma" + }, + languages: { + en: "Inglés", + no: "Norsk", + es: "Español" + }, + common: { + actions: { + save: "Guardar", + edit: "Editar", + "delete": "Eliminar", + cancel: "Cancelar", + clear: "Limpiar", + create: "Crear", + send: "Enviar", + "return": "Regresar", + success: "Éxito", + error: "Error", + next: "Siguiente", + complete: "Completar" + }, + assignee: { + label: "Asignado a", + placeholder: "Seleccionar asignado" + }, + date: { + pick: "Seleccionar una fecha", + due_date: "Fecha de vencimiento" + }, + status: { + open: "Abierto", + pending: "Pendiente", + closed: "Cerrado", + archived: "Archivado", + compliant: "Cumplido", + non_compliant: "No Cumplido", + not_started: "No Iniciado", + in_progress: "En Progreso", + published: "Publicado", + needs_review: "Necesita Revisión", + draft: "Borrador", + not_assessed: "No Evaluado", + assessed: "Evaluado", + active: "Activo", + inactive: "Inactivo" + }, + filters: { + clear: "Limpiar filtros", + search: "Buscar...", + status: "Estado", + department: "Departamento", + owner: { + label: "Asignado a", + placeholder: "Filtrar por asignado" + } + }, + table: { + title: "Título", + status: "Estado", + assigned_to: "Asignado a", + due_date: "Fecha de vencimiento", + last_updated: "Última Actualización", + no_results: "No se encontraron resultados" + }, + empty_states: { + no_results: { + title: "Sin resultados", + title_tasks: "No se encontraron tareas", + title_risks: "No se encontraron riesgos", + description: "Intenta otra búsqueda o ajusta los filtros", + description_filters: "Intenta otra búsqueda o ajusta los filtros", + description_no_tasks: "Crea una tarea para comenzar", + description_no_risks: "Crea un riesgo para comenzar" + }, + no_items: { + title: "No se encontraron elementos", + description: "Intenta ajustar tu búsqueda o filtros" + } + }, + pagination: { + of: "de", + items_per_page: "Elementos por página", + rows_per_page: "Filas por página", + page_x_of_y: "Página {{current}} de {{total}}", + go_to_first_page: "Ir a la primera página", + go_to_previous_page: "Ir a la página anterior", + go_to_next_page: "Ir a la siguiente página", + go_to_last_page: "Ir a la última página" + }, + comments: { + title: "Comentarios", + description: "Agrega un comentario usando el formulario a continuación.", + add: "Agregar Comentario", + "new": "Nuevo Comentario", + save: "Guardar Comentario", + success: "Comentario agregado con éxito", + error: "Error al agregar el comentario", + placeholder: "Escribe tu comentario aquí...", + empty: { + title: "Sin comentarios aún", + description: "Sé el primero en agregar un comentario" + } + }, + attachments: { + title: "Adjuntos", + description: "Agrega un archivo haciendo clic en 'Agregar Adjunto'.", + upload: "Subir un adjunto", + upload_description: "Sube un adjunto o agrega un enlace a un recurso externo.", + drop: "Suelta los archivos aquí", + drop_description: "Suelta archivos aquí o haz clic para elegir archivos de tu dispositivo.", + drop_files_description: "Los archivos pueden ser de hasta ", + empty: { + title: "Sin adjuntos", + description: "Agrega un archivo haciendo clic en 'Agregar Adjunto'." + }, + toasts: { + error: "Algo salió mal, por favor intenta de nuevo.", + error_uploading_files: "No se puede subir más de 1 archivo a la vez", + error_uploading_files_multiple: "No se pueden subir más de 10 archivos", + error_no_files_selected: "No se seleccionaron archivos", + error_file_rejected: "El archivo {file} fue rechazado", + error_failed_to_upload_files: "Error al subir archivos", + error_failed_to_upload_files_multiple: "Error al subir archivos", + error_failed_to_upload_files_single: "Error al subir el archivo", + success_uploading_files: "Archivos subidos con éxito", + success_uploading_files_multiple: "Archivos subidos con éxito", + success_uploading_files_single: "Archivo subido con éxito", + success_uploading_files_target: "Archivos subidos", + uploading_files: "Subiendo {target}...", + remove_file: "Eliminar archivo" + } + } + }, + header: { + discord: { + button: "Únete a nosotros en Discord" + }, + feedback: { + button: "Comentarios", + title: "¡Gracias por tus comentarios!", + description: "Volveremos contigo lo antes posible", + placeholder: "Ideas para mejorar esta página o problemas que estás experimentando.", + success: "¡Gracias por tus comentarios!", + error: "Error al enviar comentarios - ¿intentar de nuevo?", + send: "Enviar Comentarios" + } + }, + not_found: { + title: "404 - Página no encontrada", + description: "La página que buscas no existe.", + "return": "Regresar al panel" + }, + theme: { + options: { + light: "Claro", + dark: "Oscuro", + system: "Sistema" + } + }, + sidebar: { + overview: "Resumen", + policies: "Políticas", + risk: "Riesgo", + vendors: "Proveedores", + integrations: "Integraciones", + settings: "Configuraciones", + evidence: "Tareas de Evidencia" + }, + auth: { + title: "Automatiza el cumplimiento de SOC 2, ISO 27001 y GDPR con IA.", + description: "Crea una cuenta gratuita o inicia sesión con una cuenta existente para continuar.", + options: "Más opciones", + google: "Continuar con Google", + email: { + description: "Ingresa tu dirección de correo electrónico para continuar.", + placeholder: "Ingresa la dirección de correo electrónico", + button: "Continuar con correo electrónico", + magic_link_sent: "Enlace mágico enviado", + magic_link_description: "Revisa tu bandeja de entrada para un enlace mágico.", + magic_link_try_again: "Intenta de nuevo.", + success: "Correo enviado - ¡revisa tu bandeja de entrada!", + error: "Error al enviar el correo - ¿intentar de nuevo?" + }, + terms: "Al hacer clic en continuar, reconoces que has leído y aceptas los Términos de Servicio y la Política de Privacidad." + }, + onboarding: { + title: "Crear una organización", + setup: "Configuración", + description: "Cuéntanos un poco sobre tu organización.", + fields: { + name: { + label: "Nombre de la Organización", + placeholder: "El nombre de tu organización" + }, + website: { + label: "Sitio Web", + placeholder: "El sitio web de tu organización" + } + }, + success: "¡Gracias, estás listo!", + error: "Algo salió mal, por favor intenta de nuevo." + }, + overview: { + title: "Resumen", + framework_chart: { + title: "Progreso del Marco" + }, + requirement_chart: { + title: "Estado de Cumplimiento" + } + }, + policies: { + dashboard: { + title: "Panel", + all: "Todas las Políticas", + policy_status: "Estado de la Política", + policies_by_assignee: "Políticas por Asignado", + policies_by_framework: "Políticas por Marco" + }, + table: { + name: "Nombre de la Política", + statuses: { + draft: "Borrador", + published: "Publicado" + }, + filters: { + owner: { + label: "Asignado", + placeholder: "Filtrar por asignado" + } + } + }, + filters: { + search: "Buscar políticas...", + all: "Todas las Políticas" + }, + status: { + draft: "Borrador", + published: "Publicado", + needs_review: "Necesita Revisión" + }, + policies: "políticas" + }, + evidence_tasks: { + evidence_tasks: "Tareas de Evidencia", + overview: "Resumen" + }, + risk: { + risks: "riesgos", + overview: "Resumen", + create: "Crear Nuevo Riesgo", + vendor: { + title: "Gestión de Proveedores", + dashboard: { + title: "Panel de Proveedores", + overview: "Resumen de Proveedores", + vendor_status: "Estado del Proveedor", + vendor_category: "Categorías de Proveedores", + vendors_by_assignee: "Proveedores por Asignado", + inherent_risk_description: "Nivel de riesgo inicial antes de aplicar controles", + residual_risk_description: "Nivel de riesgo restante después de aplicar controles" + }, + register: { + title: "Registro de Proveedores", + table: { + name: "Nombre", + category: "Categoría", + status: "Estado", + owner: "Propietario" + } + }, + assessment: { + title: "Evaluación de Proveedores", + update_success: "Evaluación de riesgo del proveedor actualizada con éxito", + update_error: "Error al actualizar la evaluación de riesgo del proveedor", + inherent_risk: "Riesgo Inherente", + residual_risk: "Riesgo Residual" + }, + form: { + vendor_details: "Detalles del Proveedor", + vendor_name: "Nombre", + vendor_name_placeholder: "Ingresa el nombre del proveedor", + vendor_website: "Sitio Web", + vendor_website_placeholder: "Ingresa el sitio web del proveedor", + vendor_description: "Descripción", + vendor_description_placeholder: "Ingresa la descripción del proveedor", + vendor_category: "Categoría", + vendor_category_placeholder: "Selecciona categoría", + vendor_status: "Estado", + vendor_status_placeholder: "Selecciona estado", + create_vendor_success: "Proveedor creado con éxito", + create_vendor_error: "Error al crear proveedor", + update_vendor: "Actualizar Proveedor", + update_vendor_success: "Proveedor actualizado con éxito", + update_vendor_error: "Error al actualizar proveedor", + add_comment: "Agregar Comentario" + }, + table: { + name: "Nombre", + category: "Categoría", + status: "Estado", + owner: "Propietario" + }, + filters: { + search_placeholder: "Buscar proveedores...", + status_placeholder: "Filtrar por estado", + category_placeholder: "Filtrar por categoría", + owner_placeholder: "Filtrar por propietario" + }, + empty_states: { + no_vendors: { + title: "Sin proveedores aún", + description: "Comienza creando tu primer proveedor" + }, + no_results: { + title: "No se encontraron resultados", + description: "No hay proveedores que coincidan con tu búsqueda", + description_with_filters: "Intenta ajustar tus filtros" + } + }, + actions: { + create: "Crear Proveedor" + }, + status: { + not_assessed: "No Evaluado", + in_progress: "En Progreso", + assessed: "Evaluado" + }, + category: { + cloud: "Nube", + infrastructure: "Infraestructura", + software_as_a_service: "Software como Servicio", + finance: "Finanzas", + marketing: "Marketing", + sales: "Ventas", + hr: "RRHH", + other: "Otro" + }, + risk_level: { + low: "Bajo Riesgo", + medium: "Riesgo Medio", + high: "Alto Riesgo", + unknown: "Riesgo Desconocido" + } + }, + dashboard: { + title: "Tablero", + overview: "Resumen de Riesgos", + risk_status: "Estado de Riesgo", + risks_by_department: "Riesgos por Departamento", + risks_by_assignee: "Riesgos por Asignado", + inherent_risk_description: "El riesgo inherente se calcula como probabilidad * impacto. Calculado antes de aplicar cualquier control.", + residual_risk_description: "El riesgo residual se calcula como probabilidad * impacto. Este es el nivel de riesgo después de aplicar controles.", + risk_assessment_description: "Compara los niveles de riesgo inherente y residual" + }, + register: { + title: "Registro de Riesgos", + table: { + risk: "Riesgo" + }, + empty: { + no_risks: { + title: "Crea un riesgo para comenzar", + description: "Rastrea y puntúa riesgos, crea y asigna tareas de mitigación para tu equipo, y gestiona tu registro de riesgos todo en una interfaz simple." + }, + create_risk: "Crear un riesgo" + } + }, + metrics: { + probability: "Probabilidad", + impact: "Impacto", + inherentRisk: "Riesgo Inherente", + residualRisk: "Riesgo Residual" + }, + form: { + update_inherent_risk: "Guardar Riesgo Inherente", + update_inherent_risk_description: "Actualiza el riesgo inherente del riesgo. Este es el nivel de riesgo antes de aplicar cualquier control.", + update_inherent_risk_success: "Riesgo inherente actualizado con éxito", + update_inherent_risk_error: "Error al actualizar el riesgo inherente", + update_residual_risk: "Guardar Riesgo Residual", + update_residual_risk_description: "Actualiza el riesgo residual del riesgo. Este es el nivel de riesgo después de aplicar controles.", + update_residual_risk_success: "Riesgo residual actualizado con éxito", + update_residual_risk_error: "Error al actualizar el riesgo residual", + update_risk: "Actualizar Riesgo", + update_risk_description: "Actualiza el título o la descripción del riesgo.", + update_risk_success: "Riesgo actualizado con éxito", + update_risk_error: "Error al actualizar el riesgo", + create_risk_success: "Riesgo creado con éxito", + create_risk_error: "Error al crear riesgo", + risk_details: "Detalles del Riesgo", + risk_title: "Título del Riesgo", + risk_title_description: "Ingresa un nombre para el riesgo", + risk_description: "Descripción", + risk_description_description: "Ingresa una descripción para el riesgo", + risk_category: "Categoría", + risk_category_placeholder: "Selecciona una categoría", + risk_department: "Departamento", + risk_department_placeholder: "Selecciona un departamento", + risk_status: "Estado del Riesgo", + risk_status_placeholder: "Selecciona un estado de riesgo" + }, + tasks: { + title: "Tareas", + attachments: "Adjuntos", + overview: "Resumen de Tareas", + form: { + title: "Detalles de la Tarea", + task_title: "Título de la Tarea", + status: "Estado de la Tarea", + status_placeholder: "Selecciona un estado de tarea", + task_title_description: "Ingresa un nombre para la tarea", + description: "Descripción", + description_description: "Ingresa una descripción para la tarea", + due_date: "Fecha de Vencimiento", + due_date_description: "Selecciona la fecha de vencimiento para la tarea", + success: "Tarea creada con éxito", + error: "Error al crear tarea" + }, + sheet: { + title: "Crear Tarea", + update: "Actualizar Tarea", + update_description: "Actualiza el título o la descripción de la tarea." + }, + empty: { + description_create: "Crea una tarea de mitigación para este riesgo, añade un plan de tratamiento y asígnala a un miembro del equipo." + } + } + }, + settings: { + general: { + title: "General", + org_name: "Nombre de la organización", + org_name_description: "Este es el nombre visible de tu organización. Debes usar el nombre legal de tu organización.", + org_name_tip: "Por favor, usa un máximo de 32 caracteres.", + org_website: "Sitio Web de la Organización", + org_website_description: "Esta es la URL del sitio web oficial de tu organización. Asegúrate de incluir la URL completa con https://.", + org_website_tip: "Por favor, ingresa una URL válida que incluya https://", + org_website_error: "Error al actualizar el sitio web de la organización", + org_website_updated: "Sitio web de la organización actualizado", + org_delete: "Eliminar organización", + org_delete_description: "Elimina permanentemente tu organización y todo su contenido de la plataforma Comp AI. Esta acción no es reversible; por favor, procede con precaución.", + org_delete_alert_title: "¿Está absolutamente seguro?", + org_delete_alert_description: "Esta acción no se puede deshacer. Esto eliminará permanentemente su organización y eliminará sus datos de nuestros servidores.", + org_delete_error: "Error al eliminar la organización", + org_delete_success: "Organización eliminada", + org_name_updated: "Nombre de la organización actualizado", + org_name_error: "Error al actualizar el nombre de la organización", + save_button: "Guardar", + delete_button: "Eliminar", + delete_confirm: "ELIMINAR", + delete_confirm_tip: "Escriba ELIMINAR para confirmar.", + cancel_button: "Cancelar" + }, + members: { + title: "Miembros" + }, + billing: { + title: "Facturación" + } + }, + user_menu: { + theme: "Tema", + language: "Idioma", + sign_out: "Cerrar sesión", + account: "Cuenta", + support: "Soporte", + settings: "Configuraciones", + teams: "Equipos" + }, + frameworks: { + title: "Marcos", + controls: { + title: "Controles", + description: "Revisar y gestionar controles de cumplimiento", + table: { + status: "Estado", + control: "Control", + artifacts: "Artefactos", + actions: "Acciones" + }, + statuses: { + not_started: "No iniciado", + compliant: "Cumplimiento", + non_compliant: "No cumplimiento" + } + } + }, + vendor: { + title: "Tablero", + register_title: "Gestión de Proveedores", + dashboard: { + title: "Tablero", + overview: "Resumen del Proveedor", + vendor_status: "Estado del Proveedor", + vendor_category: "Categorías de Proveedores", + vendors_by_assignee: "Proveedores por Asignado", + inherent_risk_description: "Nivel de riesgo inicial antes de que se apliquen controles", + residual_risk_description: "Nivel de riesgo restante después de que se apliquen controles" + }, + register: { + title: "Registro de Proveedores", + table: { + name: "Nombre", + category: "Categoría", + status: "Estado", + owner: "Propietario" + } + }, + category: { + cloud: "Nube", + infrastructure: "Infraestructura", + software_as_a_service: "SaaS", + finance: "Finanzas", + marketing: "Marketing", + sales: "Ventas", + hr: "RRHH", + other: "Otro" + }, + vendors: "proveedores", + form: { + vendor_details: "Detalles del Proveedor", + vendor_name: "Nombre", + vendor_name_placeholder: "Ingrese el nombre del proveedor", + vendor_website: "Sitio web", + vendor_website_placeholder: "Ingrese el sitio web del proveedor", + vendor_description: "Descripción", + vendor_description_placeholder: "Ingrese la descripción del proveedor", + vendor_category: "Categoría", + vendor_category_placeholder: "Seleccione la categoría", + vendor_status: "Estado", + vendor_status_placeholder: "Seleccione el estado", + create_vendor_success: "Proveedor creado con éxito", + create_vendor_error: "Error al crear el proveedor", + update_vendor_success: "Proveedor actualizado con éxito", + update_vendor_error: "Error al actualizar el proveedor", + contacts: "Contactos del Proveedor", + contact_name: "Nombre del Contacto", + contact_email: "Correo Electrónico del Contacto", + contact_role: "Rol del Contacto", + add_contact: "Agregar Contacto", + new_contact: "Nuevo Contacto", + min_one_contact_required: "Un proveedor debe tener al menos un contacto" + }, + empty_states: { + no_vendors: { + title: "Aún no hay proveedores", + description: "Comience creando su primer proveedor" + }, + no_results: { + title: "No se encontraron resultados", + description: "No hay proveedores que coincidan con su búsqueda", + description_with_filters: "Intente ajustar sus filtros" + } + } + } +} as const; diff --git a/apps/app/src/locales/fr.ts b/apps/app/src/locales/fr.ts new file mode 100644 index 0000000000..f8676f9816 --- /dev/null +++ b/apps/app/src/locales/fr.ts @@ -0,0 +1,5 @@ +export default { + languages: { + es: "Espagnol" + } +} as const; diff --git a/apps/app/src/locales/no.ts b/apps/app/src/locales/no.ts index 8e7a2eb92a..90b98928ad 100644 --- a/apps/app/src/locales/no.ts +++ b/apps/app/src/locales/no.ts @@ -1,209 +1,5 @@ export default { - language: { - title: "Språk", - description: "Endre språket brukt i brukergrensesnittet.", - placeholder: "Velg språk", - }, languages: { - en: "Engelsk", - no: "Norsk", - }, - header: { - feedback: { - button: "Tilbakemelding", - title: "Takk for tilbakemeldingen!", - description: "Vi vil være tilbake med deg så snart som mulig", - placeholder: - "Ideer for å forbedre denne siden eller problemer du er opplever.", - send: "Send", - success: "Takk for tilbakemeldingen!", - error: "Feil ved sending av tilbakemelding - prøv igjen?", - }, - }, - theme: { - options: { - light: "Lys", - dark: "Mørk", - system: "System", - }, - }, - sidebar: { - overview: "Oversikt", - risk: "Risiko", - settings: "Innstillinger", - }, - common: { - save: "Lagre", - edit: "Rediger", - }, - auth: { - title: "Automatiser SOC 2, ISO 27001 og GDPR-samsvar med AI.", - description: - "Opprett en gratis konto eller logg inn med en eksisterende konto for å fortsette.", - options: "Mer alternativer", - google: "Logg inn med Google", - email: { - description: "Skriv inn din e-postadresse for å fortsette.", - placeholder: "Skriv inn e-postadresse", - button: "Logg inn med e-post", - magic_link_sent: "Magisk lenke sendt", - magic_link_description: "Sjekk e-posten din for en magisk lenke.", - magic_link_try_again: "Prøv igjen.", - success: "E-post sendt - sjekk e-posten din!", - error: "Feil ved sending av e-post - prøv igjen?", - }, - terms: - "Ved å klikke på continue, bekrefter du at du har lest og samtykker til vilkårene for tjenesten og personvernpolitisen.", - }, - overview: { - title: "Oversikt", - framework_chart: { - title: "Framework Progress", - }, - requirement_chart: { - title: "Kravstatus", - not_started: "Ikke startet", - in_progress: "Under arbeid", - compliant: "Samsvar", - }, - }, - risk: { - risks: "risikoer", - dashboard: { - title: "Dashboard", - risk_status: "Risiko Status", - risks_by_department: "Risikoer per avdeling", - risks_by_assignee: "Risikoer per ansvarlig", - risk_status_chart: { - open: "Åpen", - pending: "Ventende", - closed: "Lukket", - archived: "Arkivert", - }, - inherent_risk_description: - "Inherent risiko er beregnet som sannsynlighet * påvirkning. Dette er risikoen før kontroller er anvendt.", - residual_risk_description: - "Residual risiko er beregnet som sannsynlighet * påvirkning. Dette er risikoen etter kontroller er anvendt.", - risk_assessment_description: "Sammenlign inherent og residual risiko", - }, - register: { - title: "Risikoregister", - table: { - risk: "Risiko", - status: "Status", - department: "Avdeling", - assigned_to: "Ansvarlig", - no_results: "Ingen resultater", - no_risks: "Ingen risikoer funnet", - clear_filters: "Rydde filtre", - }, - filters: { - search: "Søk risikoer...", - status: "Status", - department: "Avdeling", - clear: "Rydde filtre", - create: "Opprett risiko", - owner: "Filtrer etter eier", - owner_placeholder: "Filtrer etter eier", - }, - empty: { - no_results: { - title: "Ingen resultater", - description_filtered: "Prøv en annen søk eller juster filtrene", - description_no_risks: "Ingen risikoer opprettet ennå", - }, - no_risks: { - title: "Opprett en risiko for å komme i gang", - description: - "Spore og score risikoer, opprett og tilordne kontroller for ditt team, og administrer risikoregister i en enkel grensesnitt.", - }, - }, - pagination: { - of: "av", - items_per_page: "Elementer per side", - }, - statuses: { - open: "Åpen", - pending: "Ventende", - closed: "Lukket", - archived: "Arkivert", - }, - metrics: { - probability: "Sannsynlighet", - impact: "Påvirkning", - inherentRisk: "Inherent Risiko", - residualRisk: "Residual Risiko", - }, - chart: { - riskScore: "Risikoscore", - inherentRisk: "Inherent Risiko", - residualRisk: "Residual Risiko", - }, - form: { - update_inherent_risk: "Oppdater Inherent Risiko", - update_inherent_risk_description: - "Oppdater inherent risikoen til risikoen. Dette er risikoen før kontroller er anvendt.", - update_inherent_risk_success: "Inherent risiko oppdatert", - update_inherent_risk_error: "Feil ved oppdatering av inherent risiko", - update_residual_risk: "Oppdater Residual Risiko", - update_residual_risk_description: - "Oppdater residual risikoen til risikoen. Dette er risikoen etter kontroller er anvendt.", - update_residual_risk_success: "Residual risiko oppdatert", - update_residual_risk_error: "Feil ved oppdatering av residual risiko", - update_risk: "Oppdater Risiko", - update_risk_description: "Oppdater risikoens tittel eller beskrivelse.", - update_risk_success: "Risiko oppdatert", - update_risk_error: "Feil ved oppdatering av risiko", - }, - actions: { - edit_inherent_risk: "Rediger Inherent Risiko", - edit_residual_risk: "Rediger Residual Risiko", - }, - }, - settings: { - general: { - title: "Generelt", - org_name: "Organisasjonsnavn", - org_name_description: - "Dette er navnet på din organisasjon. Du bør bruke det juridiske navnet på din organisasjon.", - org_name_tip: "Bruk maks 32 tegn.", - org_website: "Organisasjonsnettsted", - org_website_description: - "Dette er offisielt nettstedet til din organisasjon. Sørg for at det er en fullstendig URL med https://.", - org_website_tip: "Skriv inn en gyldig URL med https://", - org_website_error: "Feil ved oppdatering av organisasjonsnettsted", - org_website_updated: "Organisasjonsnettsted oppdatert", - org_delete: "Slett organisasjon", - org_delete_description: - "Slett denne organisasjonen og alle tilhørende data. Denne handlingen kan ikke angres.", - org_delete_alert_title: "Er du helt sikker?", - org_delete_alert_description: - "Denne handlingen kan ikke angres. Denne handlingen vil slette denne organisasjonen og alle tilhørende data fra Comp AI-plattformen.", - org_delete_error: "Feil ved sletting av organisasjon", - org_delete_success: "Organisasjon slettet", - org_name_updated: "Organisasjonsnavn oppdatert", - org_name_error: "Feil ved oppdatering av organisasjonsnavn", - save_button: "Lagre", - delete_button: "Slett", - delete_confirm: "SLETT", - delete_confirm_tip: "Skriv inn SLETT for å bekrefte.", - cancel_button: "Avbryt", - }, - members: { - title: "Medlemmer", - }, - billing: { - title: "Fakturering", - }, - }, - user_menu: { - theme: "Tema", - language: "Språk", - sign_out: "Logg ut", - account: "Konto", - support: "Støtte", - settings: "Innstillinger", - teams: "Team", - }, - }, + es: "Spansk" + } } as const; diff --git a/apps/app/src/locales/pt.ts b/apps/app/src/locales/pt.ts new file mode 100644 index 0000000000..c18ce29654 --- /dev/null +++ b/apps/app/src/locales/pt.ts @@ -0,0 +1,5 @@ +export default { + languages: { + es: "Espanhol" + } +} as const; diff --git a/apps/app/src/locales/server.ts b/apps/app/src/locales/server.ts index f6f9e3520d..dbf626c960 100644 --- a/apps/app/src/locales/server.ts +++ b/apps/app/src/locales/server.ts @@ -2,4 +2,5 @@ import { createI18nServer } from "next-international/server"; export const { getI18n, getScopedI18n, getStaticParams } = createI18nServer({ en: () => import("./en"), + es: () => import("./es") }); diff --git a/apps/app/src/middleware.ts b/apps/app/src/middleware.ts index 019fe62481..bfabdd855c 100644 --- a/apps/app/src/middleware.ts +++ b/apps/app/src/middleware.ts @@ -3,7 +3,7 @@ import { createI18nMiddleware } from "next-international/middleware"; import { type NextRequest, NextResponse } from "next/server"; const I18nMiddleware = createI18nMiddleware({ - locales: ["en"], + locales: ["en", "es"], defaultLocale: "en", urlMappingStrategy: "rewrite", }); @@ -41,5 +41,7 @@ export async function middleware(request: NextRequest) { } export const config = { - matcher: ["/((?!_next/static|_next/image|favicon.ico|api|monitoring).*)"], + matcher: [ + "/((?!api|_next/static|_next/image|favicon.ico|monitoring).*)", + ], }; From f1a0e56dae1081115a9cb1b619542d6dbff3d4b4 Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Wed, 5 Feb 2025 15:43:49 +0000 Subject: [PATCH 2/2] feat: translations --- .github/workflows/languine.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/languine.yml b/.github/workflows/languine.yml index 785f7f441d..2b882fc672 100644 --- a/.github/workflows/languine.yml +++ b/.github/workflows/languine.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v4 - name: Languine Action - uses: languine/languine-action@v1 + uses: languine-ai/languine@v.1.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: