diff --git a/.eslintrc.json b/.eslintrc.json index 3a1c197326d4..fae64d869e85 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,7 @@ "browser": true, "webextensions": true }, - "plugins": ["@typescript-eslint", "rxjs", "rxjs-angular"], + "plugins": ["@typescript-eslint", "rxjs", "rxjs-angular", "import"], "parser": "@typescript-eslint/parser", "parserOptions": { "project": ["./tsconfig.eslint.json"], @@ -18,6 +18,16 @@ "prettier", "plugin:rxjs/recommended" ], + "settings": { + "import/parsers": { + "@typescript-eslint/parser": [".ts"] + }, + "import/resolver": { + "typescript": { + "alwaysTryTypes": true + } + } + }, "rules": { "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], @@ -65,6 +75,27 @@ "selector": "CallExpression[callee.name='svgIcon']" } ], - "curly": ["error", "all"] + "curly": ["error", "all"], + "import/namespace": ["off"], // This doesn't resolve namespace imports correctly, but TS will throw for this anyway + "import/no-restricted-paths": [ + "error", + { + "zones": [ + // Do not allow angular/node/electron code to be imported into common + { + "target": "./libs/common/**/*", + "from": "./libs/angular/**/*" + }, + { + "target": "./libs/common/**/*", + "from": "./libs/node/**/*" + }, + { + "target": "./libs/common/**/*", + "from": "./libs/electron/**/*" + } + ] + } + ] } } diff --git a/.github/workflows/build-web-ee.yml b/.github/workflows/build-web-ee.yml new file mode 100644 index 000000000000..678ccd83200e --- /dev/null +++ b/.github/workflows/build-web-ee.yml @@ -0,0 +1,16 @@ +--- +name: Build Web for EE + +on: + workflow_dispatch: + +jobs: + stub: + name: stub + runs-on: ubuntu-20.04 + steps: + - name: Checkout repo + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + + - name: Stub + run: print 'This is only a stub' diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index a5fc5f6185b7..94396b757097 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -117,15 +117,11 @@ jobs: working-directory: apps/web run: npm run ${{ matrix.npm_command }} - - name: Package ${{ matrix.name }} artifact - working-directory: apps/web - run: zip -r web-$_VERSION-${{ matrix.name }}.zip build - - name: Upload ${{ matrix.name }} artifact uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 with: name: web-${{ env._VERSION }}-${{ matrix.name }}.zip - path: apps/web/web-${{ env._VERSION }}-${{ matrix.name }}.zip + path: apps/web/build if-no-files-found: error build-commercial-selfhost-image: @@ -155,11 +151,7 @@ jobs: uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: name: web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip - path: apps/web - - - name: Extract selfhosted-COMMERCIAL artifact - working-directory: apps/web - run: unzip web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip + path: apps/web/build - name: Build Docker image working-directory: apps/web @@ -266,11 +258,7 @@ jobs: uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741 with: name: web-${{ env._VERSION }}-cloud-QA.zip - path: apps/web - - - name: Extract cloud-QA artifact - working-directory: apps/web - run: unzip web-${{ env._VERSION }}-cloud-QA.zip + path: apps/web/build - name: Build Docker image working-directory: apps/web @@ -367,6 +355,7 @@ jobs: - cloc - setup - build-artifacts + - build-commercial-selfhost-image - build-qa - crowdin-push steps: @@ -376,6 +365,7 @@ jobs: CLOC_STATUS: ${{ needs.cloc.result }} SETUP_STATUS: ${{ needs.setup.result }} ARTIFACT_STATUS: ${{ needs.build-artifacts.result }} + BUILD_SELFHOST_STATUS: ${{ needs.build-commercial-selfhost-image.result }} BUILD_QA_STATUS: ${{ needs.build-qa.result }} CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }} run: | @@ -385,6 +375,8 @@ jobs: exit 1 elif [ "$ARTIFACT_STATUS" = "failure" ]; then exit 1 + elif [ "$BUILD_SELFHOST_STATUS" = "failure" ]; then + exit 1 elif [ "$BUILD_QA_STATUS" = "failure" ]; then exit 1 elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then diff --git a/.github/workflows/release-qa-web.yml b/.github/workflows/release-qa-web.yml index 80d15ac653de..1e31c95cbebb 100644 --- a/.github/workflows/release-qa-web.yml +++ b/.github/workflows/release-qa-web.yml @@ -2,94 +2,12 @@ name: QA - Web Release on: - workflow_dispatch: - inputs: - image_extension: - description: "Image tag extension" - required: false - azure_publish: - description: 'Release to Azure' - required: false - default: true - type: boolean - cloudflare_publish: - description: 'Release to Cloudflare' - required: false - default: true - type: boolean - -env: - _QA_CLUSTER_RESOURCE_GROUP: "bw-env-qa" - _QA_CLUSTER_NAME: "bw-aks-qa" - _QA_K8S_NAMESPACE: "bw-qa" - _QA_K8S_APP_NAME: "bw-web" + workflow_dispatch: {} jobs: - deploy: - name: Deploy QA Web - if: inputs.azure_publish - runs-on: ubuntu-20.04 - steps: - - name: Checkout Repo - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 - - - name: Setup - run: export PATH=$PATH:~/work/web/web - - - name: Login to Azure - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 - with: - creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }} - - - name: Retrieve secrets - id: retrieve-secrets - env: - KEYVAULT: bitwarden-qa-kv - SECRETS: | - qa-aks-kubectl-credentials - run: | - for i in ${SECRETS//,/ } - do - VALUE=$(az keyvault secret show --vault-name $KEYVAULT --name $i --query value --output tsv) - echo "::add-mask::$VALUE" - echo "::set-output name=$i::$VALUE" - done - - - name: Login with qa-aks-kubectl-credentials SP - uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1 - with: - creds: ${{ env.qa-aks-kubectl-credentials }} - - - name: Setup AKS access - run: | - echo "---az install---" - az aks install-cli --install-location ./kubectl --kubelogin-install-location ./kubelogin - echo "---az get-creds---" - az aks get-credentials -n $_QA_CLUSTER_NAME -g $_QA_CLUSTER_RESOURCE_GROUP - - - name: Get image tag - id: image_tag - run: | - IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") - TAG_EXTENSION=${{ github.event.inputs.image_extension }} - - if [[ $TAG_EXTENSION ]]; then - IMAGE_TAG=$IMAGE_TAG-$TAG_EXTENSION - fi - echo "::set-output name=value::$IMAGE_TAG" - - - name: Deploy Web image - env: - IMAGE_TAG: ${{ steps.image_tag.outputs.value }} - run: | - kubectl set image -n $_QA_K8S_NAMESPACE deployment/web web=bitwardenqa.azurecr.io/web:$IMAGE_TAG --record - kubectl rollout restart -n $_QA_K8S_NAMESPACE deployment/web - kubectl rollout status deployment/web -n $_QA_K8S_NAMESPACE - cfpages-deploy: name: Deploy Web Vault to QA CloudFlare Pages branch runs-on: ubuntu-20.04 - if: inputs.cloudflare_publish steps: - name: Create GitHub deployment uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48 diff --git a/.prettierignore b/.prettierignore index 8790a1e73ff0..b1c9359fa1ee 100644 --- a/.prettierignore +++ b/.prettierignore @@ -27,3 +27,6 @@ libs/.github # Github Workflows .github/workflows + +# Forked library files +libs/common/src/types/deep-jsonify.ts diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 34abd9594f5f..a6fb87d23055 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -500,13 +500,13 @@ "message": "هل أنت متأكد من حذف هذا المجلّد؟" }, "deletedFolder": { - "message": "Deleted folder" + "message": "تم حذف المجلد" }, "gettingStartedTutorial": { - "message": "Getting Started Tutorial" + "message": "لنبدأ نتعلم معاً" }, "gettingStartedTutorialVideo": { - "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + "message": "مشاهدة دروس البَدْء تمكنك من الحصول على أقصى أستفادة من ملحق المتصفح." }, "syncingComplete": { "message": "تم إكمال المزامنة" @@ -531,13 +531,13 @@ } }, "newUri": { - "message": "New URI" + "message": "رابط جديد" }, "addedItem": { - "message": "Added item" + "message": "تمت إضافة العنصر" }, "editedItem": { - "message": "Edited item" + "message": "تم تعديل العنصر" }, "deleteItemConfirmation": { "message": "هل تريد حقاً أن ترسل إلى سلة المهملات؟" diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index b132e0c464a4..e7f0f7a8015d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -20,7 +20,7 @@ "message": "Увайсці" }, "enterpriseSingleSignOn": { - "message": "Адзіны ўваход у карпаратыўную сістэму (SSO)." + "message": "Адзіны ўваход прадпрыемства (SSO)" }, "cancel": { "message": "Скасаваць" @@ -32,7 +32,7 @@ "message": "Адправіць" }, "emailAddress": { - "message": "Адрас эл. пошты" + "message": "Адрас электроннай пошты" }, "masterPass": { "message": "Асноўны пароль" @@ -41,7 +41,7 @@ "message": "Асноўны пароль — ключ да вашага бяспечнага сховішча. Ён вельмі важны, таму не забывайце яго. Аднавіць асноўны пароль немагчыма." }, "masterPassHintDesc": { - "message": "Падказка да асноўнага пароля можа дапамагчы вам яго ўспомніць." + "message": "Падказка да асноўнага пароля можа дапамагчы вам успомніць яго, калі вы яго забылі." }, "reTypeMasterPass": { "message": "Увядзіце асноўны пароль паўторна" @@ -71,34 +71,34 @@ "message": "Бягучая ўкладка" }, "copyPassword": { - "message": "Капіяваць пароль" + "message": "Скапіяваць пароль" }, "copyNote": { - "message": "Капіяваць нататку" + "message": "Скапіяваць нататку" }, "copyUri": { - "message": "Капіяваць URI" + "message": "Скапіяваць URI" }, "copyUsername": { - "message": "Капіяваць імя карыстальніка" + "message": "Скапіяваць імя карыстальніка" }, "copyNumber": { - "message": "Капіяваць нумар" + "message": "Скапіяваць нумар" }, "copySecurityCode": { - "message": "Капіяваць код бяспекі" + "message": "Скапіяваць код бяспекі" }, "autoFill": { "message": "Аўтазапаўненне" }, "generatePasswordCopied": { - "message": "Стварыць пароль (з капіяваннем)" + "message": "Генерыраваць пароль (з капіяваннем)" }, "copyElementIdentifier": { "message": "Скапіяваць назву карыстальніцкага пароля" }, "noMatchingLogins": { - "message": "Няма падыходных уліковых даных." + "message": "Няма адпаведных лагінаў." }, "unlockVaultMenu": { "message": "Разблакіраваць сховішча" @@ -110,7 +110,7 @@ "message": "Няма ўліковых даных, даступных для аўтазапаўнення ў бягучую ўкладку браўзера." }, "addLogin": { - "message": "Дадаць ўліковыя даныя" + "message": "Дадаць лагін" }, "addItem": { "message": "Дадаць элемент" @@ -119,10 +119,10 @@ "message": "Падказка да пароля" }, "enterEmailToGetHint": { - "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі для асноўнага пароля." + "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі да асноўнага пароля." }, "getMasterPasswordHint": { - "message": "Атрымаць падказку для асноўнага пароля" + "message": "Атрымаць падказку да асноўнага пароля" }, "continue": { "message": "Працягнуць" @@ -208,23 +208,23 @@ "message": "Генератар пароляў" }, "generator": { - "message": "Згенерыраваць", + "message": "Генератар", "description": "Short for 'Password Generator'." }, "passGenInfo": { - "message": "Аўтаматычна ствараць моцныя, унікальныя паролі для вашых уліковых даных." + "message": "Аўтаматычна генерыруйце надзейныя і ўнікальныя паролі для вашых лагінаў." }, "bitWebVault": { "message": "Вэб-сховішча Bitwarden" }, "importItems": { - "message": "Імпарт элементаў" + "message": "Імпартаванне элементаў" }, "select": { "message": "Выбраць" }, "generatePassword": { - "message": "Стварыць пароль" + "message": "Генерыраваць пароль" }, "regeneratePassword": { "message": "Стварыць новы пароль" @@ -254,17 +254,17 @@ "message": "Раздзяляльнік слоў" }, "capitalize": { - "message": "З вялікай літары", + "message": "Вялікія літары", "description": "Make the first letter of a work uppercase." }, "includeNumber": { "message": "Уключыць лічбу" }, "minNumbers": { - "message": "Мін. колькасць лічбаў" + "message": "Мінімум лічбаў" }, "minSpecial": { - "message": "Мін. колькасць сімвалаў" + "message": "Мінімум спецыяльных сімвалаў" }, "avoidAmbChar": { "message": "Пазбягаць неадназначных сімвалаў" @@ -300,10 +300,10 @@ "message": "Нататкі" }, "note": { - "message": "Нататкі" + "message": "Нататка" }, "editItem": { - "message": "Рэдагаванне элемента" + "message": "Рэдагаваць элемент" }, "folder": { "message": "Папка" @@ -324,7 +324,7 @@ "message": "Пераключыць бачнасць" }, "manage": { - "message": "Кіраваць" + "message": "Кіраванне" }, "other": { "message": "Iншае" @@ -348,7 +348,7 @@ "message": "Разблакіраваць" }, "loggedInAsOn": { - "message": "Выкананы ўваход на $HOSTNAME$ як $EMAIL$.", + "message": "Вы ўвайшлі як $HOSTNAME$ у $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -403,7 +403,7 @@ "message": "4 гадзіны" }, "onLocked": { - "message": "Разам з камп'ютарам" + "message": "Пры блакіраванні сістэмы" }, "onRestart": { "message": "Пры перазапуску браўзера" @@ -433,7 +433,7 @@ "message": "Асноўны пароль павінен быць даўжынёй не менш за 8 сімвалаў." }, "masterPassDoesntMatch": { - "message": "Асноўныя паролі не супадаюць." + "message": "Пацвярджэнне асноўнага пароля не супадае." }, "newAccountCreated": { "message": "Ваш уліковы запіс створаны! Вы можаце ўвайсці." @@ -448,7 +448,7 @@ "message": "Памылковы праверачны код" }, "valueCopied": { - "message": "$VALUE$ скапіяваны(-а)", + "message": "$VALUE$ скапіяваны", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -458,10 +458,10 @@ } }, "autofillError": { - "message": "Не ўдаецца аўтаматычна запоўніць выбраны элемент на гэтай старонцы. Скапіюйце і ўстаўце інфармацыю ўручную." + "message": "Немагчыма аўтазапоўніць выбраны элемент на гэтай старонцы. Скапіюйце і ўстаўце інфармацыю ўручную." }, "loggedOut": { - "message": "Вы выйшлі са сховішча" + "message": "Вы выйшлі" }, "loginExpired": { "message": "Скончыўся тэрмін дзеяння вашага сеансу." @@ -479,7 +479,7 @@ "message": "Адбылася нечаканая памылка." }, "nameRequired": { - "message": "Патрэбна назва." + "message": "Патрабуецца назва." }, "addedFolder": { "message": "Папка дададзена" @@ -503,7 +503,7 @@ "message": "Папка выдалена" }, "gettingStartedTutorial": { - "message": "Дапаможнік па пачатку працы" + "message": "Уводзіны ў карыстанне праграмай" }, "gettingStartedTutorialVideo": { "message": "Праглядзіце невялікі навучальны матэрыял, каб даведацца. як атрымаць максімальную аддачу ад пашырэння браўзера." @@ -540,7 +540,7 @@ "message": "Элемент адрэдагаваны" }, "deleteItemConfirmation": { - "message": "Вы ўпэўнены, што хочаце выдаліць гэты элемент?" + "message": "Вы ўпэўнены, што хочаце адправіць гэты элемент у сметніцу?" }, "deletedItem": { "message": "Выдалены элемент" @@ -574,19 +574,19 @@ "message": "Пытацца пры дадаванні лагіна" }, "addLoginNotificationDesc": { - "message": "Апавяшчэнне аб даданні ўліковых даных аўтаматычна прапануе вам захаваць новыя ўліковыя даныя ў сховішчы." + "message": "Пытацца пра дадаванне элемента, калі ён адсутнічае ў вашым сховішчы." }, "showCardsCurrentTab": { "message": "Паказваць карткі на старонцы з укладкамі" }, "showCardsCurrentTabDesc": { - "message": "Паказваць спіс элементаў на старонцы з укладкамі для лёгкага аўтазапаўнення." + "message": "Спіс элементаў картак на старонцы з укладкамі для лёгкага аўтазапаўнення." }, "showIdentitiesCurrentTab": { "message": "Паказваць пасведчанні на старонцы з укладкамі" }, "showIdentitiesCurrentTabDesc": { - "message": "Паказваць пасведчанні элементаў на старонцы з укладкамі для лёгкага аўтазапаўнення." + "message": "Спіс элементаў пасведчання на старонцы з укладкамі для лёгкага аўтазапаўнення." }, "clearClipboard": { "message": "Ачыстка буфера абмену", @@ -603,13 +603,13 @@ "message": "Так, захаваць зараз" }, "enableChangedPasswordNotification": { - "message": "Пытацца пра абнаўленні існуючых даных уваходу" + "message": "Пытацца пра абнаўленні існуючага лагіна" }, "changedPasswordNotificationDesc": { - "message": "Пытаць пра абнаўленне пароля ўваходу пры выяўленні змяненняў на вэб-сайце." + "message": "Пытацца пра абнаўленне пароля ад лагіна пры выяўленні змяненняў на вэб-сайце." }, "notificationChangeDesc": { - "message": "Вы хочаце абнавіць гэты пароль у Bitwarden?" + "message": "Хочаце абнавіць гэты пароль у Bitwarden?" }, "notificationChangeSave": { "message": "Так, абнавіць зараз" @@ -621,17 +621,17 @@ "message": "Выкарыстоўваць падвоены націск для доступу да генератара пароля і супастаўлення лагінаў для вэб-сайтаў. " }, "defaultUriMatchDetection": { - "message": "Выяўленне супадзення URI па змаўчанні", + "message": "Прадвызначанае выяўленне супадзення URI", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { - "message": "Выберыце спосаб па змаўчанні, які выкарыстоўваецца пры вызначэнні адпаведнасці URI для ўліковых даных пры выкананні такіх дзеянняў, як аўтаматычнае запаўненне." + "message": "Выберыце прадвызначаны спосаб вызначэння адпаведнасці URI для лагінаў пры выкананні такіх дзеянняў, як аўтаматычнае запаўненне." }, "theme": { "message": "Тэма" }, "themeDesc": { - "message": "Змена колеравай тэмы праграмы." + "message": "Змена каляровай тэмы праграмы." }, "dark": { "message": "Цёмная", @@ -646,7 +646,7 @@ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Экспарт сховішча" + "message": "Экспартаваць сховішча" }, "fileFormat": { "message": "Фармат файла" @@ -656,7 +656,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { - "message": "Пацвердзіць экспарт сховішча" + "message": "Пацвердзіць экспартаванне сховішча" }, "exportWarningDesc": { "message": "Экспартуемы файл утрымлівае даныя вашага сховішча ў незашыфраваным фармаце. Яго не варта захоўваць ці адпраўляць па небяспечным каналам (напрыклад, па электроннай пошце). Выдаліце яго адразу пасля выкарыстання." @@ -668,7 +668,7 @@ "message": "Ключы шыфравання з'яўляюцца ўнікальнымі для кожнага ўліковага запісу Bitwarden, таму нельга імпартаваць зашыфраванае сховішча ў іншы ўліковы запіс." }, "exportMasterPassword": { - "message": "Увядзіце ваш асноўны пароль для экспарту даных са сховішча." + "message": "Увядзіце ваш асноўны пароль для экспартавання даных сховішча." }, "shared": { "message": "Абагуленыя" @@ -705,13 +705,13 @@ "message": "Даведацца больш" }, "authenticatorKeyTotp": { - "message": "Ключ праверкі сапраўднасці (TOTP)" + "message": "Ключ аўтэнтыфікацыі (TOTP)" }, "verificationCodeTotp": { "message": "Код праверкі (TOTP)" }, "copyVerificationCode": { - "message": "Капіяваць код праверкі" + "message": "Скапіяваць праверачны код" }, "attachments": { "message": "Далучэнні" @@ -753,7 +753,7 @@ "message": "Прэміяльны статус" }, "premiumManage": { - "message": "Кіраванне статусам" + "message": "Кіраваць статусам" }, "premiumManageAlert": { "message": "Вы можаце кіраваць сваім статусам на bitwarden.com. Перайсці на сайт зараз?" @@ -798,7 +798,7 @@ "message": "Дзякуем вам за падтрымку Bitwarden." }, "premiumPrice": { - "message": "Усяго толькі за $PRICE$ на год!", + "message": "Усяго за $PRICE$ у год!", "placeholders": { "price": { "content": "$1", @@ -810,13 +810,13 @@ "message": "Абнаўленне завершана" }, "enableAutoTotpCopy": { - "message": "Капіяваць TOTP аўтаматычна" + "message": "Скапіяваць TOTP аўтаматычна" }, "disableAutoTotpCopyDesc": { - "message": "Калі да вашых уліковых даных прымацаваны ключ праверкі сапраўднасці, то код пацвярджэння TOTP будзе скапіяваны пры аўтазапаўненні ўліковых даных." + "message": "Калі ў лагіна ёсць ключ аўтэнтыфікацыі, то праверачны код TOTP будзе скапіяваны ў буфер абмену пры аўтазапаўненні ўваходу." }, "enableAutoBiometricsPrompt": { - "message": "Запытваць біяметрыю пры запуску" + "message": "Пытацца пра біяметрыю пры запуску" }, "premiumRequired": { "message": "Патрабуецца прэміяльны статус" @@ -825,10 +825,10 @@ "message": "Для выкарыстання гэтай функцыі патрабуецца прэміяльны статус." }, "enterVerificationCodeApp": { - "message": "Увядзіце 6 лічбаў кода праверкі з вашай праграмы праверкі сапраўднасці." + "message": "Увядзіце 6 лічбаў праверачнага кода з вашай праграмы аўтэнтыфікацыі." }, "enterVerificationCodeEmail": { - "message": "Увядзіце 6 лічбаў кода праверкі, які быў адпраўлены на $EMAIL$.", + "message": "Увядзіце 6 лічбаў праверачнага кода, які быў адпраўлены на $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -855,10 +855,10 @@ "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу" }, "insertYubiKey": { - "message": "Устаўце ваш YubiKey ў порт USB вашага камп'ютара, затым націсніце на кнопку." + "message": "Устаўце свой YubiKey у порт USB камп'ютара, а потым націсніце на кнопку." }, "insertU2f": { - "message": "Устаўце ваш ключ бяспекі ў порт USB вашага камп'ютара. Калі на ім ёсць кнопка, націсніце на яе." + "message": "Устаўце ваш ключ бяспекі ў порт USB камп'ютара. Калі на ім ёсць кнопка, націсніце на яе." }, "webAuthnNewTab": { "message": "Каб пачаць праверку WebAuthn 2FA, націсніце кнопку знізу для адкрыцця новай укладкі і прытрымлівайцеся інструкцый, якія паказаны ў новай укладцы." @@ -882,13 +882,13 @@ "message": "Параметры двухэтапнага ўваходу" }, "recoveryCodeDesc": { - "message": "Згубілі доступ да ўсіх варыянтаў двухэтапнага ўваходу? Скарыстайцеся кодам аднаўлення, каб адключыць двухэтапны ўваход для вашага ўліковага запісу." + "message": "Згубілі доступ да ўсіх варыянтаў доступу пастаўшчыкоў двухэтапнай аўтэнтыфікацыі? Скарыстайцеся кодам аднаўлення, каб адключыць праверку пастаўшчыкоў двухэтапнай аўтэнтыфікацыі для вашага ўліковага запісу." }, "recoveryCodeTitle": { "message": "Код аднаўлення" }, "authenticatorAppTitle": { - "message": "Праграма праверкі сапраўднасці" + "message": "Праграма аўтэнтыфікацыі" }, "authenticatorAppDesc": { "message": "Выкарыстоўвайце праграму для праверкі сапраўднасці (напрыклад, Authy або Google Authenticator) для стварэння кодаў праверкі на аснове часу.", @@ -927,22 +927,22 @@ "message": "Увядзіце асноўны URL-адрас на вашым серверы." }, "customEnvironment": { - "message": "Налады асяроддзя" + "message": "Карыстальніцкае асяроддзе" }, "customEnvironmentFooter": { - "message": "Для вопытных карыстальнікаў. Можна ўвесці URL-адрасы асобна для кжонай службы." + "message": "Для дасведчаных карыстальнікаў. Можна ўвесці URL-адрасы асобна для кожнай службы." }, "baseUrl": { "message": "URL-адрас сервера" }, "apiUrl": { - "message": "API URL-адраса сервера" + "message": "Сервер URL-адраса API" }, "webVaultUrl": { "message": "URL-адрас сервера вэб-сховішча" }, "identityUrl": { - "message": "URL-адрас сервера ідэнтыфікацыі" + "message": "URL-адрас сервера пасведчання" }, "notificationsUrl": { "message": "URL-адрас сервера апавяшчэнняў" @@ -954,22 +954,22 @@ "message": "URL-адрас сервера асяроддзя захаваны." }, "enableAutoFillOnPageLoad": { - "message": "Уключыць аўтазапаўненне пры загрузцы старонкі" + "message": "Аўтазапаўненне пры загрузцы старонкі" }, "enableAutoFillOnPageLoadDesc": { - "message": "Пры выяўленні формы ўваходу выконваецца аўтазапаўненне падчас загрузкі вэб-старонкі." + "message": "Калі выяўлена форма ўваходу, то будзе выканана яе аўтазапаўненне падчас загрузкі вэб-старонкі." }, "experimentalFeature": { "message": "Гэта эксперыментальная функцыя. Выкарыстоўвайце на свой страх і рызыку." }, "defaultAutoFillOnPageLoad": { - "message": "Прадвызначана налада аўтазапаўнення для элементаў уваходу" + "message": "Прадвызначаная налада аўтазапаўнення для элементаў уваходу" }, "defaultAutoFillOnPageLoadDesc": { "message": "Вы можаце выключыць аўтазапаўненне на старонцы загрузцы для асобных элементаў уваходу ў меню \"Рэдагаваць\"." }, "itemAutoFillOnPageLoad": { - "message": "Аўтазапаўненне пры загрузцы (калі ўключана ў параметрах праграмы)" + "message": "Аўтазапаўненне пры загрузцы старонкі (калі ўключана ў параметрах праграмы)" }, "autoFillOnPageLoadUseDefault": { "message": "Выкарыстоўваць прадвызначаныя налады" @@ -987,10 +987,10 @@ "message": "Адкрыць сховішча ў бакавой панэлі" }, "commandAutofillDesc": { - "message": "Аўтазапаўненне апошніх скарыстаных уліковых даных для бягучага вэб-сайта." + "message": "Аўтазапаўненне апошняга скарыстанага лагіна для бягучага вэб-сайта" }, "commandGeneratePasswordDesc": { - "message": "Стварыць і капіяваць новы выпадковы парольу буфер абмену." + "message": "Генерыраваць і скапіяваць новы выпадковы пароль у буфер абмену" }, "commandLockVaultDesc": { "message": "Заблакіраваць сховішча" @@ -1002,7 +1002,7 @@ "message": "Карыстальніцкія палі" }, "copyValue": { - "message": "Капіяваць значэнне" + "message": "Скапіяваць значэнне" }, "value": { "message": "Значэнне" @@ -1020,7 +1020,7 @@ "message": "Схавана" }, "cfTypeBoolean": { - "message": "Лагічнае" + "message": "Булева" }, "cfTypeLinked": { "message": "Звязана", @@ -1031,7 +1031,7 @@ "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { - "message": "Націск за межамі гэтага акна для прагляду кода праверкі з электроннай пошты прывядзе да яго закрыцця. Адкрыць bitwarden у новым акне?" + "message": "Націск за межамі ўсплывальнага акна для прагляду праверачнага кода прывядзе да яго закрыцця. Адкрыць гэта ўсплывальнае акно ў новым акне, якое не закрыецца?" }, "popupU2fCloseMessage": { "message": "Гэты браўзар не можа апрацоўваць запыты U2F у гэтым усплывальным акне. Вы хочаце адкрыць гэта ўсплывальнае акно ў новым акне, каб мець магчымасць увайсці ў сістэму, выкарыстоўваючы U2F?" @@ -1058,10 +1058,10 @@ "message": "Тып карткі" }, "expirationMonth": { - "message": "Месяц заканчэння" + "message": "Месяц завяршэння" }, "expirationYear": { - "message": "Год заканчэння" + "message": "Год завяршэння" }, "expiration": { "message": "Тэрмін дзеяння" @@ -1079,7 +1079,7 @@ "message": "Красавік" }, "may": { - "message": "Май" + "message": "Травень" }, "june": { "message": "Чэрвень" @@ -1121,7 +1121,7 @@ "message": "Пані" }, "dr": { - "message": "Док." + "message": "Доктар" }, "firstName": { "message": "Імя" @@ -1136,7 +1136,7 @@ "message": "Поўнае імя" }, "identityName": { - "message": "Імя" + "message": "Імя пасведчання" }, "company": { "message": "Кампанія" @@ -1160,13 +1160,13 @@ "message": "Адрас" }, "address1": { - "message": "Радок адрасу 1" + "message": "Адрас 1" }, "address2": { - "message": "Радок адрасу 2" + "message": "Адрас 2" }, "address3": { - "message": "Радок адрасу 3" + "message": "Адрас 3" }, "cityTown": { "message": "Горад / Пасёлак" @@ -1184,7 +1184,7 @@ "message": "Тып" }, "typeLogin": { - "message": "Уліковыя даныя" + "message": "Лагін" }, "typeLogins": { "message": "Уліковыя даныя" @@ -1223,7 +1223,7 @@ "message": "Пасведчанні" }, "logins": { - "message": "Уліковыя даныя" + "message": "Лагіны" }, "secureNotes": { "message": "Бяспечныя нататкі" @@ -1256,7 +1256,7 @@ "description": "Domain name. Ex. website.com" }, "host": { - "message": "Хост", + "message": "Вузел", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { @@ -1274,7 +1274,7 @@ "description": "URI match detection for auto-fill." }, "defaultMatchDetection": { - "message": "Метад выяўлення па змаўчанні", + "message": "Прадвызначаны метад выяўлення", "description": "Default URI match detection for auto-fill." }, "toggleOptions": { @@ -1285,7 +1285,7 @@ "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Бягучы URI укладкі", + "message": "Бягучы URI", "description": "The URI of one of the current open tabs in the browser." }, "organization": { @@ -1305,7 +1305,7 @@ "message": "Выдаліць" }, "default": { - "message": "Па змаўчанні" + "message": "Прадвызначана" }, "dateUpdated": { "message": "Абноўлена", @@ -1316,7 +1316,7 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Вы ўпэўнены, што хочаце адключыць блакіроўку сховішча? У гэтым выпадку ключ шыфравання вашага сховішча будзе захаваны на вашай прыладзе. Адключаючы блакіроўку, вы павінны пераканацца, што ваша прылада надзейна абаронена." + "message": "Вы ўпэўнены, што хочаце адключыць блакіроўку сховішча? Прызначыўшы параметр блакіравання \"Ніколі\", ключ шыфравання будзе захоўвацца на вашай прыладзе. Калі вы выкарыстоўваеце гэты параметр, вы павінны быць упэўнены ў тым, што ваша прылада надзейна абаронена." }, "noOrganizationsList": { "message": "Вы не з'яўляецеся членам якой-небудзь арганізацыі. Арганізацыі дазваляюць бяспечна абменьвацца элементамі з іншымі карыстальнікамі." @@ -1331,7 +1331,7 @@ "message": "Каму належыць гэты элемент?" }, "strong": { - "message": "Моцны", + "message": "Надзейны", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { @@ -1339,14 +1339,14 @@ "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Слабы", + "message": "Ненадзейны", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { "message": "Слабы асноўны пароль" }, "weakMasterPasswordDesc": { - "message": "Асноўны пароль, выбраны вамі, з'яўляецца слабым. Для належнай абароны ўліковага запісу Bitwarden, вы павінны выкарыстоўваць моцны асноўны пароль (або парольную фразу). Вы ўпэўнены, што хочаце выкарыстоўваць гэты асноўны пароль?" + "message": "Асноўны пароль, які вы выбралі з'яўляецца ненадзейным. Для належнай абароны ўліковага запісу Bitwarden, вы павінны выкарыстоўваць надзейны асноўны пароль (або парольную фразу). Вы ўпэўнены, што хочаце выкарыстоўваць гэты асноўны пароль?" }, "pin": { "message": "PIN-код", @@ -1374,7 +1374,7 @@ "message": "Для ўключэння біяметрыі ў браўзеры, пацвердзіце гэта ў праграме Bitwarden на сваім камп'ютары." }, "lockWithMasterPassOnRestart": { - "message": "Блакіраваць асноўным паролем пры перазапуску браўзера" + "message": "Заблакіраваць асноўным паролем пры перазапуску браўзера" }, "selectOneCollection": { "message": "Вы павінны выбраць прынамсі адну калекцыю." @@ -1386,7 +1386,7 @@ "message": "Кланіраваць" }, "passwordGeneratorPolicyInEffect": { - "message": "На налады генератара ўплываюць адна або некалькі палітык арганізацый." + "message": "Адна або больш палітык арганізацыі ўплывае на налады генератара." }, "vaultTimeoutAction": { "message": "Дзеянне пры тайм-аўце" @@ -1415,19 +1415,19 @@ "message": "Аднавіць элемент" }, "restoreItemConfirmation": { - "message": "Вы сапраўды жадаеце аднавіць гэты элемент?" + "message": "Вы ўпэўнены, што хочаце аднавіць гэты элемент?" }, "restoredItem": { "message": "Элемент адноўлены" }, "vaultTimeoutLogOutConfirmation": { - "message": "Выхад з сістэмы выдаліць доступ да сховішча і спатрабуе праверку сапраўднасці анлайн па заканчэнні перыяду чакання. Вы сапраўды жадаеце ўключыць гэтую наладу?" + "message": "Выхад з сістэмы скасуе ўсе магчымасці доступу да сховішча і запатрабуе аўтэнтыфікацыю праз інтэрнэт пасля завяршэння часу чакання. Вы ўпэўнены, што хочаце выкарыстоўваць гэты параметр?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Пацвярджэнне дзеяння для тайм-аута" }, "autoFillAndSave": { - "message": "Запоўніць і захаваць" + "message": "Аўтазапоўніць і захаваць" }, "autoFillSuccessAndSavedUri": { "message": "Аўтазапоўнены элемент і захаваны URI" @@ -1439,7 +1439,7 @@ "message": "Задаць асноўны пароль" }, "masterPasswordPolicyInEffect": { - "message": "Згодна з адной або некалькімі палітыкамі арганізацыі неабходна, каб ваш асноўны пароль адказваў наступным патрабаванням:" + "message": "Адна або больш палітык арганізацыі патрабуе, каб ваш асноўны пароль адпавядаў наступным патрабаванням:" }, "policyInEffectMinComplexity": { "message": "Мінімальны ўзровень складанасці $SCORE$", @@ -1460,13 +1460,13 @@ } }, "policyInEffectUppercase": { - "message": "Уключыць адну ці больш прапісных літар" + "message": "Уключыць адну або некалькі вялікіх літар" }, "policyInEffectLowercase": { - "message": "Уключыць адну ці больш малых літар" + "message": "Уключыць адну або некалькі малых літар" }, "policyInEffectNumbers": { - "message": "Уключыць адну ці больш лічбаў" + "message": "Уключыць адну або некалькі лічбаў" }, "policyInEffectSpecial": { "message": "Уключаць хаця б адзін з наступных спецыяльных сімвалаў $CHARS$", @@ -1481,7 +1481,7 @@ "message": "Ваш новы асноўны пароль не адпавядае патрабаванням палітыкі арганізацыі." }, "acceptPolicies": { - "message": "Ставіўшы гэты сцяжок вы пагаджаецеся з наступным:" + "message": "Ставячы гэты сцяжок, вы пагаджаецеся з наступным:" }, "acceptPoliciesRequired": { "message": "Умовы выкарыстання і Палітыка прыватнасці не былі пацверджаны." @@ -1496,7 +1496,7 @@ "message": "Падказка для пароля не можа супадаць з паролем." }, "ok": { - "message": "ОК" + "message": "Добра" }, "desktopSyncVerificationTitle": { "message": "Праверка сінхранізацыі на камп'ютары" @@ -1538,7 +1538,7 @@ "message": "Біяметрыя не ўключана" }, "biometricsNotEnabledDesc": { - "message": "Для актывацыі біяметрыі ў браўзеры спачатку неабходна ўключыць біяметрыю ў праграме на камп'ютары." + "message": "Для актывацыі біяметрыі ў браўзеры неабходна спачатку ўключыць яе ў наладах праграмы для камп'ютара." }, "biometricsNotSupportedTitle": { "message": "Біяметрыя не падтрымліваецца" @@ -1559,7 +1559,7 @@ "message": "Гэта дзеянне немагчыма выканаць у бакавой панэлі. Паспрабуйце паўтарыць гэта дзеянне ва ўсплывальным або асобным акне." }, "personalOwnershipSubmitError": { - "message": "У адпаведнасці з карпаратыўнай палітыкай вам забаронена захоўваць элементы ў асабістым сховішчы. Змяніце параметры ўласнасці на арганізацыю і выберыце з даступных калекцый." + "message": "У адпаведнасці з палітыкай прадпрыемства вам забаронена захоўваць элементы ў асабістым сховішчы. Змяніце параметры ўласнасці на арганізацыю і выберыце з даступных калекцый." }, "personalOwnershipPolicyInEffect": { "message": "Палітыка арганізацыі ўплывае на вашы параметры ўласнасці." @@ -1615,7 +1615,7 @@ "message": "Абаронена паролем" }, "copySendLink": { - "message": "Капіяваць спасылку Send", + "message": "Скапіяваць спасылку на Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -1628,7 +1628,7 @@ "message": "Пароль выдалены" }, "deletedSend": { - "message": "Выдалены Send", + "message": "Send выдалены", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { @@ -1682,7 +1682,7 @@ "message": "1 дзень" }, "days": { - "message": "$DAYS$ дзён", + "message": "Дзён: $DAYS$", "placeholders": { "days": { "content": "$1", @@ -1697,7 +1697,7 @@ "message": "Максімальная колькасць доступаў" }, "maximumAccessCountDesc": { - "message": "Калі зададзена, то карыстальнікі больш не змогуць атрымаць доступ да гэтага Send пасля таго, як будзе дасягнута максімальная колькасць зваротаў.", + "message": "Калі прызначана, то карыстальнікі больш не змогуць атрымаць доступ да гэтага Send пасля таго, як будзе дасягнута максімальная колькасць зваротаў.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { @@ -1738,7 +1738,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "У адпаведнасці з карпаратыўнай палітыкай, вы можаце выдаліць толькі бягучы Send.", + "message": "У адпаведнасці з палітыкай прадпрыемства, вы можаце выдаліць толькі бягучы Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { @@ -1746,7 +1746,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Адрэдагаваны Send", + "message": "Send адрэдагаваны", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -1756,7 +1756,7 @@ "message": "Для выбару файла з выкарыстаннем Firefox неабходна адкрыць пашырэнне на бакавой панэлі або перайсці ў новае акно, націснуўшы на гэты банэр." }, "sendSafariFileWarning": { - "message": "Для выбару файла з выкарыстаннем Safari неабходна перайсці ў асобнае акно, націснуўшы на гэты банэр." + "message": "Для выбару файла з выкарыстаннем Safari неабходна перайсці ў новае акно, націснуўшы на гэты банэр." }, "sendFileCalloutHeader": { "message": "Перад тым, як пачаць" @@ -1795,7 +1795,7 @@ "message": "Адна або больш палітык арганізацыі ўплываюць на параметры Send." }, "passwordPrompt": { - "message": "Паўторны запыт галоўнага пароля" + "message": "Паўторны запыт асноўнага пароля" }, "passwordConfirmation": { "message": "Пацвярджэнне асноўнага пароля" @@ -1828,7 +1828,7 @@ "message": "Выбраць папку..." }, "ssoCompleteRegistration": { - "message": "Для завяршэння ўваходу праз SSO, задайце асноўны пароль для доступу і абароны вашаго сховішча." + "message": "Для завяршэння працэсу ўваходу з дапамогай SSO, прызначце асноўны пароль для доступу да вашага сховішча і яго абароны." }, "hours": { "message": "Гадзіны" @@ -1859,13 +1859,13 @@ "message": "Адна або больш палітык арганізацыі не дазваляюць вам экспартаваць асабістае сховішча." }, "copyCustomFieldNameInvalidElement": { - "message": "Не атрымалася ідэнтыфікаваць дзеючы элемент формы. Паспрабуйце замест гэтага праверыць HTML." + "message": "Немагчыма ідэнтыфікаваць дзеючы элемент формы. Паспрабуйце замест гэтага праверыць HTML." }, "copyCustomFieldNameNotUnique": { "message": "Не знойдзены ўнікальны ідэнтыфікатар." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ выкарыстоўвае SSO з уласным серверам ключоў. Для аўтарызацыі ўдзельнікам гэтай арганізацыі больш няма неабходнасці выкарыстоўваць асноўны пароль.", + "message": "$ORGANIZATION$ выкарыстоўвае SSO з уласным серверам ключоў. Асноўны пароль для ўдзельнікаў гэтай арганізацыі больш не патрабуецца.", "placeholders": { "organization": { "content": "$1", @@ -1874,7 +1874,7 @@ } }, "leaveOrganization": { - "message": "Пакінуць арганізацыю" + "message": "Выйсці з арганізацыі" }, "removeMasterPassword": { "message": "Выдаліць асноўны пароль" @@ -1883,7 +1883,7 @@ "message": "Асноўны пароль выдалены." }, "leaveOrganizationConfirmation": { - "message": "Вы ўпэўнены, што хочаце пакінуць гэту арганізацыю?" + "message": "Вы ўпэўнены, што хочаце выйсці з гэтай арганізацыі?" }, "leftOrganization": { "message": "Вы пакінулі арганізацыю." @@ -1898,7 +1898,7 @@ "message": "Экспартаванне асабістага сховішча" }, "exportingPersonalVaultDescription": { - "message": "Толькі элементы асабістага сховішча, якія звязаны з $EMAIL$ будуць экспартаваныя. Элементы сховішча арганізацыі не будуць уключаны.", + "message": "Будуць экспартаваны толькі асабістыя элементы сховішча, якія звязаны з $EMAIL$. Элементы сховішча арганізацыі не будуць уключаны.", "placeholders": { "email": { "content": "$1", @@ -1975,7 +1975,7 @@ "message": "Арганізацыя адключана." }, "disabledOrganizationFilterError": { - "message": "Элементы ў адключаных арганізацыя недаступны. Звяжыцеся з уладальнікам вашай арганізацыі для атрымання дапамогі." + "message": "Доступ да элементаў у адключаных арганізацыях немагчымы. Звяжыце з уладальнікам арганізацыі для атрымання дапамогі." }, "cardBrandMir": { "message": "Mir" @@ -1999,16 +1999,16 @@ "message": "для скіду да прадвызначаных наладаў" }, "serverVersion": { - "message": "Server Version" + "message": "Версія сервера" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Уласнае размяшчэнне" }, "thirdParty": { - "message": "Third-Party" + "message": "Іншы пастаўшчык" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "Падлучэнне да сервера іншага пастаўшчыка $SERVERNAME$. Калі ласка, праверце памылкі з дапамогай афіцыйнага сервера або паведаміце пра іх пастаўшчыку сервера.", "placeholders": { "servername": { "content": "$1", @@ -2017,7 +2017,7 @@ } }, "lastSeenOn": { - "message": "last seen on $DATE$", + "message": "апошні раз быў(-ла) $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index f4574ce9c6d4..fe9945100468 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -1999,16 +1999,16 @@ "message": "per restablir els paràmetres preconfigurats" }, "serverVersion": { - "message": "Server Version" + "message": "Versió del servidor" }, "selfHosted": { - "message": "Self-Hosted" + "message": "Autoallotjat" }, "thirdParty": { - "message": "Third-Party" + "message": "Tercers" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "Connectat a la implementació del servidor de tercers, $SERVERNAME$. Verifiqueu els errors utilitzant el servidor oficial o comuniqueu-los al servidor de tercers.", "placeholders": { "servername": { "content": "$1", @@ -2017,7 +2017,7 @@ } }, "lastSeenOn": { - "message": "last seen on $DATE$", + "message": "vist per última vegada el $DATE$", "placeholders": { "date": { "content": "$1", diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index ea449c6cc97d..a85bcbf7e6d2 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -430,7 +430,7 @@ "message": "마스터 비밀번호를 재입력해야 합니다." }, "masterPasswordMinlength": { - "message": "Master password must be at least 8 characters long." + "message": "마스터 비밀번호는 최소 8자 이상이어야 합니다." }, "masterPassDoesntMatch": { "message": "마스터 비밀번호 확인과 마스터 비밀번호가 일치하지 않습니다." diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 9297eac5ae31..cc5e8dcff1c8 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -406,7 +406,7 @@ "message": "Po zablokowaniu komputera" }, "onRestart": { - "message": "Po uruchomieniu przeglądarki" + "message": "Po restarcie przeglądarki" }, "never": { "message": "Nigdy" @@ -577,16 +577,16 @@ "message": "\"Dodaj powiadomienia logowania\" automatycznie wyświetla monit o zapisanie nowych danych logowania do sejfu przy każdym pierwszym logowaniu." }, "showCardsCurrentTab": { - "message": "Pokaż karty na stronie Karta" + "message": "Pokaż karty na stronie głównej" }, "showCardsCurrentTabDesc": { - "message": "Wyświetlaj elementy karty na stronie Karta, aby ułatwić autouzupełnianie." + "message": "Pokaż elementy karty na stronie głównej, aby ułatwić autouzupełnianie." }, "showIdentitiesCurrentTab": { - "message": "Pokaż tożsamości na stronie Karta" + "message": "Pokaż tożsamości na stronie głównej" }, "showIdentitiesCurrentTabDesc": { - "message": "Wyświetlaj elementy tożsamości na stronie Karta, aby ułatwić autouzupełnianie." + "message": "Pokaż elementy tożsamości na stronie głównej, aby ułatwić autouzupełnianie." }, "clearClipboard": { "message": "Wyczyść schowek", @@ -621,7 +621,7 @@ "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny. " }, "defaultUriMatchDetection": { - "message": "Domyślna metoda dopasowania adresu", + "message": "Domyślne wykrywanie dopasowania", "description": "Default URI match detection for auto-fill." }, "defaultUriMatchDetectionDesc": { diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 38d6a28475a6..3e79a9e586d7 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -146,10 +146,10 @@ "message": "Hesap" }, "changeMasterPassword": { - "message": "Ana Parolayı Değiştir" + "message": "Ana parolayı değiştir" }, "fingerprintPhrase": { - "message": "Özgün Cümle", + "message": "Parmak izi ifadesi", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { @@ -157,10 +157,10 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "İki Aşamalı Giriş" + "message": "İki aşamalı giriş" }, "logOut": { - "message": "Çıkış Yap" + "message": "Çıkış yap" }, "about": { "message": "Hakkında" @@ -193,7 +193,7 @@ "message": "Listelenecek klasör yok." }, "helpFeedback": { - "message": "Yardım & Geribildirim" + "message": "Yardım ve geribildirim" }, "sync": { "message": "Eşitle" @@ -215,10 +215,10 @@ "message": "Hesaplarınız için otomatik olarak güçlü, özgün parolalar oluşturun." }, "bitWebVault": { - "message": "Bitwarden Web Kasası" + "message": "Bitwarden web kasası" }, "importItems": { - "message": "Hesapları İçe Aktar" + "message": "Hesapları içe aktar" }, "select": { "message": "Seç" @@ -367,7 +367,7 @@ "message": "Kasa zaman aşımı" }, "lockNow": { - "message": "Şimdi Kilitle" + "message": "Şimdi kilitle" }, "immediately": { "message": "Hemen" @@ -403,10 +403,10 @@ "message": "4 saat" }, "onLocked": { - "message": "Sistem Kilitliyken" + "message": "Sistem kilitlenince" }, "onRestart": { - "message": "Tarayıcı Yeniden Başlatıldığında" + "message": "Tarayıcı yeniden başlatılınca" }, "never": { "message": "Asla" @@ -574,7 +574,7 @@ "message": "Hesap eklemeyi öner" }, "addLoginNotificationDesc": { - "message": "\"Hesap Ekle Bildirimi\" otomatik olarak, ilk kez oturum açtığınız hesabınızı kasanıza kaydetmeniz için uyarı verir." + "message": "\"Hesap ekle\" bildirimi, ilk kez kullandığınız hesap bilgilerini kasanıza kaydetmek isteyip istemediğinizi otomatik olarak sorar." }, "showCardsCurrentTab": { "message": "Sekme sayfasında kartları göster" @@ -589,7 +589,7 @@ "message": "Kolay otomatik doldurma için sekme sayfasında kimlik öğelerini listele" }, "clearClipboard": { - "message": "Panoyu Temizle", + "message": "Panoyu temizle", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { @@ -646,7 +646,7 @@ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Kasayı Dışa Aktar" + "message": "Kasayı dışa aktar" }, "fileFormat": { "message": "Dosya biçimi" @@ -750,7 +750,7 @@ "message": "Şifreleme anahtarınızı güncellemeden bu özelliği kullanamazsınız." }, "premiumMembership": { - "message": "Premium Üyelik" + "message": "Premium üyelik" }, "premiumManage": { "message": "Üyeliğimi yönet" @@ -966,7 +966,7 @@ "message": "Hesaplar için varsayılan otomatik doldurma ayarı" }, "defaultAutoFillOnPageLoadDesc": { - "message": "\"Sayfa yüklendiğinde otomatik doldur\"u açtıktan sonra her hesap için bu özelliği ayrı ayrı açıp kapatabilirsiniz. Bu ayar, özellikle ayarlama yapmadığınız hesaplarda kullanılacak varsayılan ayardır." + "message": "\"Sayfa yüklendiğinde otomatik doldur\"u her hesabın \"Düzenle\" görünümünden ayrı ayrı kapatabilirsiniz." }, "itemAutoFillOnPageLoad": { "message": "Sayfa yüklendiğinde otomatik doldur (seçeneklerde etkinleştirilmişse)" @@ -1898,7 +1898,7 @@ "message": "Kişisel Kasayı Dışa Aktar" }, "exportingPersonalVaultDescription": { - "message": "Yalnızca $EMAIL$ ile ilişkili kişisel kasa öğeleri dışa aktarılacaktır. Kuruluş kasası öğeleri dahil edilmeyecektir.", + "message": "Yalnızca $EMAIL$ ile ilişkili kişisel kasadaki kayıtlar dışa aktarılacaktır. Kuruluş kasasındaki kayıtlar dahil edilmeyecektir.", "placeholders": { "email": { "content": "$1", @@ -2008,7 +2008,7 @@ "message": "Üçüncü Taraf" }, "thirdPartyServerMessage": { - "message": "Üçüncü taraf sunucu uygulamasına bağlandı, $SERVERNAME$. Lütfen resmi sunucuyu kullanarak hataları doğrulayın veya üçüncü taraf sunucuya bildirin.", + "message": "$SERVERNAME$ adresindeki üçüncü taraf sunucuya bağlandınız. Lütfen resmi sunucuyu kullanarak hataları doğrulayın veya üçüncü taraf sunucuya bildirin.", "placeholders": { "servername": { "content": "$1", diff --git a/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts b/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts index c82f2700213c..b177d118f824 100644 --- a/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts +++ b/apps/browser/src/decorators/session-sync-observable/session-sync.decorator.spec.ts @@ -19,6 +19,7 @@ describe("sessionSync decorator", () => { ctor: ctor, initializer: initializer, }), + testClass.testProperty.complete(), ]); }); }); diff --git a/apps/browser/src/decorators/session-sync-observable/session-syncer.spec.ts b/apps/browser/src/decorators/session-sync-observable/session-syncer.spec.ts index f2df60ad7a4b..5286cece1bb3 100644 --- a/apps/browser/src/decorators/session-sync-observable/session-syncer.spec.ts +++ b/apps/browser/src/decorators/session-sync-observable/session-syncer.spec.ts @@ -5,6 +5,7 @@ import { BrowserApi } from "../../browser/browserApi"; import { StateService } from "../../services/abstractions/state.service"; import { SessionSyncer } from "./session-syncer"; +import { SyncedItemMetadata } from "./sync-item-metadata"; describe("session syncer", () => { const propertyKey = "behaviorSubject"; @@ -140,12 +141,14 @@ describe("session syncer", () => { }); it("should update from message on emit from another instance", async () => { + const builder = jest.fn(); + jest.spyOn(SyncedItemMetadata, "builder").mockReturnValue(builder); stateService.getFromSessionMemory.mockResolvedValue("test"); await sut.updateFromMessage({ command: `${sessionKey}_update`, id: "different_id" }); expect(stateService.getFromSessionMemory).toHaveBeenCalledTimes(1); - expect(stateService.getFromSessionMemory).toHaveBeenCalledWith(sessionKey); + expect(stateService.getFromSessionMemory).toHaveBeenCalledWith(sessionKey, builder); expect(nextSpy).toHaveBeenCalledTimes(1); expect(nextSpy).toHaveBeenCalledWith("test"); diff --git a/apps/browser/src/decorators/session-sync-observable/session-syncer.ts b/apps/browser/src/decorators/session-sync-observable/session-syncer.ts index 0c97b983f75b..c757a44c7f2d 100644 --- a/apps/browser/src/decorators/session-sync-observable/session-syncer.ts +++ b/apps/browser/src/decorators/session-sync-observable/session-syncer.ts @@ -66,8 +66,8 @@ export class SessionSyncer { if (message.command != this.updateMessageCommand || message.id === this.id) { return; } - const keyValuePair = await this.stateService.getFromSessionMemory(this.metaData.sessionKey); - const value = SyncedItemMetadata.buildFromKeyValuePair(keyValuePair, this.metaData); + const builder = SyncedItemMetadata.builder(this.metaData); + const value = await this.stateService.getFromSessionMemory(this.metaData.sessionKey, builder); this.ignoreNextUpdate = true; this.behaviorSubject.next(value); } diff --git a/apps/browser/src/decorators/session-sync-observable/sync-item-metadata.ts b/apps/browser/src/decorators/session-sync-observable/sync-item-metadata.ts index e225db61967f..2b3f4715d460 100644 --- a/apps/browser/src/decorators/session-sync-observable/sync-item-metadata.ts +++ b/apps/browser/src/decorators/session-sync-observable/sync-item-metadata.ts @@ -5,19 +5,15 @@ export class SyncedItemMetadata { initializer?: (keyValuePair: any) => any; initializeAsArray?: boolean; - static buildFromKeyValuePair(keyValuePair: any, metadata: SyncedItemMetadata): any { - const builder = SyncedItemMetadata.getBuilder(metadata); - + static builder(metadata: SyncedItemMetadata): (o: any) => any { + const itemBuilder = + metadata.initializer != null + ? metadata.initializer + : (o: any) => Object.assign(new metadata.ctor(), o); if (metadata.initializeAsArray) { - return keyValuePair.map((o: any) => builder(o)); + return (keyValuePair: any) => keyValuePair.map((o: any) => itemBuilder(o)); } else { - return builder(keyValuePair); + return (keyValuePair: any) => itemBuilder(keyValuePair); } } - - private static getBuilder(metadata: SyncedItemMetadata): (o: any) => any { - return metadata.initializer != null - ? metadata.initializer - : (o: any) => Object.assign(new metadata.ctor(), o); - } } diff --git a/apps/browser/src/decorators/session-sync-observable/synced-item-metadata.spec.ts b/apps/browser/src/decorators/session-sync-observable/synced-item-metadata.spec.ts index da65be04903e..5cd869a5b679 100644 --- a/apps/browser/src/decorators/session-sync-observable/synced-item-metadata.spec.ts +++ b/apps/browser/src/decorators/session-sync-observable/synced-item-metadata.spec.ts @@ -1,59 +1,39 @@ import { SyncedItemMetadata } from "./sync-item-metadata"; -describe("build from key value pair", () => { +describe("builder", () => { const propertyKey = "propertyKey"; const key = "key"; const initializer = (s: any) => "used initializer"; class TestClass {} const ctor = TestClass; - it("should call initializer if provided", () => { - const actual = SyncedItemMetadata.buildFromKeyValuePair( - {}, - { - propertyKey, - sessionKey: "key", - initializer: initializer, - } - ); - - expect(actual).toEqual("used initializer"); + it("should use initializer if provided", () => { + const metadata = { propertyKey, sessionKey: key, initializer }; + const builder = SyncedItemMetadata.builder(metadata); + expect(builder({})).toBe("used initializer"); }); - it("should call ctor if provided", () => { - const expected = { provided: "value" }; - const actual = SyncedItemMetadata.buildFromKeyValuePair(expected, { - propertyKey, - sessionKey: key, - ctor: ctor, - }); - - expect(actual).toBeInstanceOf(ctor); - expect(actual).toEqual(expect.objectContaining(expected)); + it("should use ctor if initializer is not provided", () => { + const metadata = { propertyKey, sessionKey: key, ctor }; + const builder = SyncedItemMetadata.builder(metadata); + expect(builder({})).toBeInstanceOf(TestClass); }); - it("should prefer using initializer if both are provided", () => { - const actual = SyncedItemMetadata.buildFromKeyValuePair( - {}, - { - propertyKey, - sessionKey: key, - initializer: initializer, - ctor: ctor, - } - ); - - expect(actual).toEqual("used initializer"); + it("should prefer initializer over ctor", () => { + const metadata = { propertyKey, sessionKey: key, ctor, initializer }; + const builder = SyncedItemMetadata.builder(metadata); + expect(builder({})).toBe("used initializer"); }); it("should honor initialize as array", () => { - const actual = SyncedItemMetadata.buildFromKeyValuePair([1, 2], { + const metadata = { propertyKey, sessionKey: key, initializer: initializer, initializeAsArray: true, - }); - - expect(actual).toEqual(["used initializer", "used initializer"]); + }; + const builder = SyncedItemMetadata.builder(metadata); + expect(builder([{}])).toBeInstanceOf(Array); + expect(builder([{}])[0]).toBe("used initializer"); }); }); diff --git a/apps/browser/src/popup/accounts/login.component.html b/apps/browser/src/popup/accounts/login.component.html index 4c18805f452a..1b32f63819a6 100644 --- a/apps/browser/src/popup/accounts/login.component.html +++ b/apps/browser/src/popup/accounts/login.component.html @@ -1,4 +1,4 @@ -