mirror of
https://github.com/aliasvault/aliasvault.git
synced 2025-12-31 10:09:22 -05:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1892cb2ca8 | ||
|
|
d1fdf3ae26 | ||
|
|
12bedc1b69 | ||
|
|
a8b871b1a0 | ||
|
|
572a364728 | ||
|
|
c3ef7f242b | ||
|
|
44fc64965e | ||
|
|
f482aeb99a | ||
|
|
41b29593ae | ||
|
|
84010a4d39 | ||
|
|
04a745472f | ||
|
|
58fe1ce7bf | ||
|
|
dad3d2f43a | ||
|
|
b335047310 | ||
|
|
ad67bb80c7 | ||
|
|
7c14c2a3f9 | ||
|
|
44c16f4cd1 | ||
|
|
4bf103d261 | ||
|
|
68b19b9545 | ||
|
|
e6d51ca1b1 | ||
|
|
13e7f1ddd9 | ||
|
|
e5d342b961 | ||
|
|
a58426abcb | ||
|
|
819385bc0a | ||
|
|
c0cbc0be7b | ||
|
|
40686f97e0 | ||
|
|
f10fb989ce | ||
|
|
ca85c04c75 | ||
|
|
fd9eb9d653 | ||
|
|
0a70902d69 | ||
|
|
eee41df9a4 | ||
|
|
d563d6d448 | ||
|
|
db1474397c | ||
|
|
e881f9486a | ||
|
|
645fd605e6 | ||
|
|
254f0a1212 | ||
|
|
64d29ebcd4 | ||
|
|
df0d74595f |
44
.github/workflows/release.yml
vendored
44
.github/workflows/release.yml
vendored
@@ -27,7 +27,33 @@ on:
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
# Guard job to prevent releases from main branch
|
||||
valid-release:
|
||||
if: github.event_name == 'release'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check tag target
|
||||
run: |
|
||||
BRANCHES=$(git branch -r --contains $GITHUB_SHA)
|
||||
|
||||
echo "Tag is contained in:"
|
||||
echo "$BRANCHES"
|
||||
|
||||
if ! echo "$BRANCHES" | grep -q "origin/release/"; then
|
||||
echo "❌ Releases must come from a release/* branch, please recreate the release from a release branch"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Tag is on a release branch"
|
||||
|
||||
upload-install-script:
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success')
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -43,7 +69,8 @@ jobs:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
build-chrome-extension:
|
||||
if: github.event_name == 'release' || inputs.build_browser_extensions
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success') && (github.event_name == 'release' || inputs.build_browser_extensions)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -58,7 +85,8 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
build-firefox-extension:
|
||||
if: github.event_name == 'release' || inputs.build_browser_extensions
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success') && (github.event_name == 'release' || inputs.build_browser_extensions)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -73,7 +101,8 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
build-edge-extension:
|
||||
if: github.event_name == 'release' || inputs.build_browser_extensions
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success') && (github.event_name == 'release' || inputs.build_browser_extensions)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -88,7 +117,8 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
build-android-release:
|
||||
if: github.event_name == 'release' || inputs.build_mobile_apps
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success') && (github.event_name == 'release' || inputs.build_mobile_apps)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -107,7 +137,8 @@ jobs:
|
||||
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
|
||||
|
||||
build-and-push-docker-multi-container:
|
||||
if: github.event_name == 'release' || inputs.build_multi_container
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success') && (github.event_name == 'release' || inputs.build_multi_container)
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
@@ -372,7 +403,8 @@ jobs:
|
||||
annotations: ${{ steps.installcli-meta.outputs.annotations }}
|
||||
|
||||
build-and-push-docker-all-in-one:
|
||||
if: github.event_name == 'release' || inputs.build_all_in_one
|
||||
needs: [valid-release]
|
||||
if: always() && (github.event_name != 'release' || needs.valid-release.result == 'success') && (github.event_name == 'release' || inputs.build_all_in_one)
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
@@ -1 +1 @@
|
||||
1
|
||||
3
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.25.1
|
||||
0.25.3
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "aliasvault-browser-extension",
|
||||
"description": "AliasVault Browser Extension",
|
||||
"private": true,
|
||||
"version": "0.25.1",
|
||||
"version": "0.25.3",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev:chrome": "wxt -b chrome",
|
||||
|
||||
@@ -463,7 +463,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -476,7 +476,7 @@
|
||||
"@executable_path/../../../../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
SafariServices,
|
||||
@@ -495,7 +495,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "AliasVault Extension/AliasVault_Extension.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -508,7 +508,7 @@
|
||||
"@executable_path/../../../../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
SafariServices,
|
||||
@@ -532,7 +532,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -547,7 +547,7 @@
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
SafariServices,
|
||||
@@ -571,7 +571,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -586,7 +586,7 @@
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
OTHER_LDFLAGS = (
|
||||
"-framework",
|
||||
SafariServices,
|
||||
|
||||
@@ -9,7 +9,7 @@ import { handleClipboardCopied, handleCancelClipboardClear, handleGetClipboardCl
|
||||
import { setupContextMenus } from '@/entrypoints/background/ContextMenu';
|
||||
import { handleGetWebAuthnSettings, handleWebAuthnCreate, handleWebAuthnGet, handlePasskeyPopupResponse, handleGetRequestData } from '@/entrypoints/background/PasskeyHandler';
|
||||
import { handleOpenPopup, handlePopupWithCredential, handleOpenPopupCreateCredential, handleToggleContextMenu } from '@/entrypoints/background/PopupMessageHandler';
|
||||
import { handleCheckAuthStatus, handleClearPersistedFormValues, handleClearVault, handleCreateIdentity, handleGetCredentials, handleGetDefaultEmailDomain, handleGetDefaultIdentitySettings, handleGetEncryptionKey, handleGetEncryptionKeyDerivationParams, handleGetPasswordSettings, handleGetPersistedFormValues, handleGetVault, handlePersistFormValues, handleStoreEncryptionKey, handleStoreEncryptionKeyDerivationParams, handleStoreVault, handleSyncVault, handleUploadVault } from '@/entrypoints/background/VaultMessageHandler';
|
||||
import { handleCheckAuthStatus, handleClearPersistedFormValues, handleClearVault, handleCreateIdentity, handleGetCredentials, handleGetFilteredCredentials, handleGetSearchCredentials, handleGetDefaultEmailDomain, handleGetDefaultIdentitySettings, handleGetEncryptionKey, handleGetEncryptionKeyDerivationParams, handleGetPasswordSettings, handleGetPersistedFormValues, handleGetVault, handlePersistFormValues, handleStoreEncryptionKey, handleStoreEncryptionKeyDerivationParams, handleStoreVault, handleSyncVault, handleUploadVault } from '@/entrypoints/background/VaultMessageHandler';
|
||||
|
||||
import { GLOBAL_CONTEXT_MENU_ENABLED_KEY } from '@/utils/Constants';
|
||||
import { EncryptionKeyDerivationParams } from "@/utils/dist/shared/models/metadata";
|
||||
@@ -28,6 +28,8 @@ export default defineBackground({
|
||||
onMessage('GET_ENCRYPTION_KEY_DERIVATION_PARAMS', () => handleGetEncryptionKeyDerivationParams());
|
||||
onMessage('GET_VAULT', () => handleGetVault());
|
||||
onMessage('GET_CREDENTIALS', () => handleGetCredentials());
|
||||
onMessage('GET_FILTERED_CREDENTIALS', ({ data }) => handleGetFilteredCredentials(data as { currentUrl: string, pageTitle: string, matchingMode?: string }));
|
||||
onMessage('GET_SEARCH_CREDENTIALS', ({ data }) => handleGetSearchCredentials(data as { searchTerm: string }));
|
||||
|
||||
onMessage('GET_DEFAULT_EMAIL_DOMAIN', () => handleGetDefaultEmailDomain());
|
||||
onMessage('GET_DEFAULT_IDENTITY_SETTINGS', () => handleGetDefaultIdentitySettings());
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import { handleGetEncryptionKey } from '@/entrypoints/background/VaultMessageHandler';
|
||||
import { extractDomain, extractRootDomain } from '@/entrypoints/contentScript/CredentialMatcher';
|
||||
|
||||
import {
|
||||
PASSKEY_PROVIDER_ENABLED_KEY,
|
||||
PASSKEY_DISABLED_SITES_KEY
|
||||
} from '@/utils/Constants';
|
||||
import { extractDomain, extractRootDomain } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
import { EncryptionUtility } from '@/utils/EncryptionUtility';
|
||||
import { PasskeyHelper } from '@/utils/passkey/PasskeyHelper';
|
||||
import type {
|
||||
|
||||
@@ -18,6 +18,21 @@ import { WebApiService } from '@/utils/WebApiService';
|
||||
|
||||
import { t } from '@/i18n/StandaloneI18n';
|
||||
|
||||
/**
|
||||
* Cache for the SqliteClient to avoid repeated decryption and initialization.
|
||||
* The cached instance is the single source of truth for the in-memory vault.
|
||||
*
|
||||
* Cache Strategy:
|
||||
* - Local mutations (createCredential, etc.): Work directly on cachedSqliteClient, no cache clearing
|
||||
* - New vault from remote (login, sync): Clear cache by setting both to null
|
||||
* - Logout/clear vault: Clear cache by setting both to null
|
||||
*
|
||||
* The cache is cleared by setting cachedSqliteClient and cachedVaultBlob to null directly
|
||||
* in the functions that receive new vault data from external sources.
|
||||
*/
|
||||
let cachedSqliteClient: SqliteClient | null = null;
|
||||
let cachedVaultBlob: string | null = null;
|
||||
|
||||
/**
|
||||
* Check if the user is logged in and if the vault is locked, and also check for pending migrations.
|
||||
*/
|
||||
@@ -58,8 +73,6 @@ export async function handleCheckAuthStatus() : Promise<{ isLoggedIn: boolean, i
|
||||
hasPendingMigrations
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Error checking pending migrations:', error);
|
||||
|
||||
// If it's a version incompatibility error, we need to handle it specially
|
||||
if (error instanceof VaultVersionIncompatibleError) {
|
||||
// Return the error so the UI can handle it appropriately (logout user)
|
||||
@@ -92,6 +105,10 @@ export async function handleStoreVault(
|
||||
// Store new encrypted vault in session storage.
|
||||
await storage.setItem('session:encryptedVault', vaultRequest.vaultBlob);
|
||||
|
||||
// Clear cached client since we received a new vault blob from external source
|
||||
cachedSqliteClient = null;
|
||||
cachedVaultBlob = null;
|
||||
|
||||
/*
|
||||
* For all other values, check if they have a value and store them in session storage if they do.
|
||||
* Some updates, e.g. when mutating local database, these values will not be set.
|
||||
@@ -155,7 +172,7 @@ export async function handleStoreEncryptionKeyDerivationParams(
|
||||
*/
|
||||
export async function handleSyncVault(
|
||||
) : Promise<messageBoolResponse> {
|
||||
const webApi = new WebApiService(() => {});
|
||||
const webApi = new WebApiService();
|
||||
const statusResponse = await webApi.getStatus();
|
||||
const statusError = webApi.validateStatusResponse(statusResponse);
|
||||
if (statusError !== null) {
|
||||
@@ -175,6 +192,10 @@ export async function handleSyncVault(
|
||||
{ key: 'session:hiddenPrivateEmailDomains', value: vaultResponse.vault.hiddenPrivateEmailDomainList },
|
||||
{ key: 'session:vaultRevisionNumber', value: vaultResponse.vault.currentRevisionNumber }
|
||||
]);
|
||||
|
||||
// Clear cached client since we received a new vault blob from server
|
||||
cachedSqliteClient = null;
|
||||
cachedVaultBlob = null;
|
||||
}
|
||||
|
||||
return { success: true };
|
||||
@@ -240,6 +261,10 @@ export function handleClearVault(
|
||||
'session:vaultRevisionNumber'
|
||||
]);
|
||||
|
||||
// Clear cached client since vault was cleared
|
||||
cachedSqliteClient = null;
|
||||
cachedVaultBlob = null;
|
||||
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
@@ -264,6 +289,100 @@ export async function handleGetCredentials(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credentials filtered by URL and page title for autofill performance optimization.
|
||||
* Filters credentials in the background script before sending to reduce message payload size.
|
||||
* Critical for large vaults (1000+ credentials) to avoid multi-second delays.
|
||||
*
|
||||
* @param message - Filtering parameters: currentUrl, pageTitle, matchingMode
|
||||
*/
|
||||
export async function handleGetFilteredCredentials(
|
||||
message: { currentUrl: string, pageTitle: string, matchingMode?: string }
|
||||
) : Promise<messageCredentialsResponse> {
|
||||
const encryptionKey = await handleGetEncryptionKey();
|
||||
|
||||
if (!encryptionKey) {
|
||||
return { success: false, error: await t('common.errors.vaultIsLocked') };
|
||||
}
|
||||
|
||||
try {
|
||||
const sqliteClient = await createVaultSqliteClient();
|
||||
const allCredentials = sqliteClient.getAllCredentials();
|
||||
|
||||
const { filterCredentials, AutofillMatchingMode } = await import('@/utils/credentialMatcher/CredentialMatcher');
|
||||
|
||||
// Parse matching mode from string
|
||||
let matchingMode = AutofillMatchingMode.DEFAULT;
|
||||
if (message.matchingMode) {
|
||||
matchingMode = message.matchingMode as typeof AutofillMatchingMode[keyof typeof AutofillMatchingMode];
|
||||
}
|
||||
|
||||
// Filter credentials in background to reduce payload size (~95% reduction)
|
||||
const filteredCredentials = filterCredentials(
|
||||
allCredentials,
|
||||
message.currentUrl,
|
||||
message.pageTitle,
|
||||
matchingMode
|
||||
);
|
||||
|
||||
return { success: true, credentials: filteredCredentials };
|
||||
} catch (error) {
|
||||
console.error('Error getting filtered credentials:', error);
|
||||
return { success: false, error: await t('common.errors.unknownError') };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credentials filtered by text search query.
|
||||
* Searches across entire vault (service name, username, email, URL) and returns matches.
|
||||
*
|
||||
* @param message - Search parameters: searchTerm
|
||||
*/
|
||||
export async function handleGetSearchCredentials(
|
||||
message: { searchTerm: string }
|
||||
) : Promise<messageCredentialsResponse> {
|
||||
const encryptionKey = await handleGetEncryptionKey();
|
||||
|
||||
if (!encryptionKey) {
|
||||
return { success: false, error: await t('common.errors.vaultIsLocked') };
|
||||
}
|
||||
|
||||
try {
|
||||
const sqliteClient = await createVaultSqliteClient();
|
||||
const allCredentials = sqliteClient.getAllCredentials();
|
||||
|
||||
// If search term is empty, return empty array
|
||||
if (!message.searchTerm || message.searchTerm.trim() === '') {
|
||||
return { success: true, credentials: [] };
|
||||
}
|
||||
|
||||
const searchTerm = message.searchTerm.toLowerCase().trim();
|
||||
|
||||
// Filter credentials by search term across multiple fields
|
||||
const searchResults = allCredentials.filter(cred => {
|
||||
const searchableFields = [
|
||||
cred.ServiceName?.toLowerCase(),
|
||||
cred.Username?.toLowerCase(),
|
||||
cred.Alias?.Email?.toLowerCase(),
|
||||
cred.ServiceUrl?.toLowerCase()
|
||||
];
|
||||
return searchableFields.some(field => field?.includes(searchTerm));
|
||||
}).sort((a, b) => {
|
||||
// Sort by service name, then username
|
||||
const serviceNameComparison = (a.ServiceName ?? '').localeCompare(b.ServiceName ?? '');
|
||||
if (serviceNameComparison !== 0) {
|
||||
return serviceNameComparison;
|
||||
}
|
||||
return (a.Username ?? '').localeCompare(b.Username ?? '');
|
||||
});
|
||||
|
||||
return { success: true, credentials: searchResults };
|
||||
} catch (error) {
|
||||
console.error('Error searching credentials:', error);
|
||||
return { success: false, error: await t('common.errors.unknownError') };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an identity.
|
||||
*/
|
||||
@@ -405,13 +524,11 @@ export async function handleUploadVault(
|
||||
message: any
|
||||
) : Promise<messageVaultUploadResponse> {
|
||||
try {
|
||||
// Store the new vault blob in session storage.
|
||||
// Persist the current updated vault blob in session storage.
|
||||
await storage.setItem('session:encryptedVault', message.vaultBlob);
|
||||
|
||||
// Create new sqlite client which will use the new vault blob.
|
||||
const sqliteClient = await createVaultSqliteClient();
|
||||
|
||||
// Upload the new vault to the server.
|
||||
const sqliteClient = await createVaultSqliteClient();
|
||||
const response = await uploadNewVaultToServer(sqliteClient);
|
||||
return { success: true, status: response.status, newRevisionNumber: response.newRevisionNumber };
|
||||
} catch (error) {
|
||||
@@ -486,10 +603,17 @@ async function uploadNewVaultToServer(sqliteClient: SqliteClient) : Promise<Vaul
|
||||
encryptionKey
|
||||
);
|
||||
|
||||
// Update storage with the newly encrypted vault (serialized from current in-memory state)
|
||||
await storage.setItems([
|
||||
{ key: 'session:encryptedVault', value: encryptedVault }
|
||||
]);
|
||||
|
||||
/*
|
||||
* Update cached vault blob to match the new encrypted version
|
||||
* This prevents unnecessary cache invalidation since the in-memory sqliteClient is already up to date
|
||||
*/
|
||||
cachedVaultBlob = encryptedVault;
|
||||
|
||||
// Get metadata from storage
|
||||
const vaultRevisionNumber = await storage.getItem('session:vaultRevisionNumber') as number;
|
||||
|
||||
@@ -510,7 +634,7 @@ async function uploadNewVaultToServer(sqliteClient: SqliteClient) : Promise<Vaul
|
||||
encryptionPublicKey: '',
|
||||
};
|
||||
|
||||
const webApi = new WebApiService(() => {});
|
||||
const webApi = new WebApiService();
|
||||
const response = await webApi.post<Vault, VaultPostResponse>('Vault', newVault);
|
||||
|
||||
// Check if response is successful (.status === 0)
|
||||
@@ -525,6 +649,7 @@ async function uploadNewVaultToServer(sqliteClient: SqliteClient) : Promise<Vaul
|
||||
|
||||
/**
|
||||
* Create a new sqlite client for the stored vault.
|
||||
* Uses a cache to avoid repeated decryption and initialization for read operations.
|
||||
*/
|
||||
async function createVaultSqliteClient() : Promise<SqliteClient> {
|
||||
const encryptedVault = await storage.getItem('session:encryptedVault') as string;
|
||||
@@ -533,15 +658,24 @@ async function createVaultSqliteClient() : Promise<SqliteClient> {
|
||||
throw new Error(await t('common.errors.unknownError'));
|
||||
}
|
||||
|
||||
// Decrypt the vault.
|
||||
// Check if we have a valid cached client
|
||||
if (cachedSqliteClient && cachedVaultBlob === encryptedVault) {
|
||||
return cachedSqliteClient;
|
||||
}
|
||||
|
||||
// Decrypt the vault
|
||||
const decryptedVault = await EncryptionUtility.symmetricDecrypt(
|
||||
encryptedVault,
|
||||
encryptionKey
|
||||
);
|
||||
|
||||
// Initialize the SQLite client with the decrypted vault.
|
||||
// Initialize the SQLite client with the decrypted vault
|
||||
const sqliteClient = new SqliteClient();
|
||||
await sqliteClient.initializeFromBase64(decryptedVault);
|
||||
|
||||
// Cache the client and vault blob
|
||||
cachedSqliteClient = sqliteClient;
|
||||
cachedVaultBlob = encryptedVault;
|
||||
|
||||
return sqliteClient;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { sendMessage } from 'webext-bridge/content-script';
|
||||
|
||||
import { filterCredentials, AutofillMatchingMode } from '@/entrypoints/contentScript/CredentialMatcher';
|
||||
import { fillCredential } from '@/entrypoints/contentScript/Form';
|
||||
|
||||
import { DISABLED_SITES_KEY, TEMPORARY_DISABLED_SITES_KEY, GLOBAL_AUTOFILL_POPUP_ENABLED_KEY, VAULT_LOCKED_DISMISS_UNTIL_KEY, AUTOFILL_MATCHING_MODE_KEY, CUSTOM_EMAIL_HISTORY_KEY, CUSTOM_USERNAME_HISTORY_KEY } from '@/utils/Constants';
|
||||
import { AutofillMatchingMode } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
import { CreateIdentityGenerator } from '@/utils/dist/shared/identity-generator';
|
||||
import type { Credential } from '@/utils/dist/shared/models/vault';
|
||||
import { CreatePasswordGenerator, PasswordGenerator, PasswordSettings } from '@/utils/dist/shared/password-generator';
|
||||
@@ -49,7 +49,14 @@ export function openAutofillPopup(input: HTMLInputElement, container: HTMLElemen
|
||||
document.addEventListener('keydown', handleEnterKey);
|
||||
|
||||
(async () : Promise<void> => {
|
||||
const response = await sendMessage('GET_CREDENTIALS', { }, 'background') as CredentialsResponse;
|
||||
// Load autofill matching mode setting to send to background for filtering
|
||||
const matchingMode = await storage.getItem(AUTOFILL_MATCHING_MODE_KEY) as AutofillMatchingMode ?? AutofillMatchingMode.DEFAULT;
|
||||
|
||||
const response = await sendMessage('GET_FILTERED_CREDENTIALS', {
|
||||
currentUrl: window.location.href,
|
||||
pageTitle: document.title,
|
||||
matchingMode: matchingMode
|
||||
}, 'background') as CredentialsResponse;
|
||||
|
||||
if (response.success) {
|
||||
await createAutofillPopup(input, response.credentials, container);
|
||||
@@ -182,22 +189,12 @@ export async function createAutofillPopup(input: HTMLInputElement, credentials:
|
||||
credentialList.className = 'av-credential-list';
|
||||
popup.appendChild(credentialList);
|
||||
|
||||
// Add initial credentials
|
||||
// Add initial credentials (already filtered by background script for performance)
|
||||
if (!credentials) {
|
||||
credentials = [];
|
||||
}
|
||||
|
||||
// Load autofill matching mode setting
|
||||
const matchingMode = await storage.getItem(AUTOFILL_MATCHING_MODE_KEY) as AutofillMatchingMode ?? AutofillMatchingMode.DEFAULT;
|
||||
|
||||
const filteredCredentials = filterCredentials(
|
||||
credentials,
|
||||
window.location.href,
|
||||
document.title,
|
||||
matchingMode
|
||||
);
|
||||
|
||||
updatePopupContent(filteredCredentials, credentialList, input, rootContainer, noMatchesText);
|
||||
updatePopupContent(credentials, credentialList, input, rootContainer, noMatchesText);
|
||||
|
||||
// Add divider
|
||||
const divider = document.createElement('div');
|
||||
@@ -549,62 +546,41 @@ export async function createVaultLockedPopup(input: HTMLInputElement, rootContai
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle popup search input by filtering credentials based on the search term.
|
||||
* Handle popup search input - searches entire vault when user types.
|
||||
* When empty, shows the initially URL-filtered credentials.
|
||||
* When user types, searches ALL credentials in vault (not just the pre-filtered set).
|
||||
*
|
||||
* @param searchInput - The search input element
|
||||
* @param initialCredentials - The initially URL-filtered credentials to show when search is empty
|
||||
* @param rootContainer - The root container element
|
||||
* @param searchTimeout - Timeout for debouncing search
|
||||
* @param credentialList - The credential list element to update
|
||||
* @param input - The input field that triggered the popup
|
||||
* @param noMatchesText - Text to show when no matches found
|
||||
*/
|
||||
async function handleSearchInput(searchInput: HTMLInputElement, credentials: Credential[], rootContainer: HTMLElement, searchTimeout: NodeJS.Timeout | null, credentialList: HTMLElement | null, input: HTMLInputElement, noMatchesText?: string) : Promise<void> {
|
||||
async function handleSearchInput(searchInput: HTMLInputElement, initialCredentials: Credential[], rootContainer: HTMLElement, searchTimeout: NodeJS.Timeout | null, credentialList: HTMLElement | null, input: HTMLInputElement, noMatchesText?: string) : Promise<void> {
|
||||
if (searchTimeout) {
|
||||
clearTimeout(searchTimeout);
|
||||
}
|
||||
const searchTerm = searchInput.value.toLowerCase();
|
||||
|
||||
// Ensure we have unique credentials
|
||||
const uniqueCredentials = Array.from(new Map(credentials.map(cred => [cred.Id, cred])).values());
|
||||
let filteredCredentials;
|
||||
const searchTerm = searchInput.value.trim();
|
||||
|
||||
if (searchTerm === '') {
|
||||
// Load autofill matching mode setting
|
||||
const matchingMode = await storage.getItem(AUTOFILL_MATCHING_MODE_KEY) as AutofillMatchingMode ?? AutofillMatchingMode.DEFAULT;
|
||||
|
||||
// If search is empty, use original URL-based filtering
|
||||
filteredCredentials = filterCredentials(
|
||||
uniqueCredentials,
|
||||
window.location.href,
|
||||
document.title,
|
||||
matchingMode
|
||||
).sort((a, b) => {
|
||||
// First compare by service name
|
||||
const serviceNameComparison = (a.ServiceName ?? '').localeCompare(b.ServiceName ?? '');
|
||||
if (serviceNameComparison !== 0) {
|
||||
return serviceNameComparison;
|
||||
}
|
||||
|
||||
// If service names are equal, compare by username/nickname
|
||||
return (a.Username ?? '').localeCompare(b.Username ?? '');
|
||||
});
|
||||
// If search is empty, show the initially URL-filtered credentials
|
||||
updatePopupContent(initialCredentials, credentialList, input, rootContainer, noMatchesText);
|
||||
} else {
|
||||
// Otherwise filter based on search term
|
||||
filteredCredentials = uniqueCredentials.filter(cred => {
|
||||
const searchableFields = [
|
||||
cred.ServiceName?.toLowerCase(),
|
||||
cred.Username?.toLowerCase(),
|
||||
cred.Alias?.Email?.toLowerCase(),
|
||||
cred.ServiceUrl?.toLowerCase()
|
||||
];
|
||||
return searchableFields.some(field => field?.includes(searchTerm));
|
||||
}).sort((a, b) => {
|
||||
// First compare by service name
|
||||
const serviceNameComparison = (a.ServiceName ?? '').localeCompare(b.ServiceName ?? '');
|
||||
if (serviceNameComparison !== 0) {
|
||||
return serviceNameComparison;
|
||||
}
|
||||
// Search in full vault with search term
|
||||
const response = await sendMessage('GET_SEARCH_CREDENTIALS', {
|
||||
searchTerm: searchTerm
|
||||
}, 'background') as CredentialsResponse;
|
||||
|
||||
// If service names are equal, compare by username/nickname
|
||||
return (a.Username ?? '').localeCompare(b.Username ?? '');
|
||||
});
|
||||
if (response.success && response.credentials) {
|
||||
updatePopupContent(response.credentials, credentialList, input, rootContainer, noMatchesText);
|
||||
} else {
|
||||
// On error, fallback to showing initial filtered credentials
|
||||
updatePopupContent(initialCredentials, credentialList, input, rootContainer, noMatchesText);
|
||||
}
|
||||
}
|
||||
|
||||
// Update popup content with filtered results
|
||||
updatePopupContent(filteredCredentials, credentialList, input, rootContainer, noMatchesText);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,7 +3,6 @@ import { useTranslation } from 'react-i18next';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import { sendMessage } from 'webext-bridge/popup';
|
||||
|
||||
import { extractDomain, extractRootDomain } from '@/entrypoints/contentScript/CredentialMatcher';
|
||||
import Button from '@/entrypoints/popup/components/Button';
|
||||
import PasskeyBypassDialog from '@/entrypoints/popup/components/Dialogs/PasskeyBypassDialog';
|
||||
import LoadingSpinner from '@/entrypoints/popup/components/LoadingSpinner';
|
||||
@@ -12,6 +11,7 @@ import { useLoading } from '@/entrypoints/popup/context/LoadingContext';
|
||||
import { useVaultLockRedirect } from '@/entrypoints/popup/hooks/useVaultLockRedirect';
|
||||
|
||||
import { PASSKEY_DISABLED_SITES_KEY } from '@/utils/Constants';
|
||||
import { extractDomain, extractRootDomain } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
import { PasskeyAuthenticator } from '@/utils/passkey/PasskeyAuthenticator';
|
||||
import { PasskeyHelper } from '@/utils/passkey/PasskeyHelper';
|
||||
import type { GetRequest, PasskeyGetCredentialResponse, PendingPasskeyGetRequest, StoredPasskeyRecord } from '@/utils/passkey/types';
|
||||
|
||||
@@ -3,7 +3,6 @@ import { useTranslation } from 'react-i18next';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import { sendMessage } from 'webext-bridge/popup';
|
||||
|
||||
import { extractDomain, extractRootDomain } from '@/entrypoints/contentScript/CredentialMatcher';
|
||||
import Alert from '@/entrypoints/popup/components/Alert';
|
||||
import Button from '@/entrypoints/popup/components/Button';
|
||||
import PasskeyBypassDialog from '@/entrypoints/popup/components/Dialogs/PasskeyBypassDialog';
|
||||
@@ -16,6 +15,7 @@ import { useVaultLockRedirect } from '@/entrypoints/popup/hooks/useVaultLockRedi
|
||||
import { useVaultMutate } from '@/entrypoints/popup/hooks/useVaultMutate';
|
||||
|
||||
import { PASSKEY_DISABLED_SITES_KEY } from '@/utils/Constants';
|
||||
import { extractDomain, extractRootDomain } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
import type { Passkey } from '@/utils/dist/shared/models/vault';
|
||||
import { PasskeyAuthenticator } from '@/utils/passkey/PasskeyAuthenticator';
|
||||
import { PasskeyHelper } from '@/utils/passkey/PasskeyHelper';
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import React, { useEffect, useState, useCallback } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { AutofillMatchingMode } from '@/entrypoints/contentScript/CredentialMatcher';
|
||||
import { useLoading } from '@/entrypoints/popup/context/LoadingContext';
|
||||
|
||||
import {
|
||||
@@ -10,6 +9,7 @@ import {
|
||||
TEMPORARY_DISABLED_SITES_KEY,
|
||||
AUTOFILL_MATCHING_MODE_KEY
|
||||
} from '@/utils/Constants';
|
||||
import { AutofillMatchingMode } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
|
||||
import { storage, browser } from "#imports";
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import React, { useEffect, useState, useCallback } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { extractDomain, extractRootDomain } from '@/entrypoints/contentScript/CredentialMatcher';
|
||||
import { useLoading } from '@/entrypoints/popup/context/LoadingContext';
|
||||
|
||||
import {
|
||||
PASSKEY_PROVIDER_ENABLED_KEY,
|
||||
PASSKEY_DISABLED_SITES_KEY
|
||||
} from '@/utils/Constants';
|
||||
import { extractDomain, extractRootDomain } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
|
||||
import { storage, browser } from "#imports";
|
||||
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
|
||||
import deTranslations from './locales/de.json';
|
||||
import enTranslations from './locales/en.json';
|
||||
import esTranslations from './locales/es.json';
|
||||
import fiTranslations from './locales/fi.json';
|
||||
import frTranslations from './locales/fr.json';
|
||||
import heTranslations from './locales/he.json';
|
||||
import itTranslations from './locales/it.json';
|
||||
import nlTranslations from './locales/nl.json';
|
||||
@@ -26,9 +28,15 @@ export const LANGUAGE_RESOURCES = {
|
||||
en: {
|
||||
translation: enTranslations
|
||||
},
|
||||
es: {
|
||||
translation: esTranslations
|
||||
},
|
||||
fi: {
|
||||
translation: fiTranslations
|
||||
},
|
||||
fr: {
|
||||
translation: frTranslations
|
||||
},
|
||||
he: {
|
||||
translation: heTranslations
|
||||
},
|
||||
@@ -72,12 +80,24 @@ export const AVAILABLE_LANGUAGES: ILanguageConfig[] = [
|
||||
nativeName: 'English',
|
||||
flag: '🇺🇸'
|
||||
},
|
||||
{
|
||||
code: 'es',
|
||||
name: 'Spanish',
|
||||
nativeName: 'Español',
|
||||
flag: '🇪🇸'
|
||||
},
|
||||
{
|
||||
code: 'fi',
|
||||
name: 'Finnish',
|
||||
nativeName: 'Suomi',
|
||||
flag: '🇫🇮'
|
||||
},
|
||||
{
|
||||
code: 'fr',
|
||||
name: 'French',
|
||||
nativeName: 'Français',
|
||||
flag: '🇫🇷'
|
||||
},
|
||||
{
|
||||
code: 'he',
|
||||
name: 'Hebrew',
|
||||
|
||||
@@ -1,441 +1,441 @@
|
||||
{
|
||||
"auth": {
|
||||
"loginTitle": "Log in to AliasVault",
|
||||
"username": "Username or email",
|
||||
"usernamePlaceholder": "name / name@company.com",
|
||||
"loginTitle": "Iniciar sesión en AliasVault",
|
||||
"username": "Nombre de usuario o correo electrónico",
|
||||
"usernamePlaceholder": "nombre / nombre@empresa.com",
|
||||
"password": "Contraseña",
|
||||
"passwordPlaceholder": "Enter your password",
|
||||
"rememberMe": "Remember me",
|
||||
"loginButton": "Log in",
|
||||
"noAccount": "No account yet?",
|
||||
"createVault": "Create new vault",
|
||||
"twoFactorTitle": "Please enter the authentication code from your authenticator app.",
|
||||
"authCode": "Authentication Code",
|
||||
"authCodePlaceholder": "Enter 6-digit code",
|
||||
"verify": "Verify",
|
||||
"twoFactorNote": "Note: if you don't have access to your authenticator device, you can reset your 2FA with a recovery code by logging in via the website.",
|
||||
"masterPassword": "Contraseña maestra",
|
||||
"unlockVault": "Unlock",
|
||||
"unlockWithPin": "Unlock with PIN",
|
||||
"enterPinToUnlock": "Enter your PIN to unlock your vault",
|
||||
"useMasterPassword": "Use Master Password",
|
||||
"unlockTitle": "Unlock Your Vault",
|
||||
"logout": "Logout",
|
||||
"logoutConfirm": "Are you sure you want to logout?",
|
||||
"unlockSuccessTitle": "Your vault is successfully unlocked",
|
||||
"unlockSuccessDescription": "You can now use autofill in login forms in your browser.",
|
||||
"closePopup": "Close this popup",
|
||||
"browseVault": "Browse vault contents",
|
||||
"connectingTo": "Connecting to",
|
||||
"switchAccounts": "Switch accounts?",
|
||||
"loggedIn": "Logged in",
|
||||
"loginWithMobile": "Log in using Mobile App",
|
||||
"unlockWithMobile": "Unlock using Mobile App",
|
||||
"scanQrCode": "Scan this QR code with your AliasVault mobile app to log in and unlock your vault.",
|
||||
"passwordPlaceholder": "Introduzca su contraseña",
|
||||
"rememberMe": "Recordar mis datos",
|
||||
"loginButton": "Iniciar sesión",
|
||||
"noAccount": "¿Sin cuenta todavía?",
|
||||
"createVault": "Crear nueva bóveda",
|
||||
"twoFactorTitle": "Por favor, introduzca el código de autenticación de su aplicación de autenticación.",
|
||||
"authCode": "Código de autenticación",
|
||||
"authCodePlaceholder": "Introduzca código de 6 dígitos",
|
||||
"verify": "Verificar",
|
||||
"twoFactorNote": "Nota: si no tiene acceso a su dispositivo de autenticación, puede restablecer su 2FA con un código de recuperación iniciando sesión a través del sitio web.",
|
||||
"masterPassword": "Contraseña Maestra",
|
||||
"unlockVault": "Desbloquear",
|
||||
"unlockWithPin": "Desbloquear con PIN",
|
||||
"enterPinToUnlock": "Introduzca su PIN para desbloquear su bóveda",
|
||||
"useMasterPassword": "Usar Contraseña Maestra",
|
||||
"unlockTitle": "Desbloquear tu Bóveda",
|
||||
"logout": "Cerrar sesión",
|
||||
"logoutConfirm": "¿Estás seguro de que quieres cerrar sesión?",
|
||||
"unlockSuccessTitle": "Tu bóveda se ha desbloqueado correctamente",
|
||||
"unlockSuccessDescription": "Ahora puede utilizar el autocompletado en los formularios de inicio de sesión en su navegador.",
|
||||
"closePopup": "Cerrar esta ventana emergente",
|
||||
"browseVault": "Navegar en el contenido de la bóveda",
|
||||
"connectingTo": "Conectando con",
|
||||
"switchAccounts": "¿Cambiar de cuenta?",
|
||||
"loggedIn": "Sesión iniciada",
|
||||
"loginWithMobile": "Iniciar sesión con la aplicación móvil",
|
||||
"unlockWithMobile": "Desbloquear con la aplicación móvil",
|
||||
"scanQrCode": "Escanea este código QR con tu aplicación móvil de AliasVault para iniciar sesión y desbloquear tu bóveda.",
|
||||
"errors": {
|
||||
"invalidCode": "Please enter a valid 6-digit authentication code.",
|
||||
"serverError": "Could not reach AliasVault server. Please try again later or contact support if the problem persists.",
|
||||
"wrongPassword": "Incorrect password. Please try again.",
|
||||
"accountLocked": "Account temporarily locked due to too many failed attempts.",
|
||||
"networkError": "Network error. Please check your connection and try again.",
|
||||
"sessionExpired": "Your session has expired. Please log in again.",
|
||||
"mobileLoginRequestExpired": "Mobile login request timed out. Please reload the page and try again."
|
||||
"invalidCode": "Por favor, introduzca un código de autenticación de 6 dígitos válido.",
|
||||
"serverError": "No se pudo llegar al servidor AliasVault. Por favor, inténtelo de nuevo más tarde o póngase en contacto con el soporte si el problema persiste.",
|
||||
"wrongPassword": "Contraseña incorrecta. Por favor, inténtelo de nuevo.",
|
||||
"accountLocked": "Cuenta bloqueada temporalmente debido a demasiados intentos fallidos.",
|
||||
"networkError": "Error de red. Por favor, compruebe su conexión y vuelva a intentarlo.",
|
||||
"sessionExpired": "Su sesión ha caducado. Por favor, inicie sesión de nuevo.",
|
||||
"mobileLoginRequestExpired": "Se ha agotado el tiempo de inicio de sesión del móvil. Por favor, vuelva a cargar la página e inténtelo de nuevo."
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"credentials": "Credentials",
|
||||
"emails": "Emails",
|
||||
"settings": "Settings"
|
||||
"credentials": "Credenciales",
|
||||
"emails": "Correos electrónicos",
|
||||
"settings": "Configuración"
|
||||
},
|
||||
"common": {
|
||||
"loading": "Loading...",
|
||||
"notice": "Notice",
|
||||
"loading": "Cargando...",
|
||||
"notice": "Aviso",
|
||||
"error": "Error",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"use": "Use",
|
||||
"delete": "Delete",
|
||||
"save": "Save",
|
||||
"or": "Or",
|
||||
"close": "Close",
|
||||
"copied": "Copied!",
|
||||
"openInNewWindow": "Open in new window",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"showPassword": "Show password",
|
||||
"hidePassword": "Hide password",
|
||||
"showDetails": "Show details",
|
||||
"hideDetails": "Hide details",
|
||||
"copyToClipboard": "Copy to clipboard",
|
||||
"loadingEmails": "Loading emails...",
|
||||
"loadingTotpCodes": "Loading TOTP codes...",
|
||||
"attachments": "Attachments",
|
||||
"loadingAttachments": "Loading attachments...",
|
||||
"settings": "Settings",
|
||||
"recentEmails": "Recent emails",
|
||||
"loginCredentials": "Login credentials",
|
||||
"twoFactorAuthentication": "Two-factor authentication",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Confirmar",
|
||||
"back": "Atrás",
|
||||
"next": "Siguiente",
|
||||
"use": "Usar",
|
||||
"delete": "Borrar",
|
||||
"save": "Guardar",
|
||||
"or": "O",
|
||||
"close": "Cerrar",
|
||||
"copied": "¡Copiado!",
|
||||
"openInNewWindow": "Abrir en una ventana nueva",
|
||||
"enabled": "Habilitado",
|
||||
"disabled": "Desactivado",
|
||||
"showPassword": "Mostrar contraseña",
|
||||
"hidePassword": "Ocultar contraseña",
|
||||
"showDetails": "Mostrar detalles",
|
||||
"hideDetails": "Ocultar detalles",
|
||||
"copyToClipboard": "Copiar al portapapeles",
|
||||
"loadingEmails": "Cargando email...",
|
||||
"loadingTotpCodes": "Cargando códigos TOTP...",
|
||||
"attachments": "Archivos adjuntos",
|
||||
"loadingAttachments": "Cargando archivos adjuntos...",
|
||||
"settings": "Configuración",
|
||||
"recentEmails": "Correos recientes",
|
||||
"loginCredentials": "Credenciales de inicio de sesión",
|
||||
"twoFactorAuthentication": "Autenticación de doble factor",
|
||||
"alias": "Alias",
|
||||
"notes": "Notes",
|
||||
"fullName": "Full Name",
|
||||
"firstName": "First Name",
|
||||
"lastName": "Last Name",
|
||||
"birthDate": "Birth Date",
|
||||
"nickname": "Nickname",
|
||||
"notes": "Notas",
|
||||
"fullName": "Nombre completo",
|
||||
"firstName": "Nombre",
|
||||
"lastName": "Apellido",
|
||||
"birthDate": "Fecha de nacimiento",
|
||||
"nickname": "Alias",
|
||||
"email": "Email",
|
||||
"username": "Username",
|
||||
"password": "Password",
|
||||
"syncingVault": "Syncing vault",
|
||||
"savingChangesToVault": "Saving changes to vault",
|
||||
"uploadingVaultToServer": "Uploading vault to server",
|
||||
"checkingVaultUpdates": "Checking for vault updates",
|
||||
"syncingUpdatedVault": "Syncing updated vault",
|
||||
"executingOperation": "Executing operation...",
|
||||
"loadMore": "Load more",
|
||||
"username": "Nombre de usuario",
|
||||
"password": "Contraseña",
|
||||
"syncingVault": "Sincronizando bóveda",
|
||||
"savingChangesToVault": "Guardando cambios en la bóveda",
|
||||
"uploadingVaultToServer": "Subiendo bóveda al servidor",
|
||||
"checkingVaultUpdates": "Comprobando actualizaciones de bóveda",
|
||||
"syncingUpdatedVault": "Sincronizando bóveda actualizada",
|
||||
"executingOperation": "Ejecutando operación...",
|
||||
"loadMore": "Cargar más",
|
||||
"errors": {
|
||||
"serverNotAvailable": "The AliasVault server is not available. Please try again later or contact support if the problem persists.",
|
||||
"clientVersionNotSupported": "This version of the AliasVault browser extension is not supported by the server anymore. Please update your browser extension to the latest version.",
|
||||
"browserExtensionOutdated": "This browser extension is outdated and cannot be used to access this vault. Please update this browser extension to continue.",
|
||||
"serverVersionNotSupported": "The AliasVault server needs to be updated to a newer version in order to use this browser extension. Please contact support if you need help.",
|
||||
"serverVersionTooOld": "The AliasVault server needs to be updated to a newer version in order to use this feature. Please contact the server admin if you need help.",
|
||||
"unknownError": "An unknown error occurred",
|
||||
"unknownErrorTryAgain": "An unknown error occurred. Please try again.",
|
||||
"vaultNotAvailable": "Vault not available",
|
||||
"vaultIsLocked": "Vault is locked",
|
||||
"passwordChanged": "Your password has changed since the last time you logged in. Please login again for security reasons."
|
||||
"serverNotAvailable": "El servidor AliasVault no está disponible. Por favor, inténtelo de nuevo más tarde o póngase en contacto con el soporte técnico si el problema persiste.",
|
||||
"clientVersionNotSupported": "Esta versión de la extensión del navegador AliasVault ya no es compatible con el servidor. Por favor, actualice la extensión de su navegador a la última versión.",
|
||||
"browserExtensionOutdated": "Esta extensión del navegador está desactualizada y no se puede utilizar para acceder a esta bóveda. Por favor, actualice esta extensión del navegador para continuar.",
|
||||
"serverVersionNotSupported": "El servidor AliasVault necesita ser actualizado a una versión más reciente para poder usar esta extensión del navegador. Póngase en contacto con el soporte si necesita ayuda.",
|
||||
"serverVersionTooOld": "El servidor AliasVault necesita ser actualizado a una versión más reciente para poder utilizar esta característica. Por favor, contacte con el administrador del servidor si necesita ayuda.",
|
||||
"unknownError": "Se produjo un error desconocido",
|
||||
"unknownErrorTryAgain": "Se ha producido un error desconocido. Por favor, inténtelo de nuevo.",
|
||||
"vaultNotAvailable": "Bóveda no disponible",
|
||||
"vaultIsLocked": "La bóveda está bloqueada",
|
||||
"passwordChanged": "Tu contraseña ha cambiado desde la última vez que iniciaste sesión. Por favor, inicia sesión de nuevo por razones de seguridad."
|
||||
},
|
||||
"apiErrors": {
|
||||
"UNKNOWN_ERROR": "An unknown error occurred. Please try again.",
|
||||
"ACCOUNT_LOCKED": "Account temporarily locked due to too many failed attempts. Please try again later.",
|
||||
"ACCOUNT_BLOCKED": "Your account has been disabled. If you believe this is a mistake, please contact support.",
|
||||
"USER_NOT_FOUND": "Invalid username or password. Please try again.",
|
||||
"INVALID_AUTHENTICATOR_CODE": "Invalid authenticator code. Please try again.",
|
||||
"INVALID_RECOVERY_CODE": "Invalid recovery code. Please try again.",
|
||||
"REFRESH_TOKEN_REQUIRED": "Refresh token is required.",
|
||||
"INVALID_REFRESH_TOKEN": "Invalid refresh token.",
|
||||
"PUBLIC_REGISTRATION_DISABLED": "New account registration is currently disabled on this server. Please contact the administrator.",
|
||||
"USERNAME_REQUIRED": "Username is required.",
|
||||
"USERNAME_ALREADY_IN_USE": "Username is already in use.",
|
||||
"USERNAME_AVAILABLE": "Username is available.",
|
||||
"USERNAME_MISMATCH": "Username does not match the current user.",
|
||||
"PASSWORD_MISMATCH": "The provided password does not match your current password.",
|
||||
"ACCOUNT_SUCCESSFULLY_DELETED": "Account successfully deleted.",
|
||||
"USERNAME_EMPTY_OR_WHITESPACE": "Username cannot be empty or whitespace.",
|
||||
"USERNAME_TOO_SHORT": "Username too short: must be at least 3 characters long.",
|
||||
"USERNAME_TOO_LONG": "Username too long: cannot be longer than 40 characters.",
|
||||
"USERNAME_INVALID_EMAIL": "Invalid email address.",
|
||||
"USERNAME_INVALID_CHARACTERS": "Username is invalid, can only contain letters or digits.",
|
||||
"VAULT_NOT_UP_TO_DATE": "Your vault is not up-to-date. Please synchronize your vault and try again.",
|
||||
"INTERNAL_SERVER_ERROR": "Internal server error.",
|
||||
"VAULT_ERROR": "The local vault is not up-to-date. Please synchronize your vault by refreshing the page and try again."
|
||||
"UNKNOWN_ERROR": "Se ha producido un error desconocido. Por favor, inténtelo de nuevo.",
|
||||
"ACCOUNT_LOCKED": "Cuenta bloqueada temporalmente debido a demasiados intentos fallidos. Por favor, inténtelo de nuevo.",
|
||||
"ACCOUNT_BLOCKED": "Tu cuenta ha sido desactivada. Si crees que esto es un error, ponte en contacto con soporte.",
|
||||
"USER_NOT_FOUND": "Nombre de usuario o contraseña no válidos. Por favor, inténtelo de nuevo.",
|
||||
"INVALID_AUTHENTICATOR_CODE": "Código de autenticación inválido. Por favor, inténtelo de nuevo.",
|
||||
"INVALID_RECOVERY_CODE": "Código de recuperación inválido. Por favor, inténtelo de nuevo.",
|
||||
"REFRESH_TOKEN_REQUIRED": "Se requiere un token de actualización.",
|
||||
"INVALID_REFRESH_TOKEN": "Token de actualización inválido.",
|
||||
"PUBLIC_REGISTRATION_DISABLED": "El registro de nueva cuenta está actualmente deshabilitado en este servidor. Por favor, contacte con el administrador.",
|
||||
"USERNAME_REQUIRED": "Se requiere un nombre de usuario.",
|
||||
"USERNAME_ALREADY_IN_USE": "El nombre de usuario ya está en uso.",
|
||||
"USERNAME_AVAILABLE": "El nombre de usuario está disponible.",
|
||||
"USERNAME_MISMATCH": "El nombre de usuario no coincide con el usuario actual.",
|
||||
"PASSWORD_MISMATCH": "La contraseña proporcionada no coincide con su contraseña actual.",
|
||||
"ACCOUNT_SUCCESSFULLY_DELETED": "Cuenta eliminada con éxito.",
|
||||
"USERNAME_EMPTY_OR_WHITESPACE": "El nombre de usuario no puede estar vacío o en blanco.",
|
||||
"USERNAME_TOO_SHORT": "Nombre de usuario demasiado corto: debe tener al menos 3 caracteres.",
|
||||
"USERNAME_TOO_LONG": "Nombre de usuario demasiado largo: no puede tener más de 40 caracteres.",
|
||||
"USERNAME_INVALID_EMAIL": "Dirección de correo electrónico inválida.",
|
||||
"USERNAME_INVALID_CHARACTERS": "El nombre de usuario inválido, solo puede contener letras o dígitos.",
|
||||
"VAULT_NOT_UP_TO_DATE": "Su bóveda no está actualizada. Por favor, sincronice su bóveda e inténtelo de nuevo.",
|
||||
"INTERNAL_SERVER_ERROR": "Error interno del servidor.",
|
||||
"VAULT_ERROR": "La bóveda local no está actualizada. Por favor, sincronice su bóveda actualizando la página e inténtelo de nuevo."
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"or": "or",
|
||||
"new": "New",
|
||||
"cancel": "Cancel",
|
||||
"vaultLocked": "AliasVault is locked.",
|
||||
"creatingNewAlias": "Creating new alias...",
|
||||
"noMatchesFound": "No matches found",
|
||||
"searchVault": "Search vault...",
|
||||
"serviceName": "Service name",
|
||||
"email": "Email",
|
||||
"username": "Username",
|
||||
"password": "Password",
|
||||
"enterServiceName": "Enter service name",
|
||||
"enterEmailAddress": "Enter email address",
|
||||
"enterUsername": "Enter username",
|
||||
"hideFor1Hour": "Hide for 1 hour (current site)",
|
||||
"hidePermanently": "Hide permanently (current site)",
|
||||
"createRandomAlias": "Create random alias",
|
||||
"createUsernamePassword": "Create username/password",
|
||||
"randomAlias": "Random alias",
|
||||
"usernamePassword": "Username/password",
|
||||
"createAndSaveAlias": "Create and save alias",
|
||||
"createAndSaveCredential": "Create and save credential",
|
||||
"randomIdentityDescription": "Generate a random identity with a random email address accessible in AliasVault.",
|
||||
"randomIdentityDescriptionDropdown": "Random identity with random email",
|
||||
"manualCredentialDescription": "Specify your own email address and username.",
|
||||
"manualCredentialDescriptionDropdown": "Manual username and password",
|
||||
"failedToCreateIdentity": "Failed to create identity. Please try again.",
|
||||
"enterEmailAndOrUsername": "Enter email and/or username",
|
||||
"autofillWithAliasVault": "Autofill with AliasVault",
|
||||
"generateRandomPassword": "Generate random password (copy to clipboard)",
|
||||
"generateNewPassword": "Generate new password",
|
||||
"togglePasswordVisibility": "Toggle password visibility",
|
||||
"passwordCopiedToClipboard": "Password copied to clipboard",
|
||||
"openAliasVaultToUpgrade": "Open AliasVault to upgrade",
|
||||
"vaultUpgradeRequired": "Vault upgrade required.",
|
||||
"dismissPopup": "Dismiss popup"
|
||||
"or": "o",
|
||||
"new": "Nuevo",
|
||||
"cancel": "Cancelar",
|
||||
"vaultLocked": "AliasVault está bloqueado.",
|
||||
"creatingNewAlias": "Creando nuevo alias...",
|
||||
"noMatchesFound": "No se han encontrado resultados",
|
||||
"searchVault": "Buscar bóveda...",
|
||||
"serviceName": "Nombre del servicio",
|
||||
"email": "Correo electrónico",
|
||||
"username": "Nombre de usuario",
|
||||
"password": "Contraseña",
|
||||
"enterServiceName": "Introduzca el nombre del servicio",
|
||||
"enterEmailAddress": "Introduzca la dirección de correo electrónico",
|
||||
"enterUsername": "Introduzca nombre de usuario",
|
||||
"hideFor1Hour": "Ocultar durante 1 hora (sitio actual)",
|
||||
"hidePermanently": "Ocultar permanentemente (sitio actual)",
|
||||
"createRandomAlias": "Crear alias aleatorio",
|
||||
"createUsernamePassword": "Crear nombre de usuario / contraseña",
|
||||
"randomAlias": "Alias aleatorio",
|
||||
"usernamePassword": "Nombre de usuario/Contraseña",
|
||||
"createAndSaveAlias": "Crear y guardar alias",
|
||||
"createAndSaveCredential": "Crear y guardar credencial",
|
||||
"randomIdentityDescription": "Generar una identidad aleatoria con una dirección de correo electrónico aleatoria accesible en AliasVault.",
|
||||
"randomIdentityDescriptionDropdown": "Identidad aleatoria con correo electrónico aleatorio",
|
||||
"manualCredentialDescription": "Especifique su propia dirección de correo electrónico y nombre de usuario.",
|
||||
"manualCredentialDescriptionDropdown": "Nombre de usuario y contraseña manual",
|
||||
"failedToCreateIdentity": "Error al crear la identidad. Por favor, inténtalo de nuevo.",
|
||||
"enterEmailAndOrUsername": "Introduzca email y/o nombre de usuario",
|
||||
"autofillWithAliasVault": "AutoFill con AliasVault",
|
||||
"generateRandomPassword": "Generar contraseña aleatoria (copiar al portapapeles)",
|
||||
"generateNewPassword": "Generar nueva contraseña",
|
||||
"togglePasswordVisibility": "Cambiar la visibilidad de la contraseña",
|
||||
"passwordCopiedToClipboard": "Contraseña copiada al portapapeles",
|
||||
"openAliasVaultToUpgrade": "Abrir AliasVault para actualizar",
|
||||
"vaultUpgradeRequired": "Actualización de bóveda requerida.",
|
||||
"dismissPopup": "Descartar aviso"
|
||||
},
|
||||
"credentials": {
|
||||
"title": "Credentials",
|
||||
"addCredential": "Add Credential",
|
||||
"editCredential": "Edit Credential",
|
||||
"deleteCredential": "Delete Credential",
|
||||
"credentialDetails": "Credential Details",
|
||||
"serviceName": "Service Name",
|
||||
"notes": "Notes",
|
||||
"totp": "Two-Factor Authentication",
|
||||
"totpCode": "TOTP Code",
|
||||
"copyTotp": "Copy TOTP",
|
||||
"totpSecret": "TOTP Secret",
|
||||
"totpSecretPlaceholder": "Enter TOTP secret key",
|
||||
"welcomeTitle": "Welcome to AliasVault!",
|
||||
"welcomeDescription": "To use the AliasVault browser extension: navigate to a website and use the AliasVault autofill popup to create a new credential.",
|
||||
"noPasskeysFound": "No passkeys have been created yet. Passkeys are created by visiting a website that offers passkeys as an authentication method.",
|
||||
"noAttachmentsFound": "No credentials with attachments found",
|
||||
"noMatchingCredentials": "No matching credentials found",
|
||||
"createdAt": "Created",
|
||||
"updatedAt": "Last updated",
|
||||
"saveCredential": "Save credential",
|
||||
"deleteCredentialTitle": "Delete Credential",
|
||||
"deleteCredentialConfirm": "Are you sure you want to delete this credential? This action cannot be undone.",
|
||||
"title": "Credenciales",
|
||||
"addCredential": "Añadir credencial",
|
||||
"editCredential": "Editar credencial",
|
||||
"deleteCredential": "Borrar credencial",
|
||||
"credentialDetails": "Detalles de la credencial",
|
||||
"serviceName": "Nombre del servicio",
|
||||
"notes": "Notas",
|
||||
"totp": "Autenticación de Doble Factor",
|
||||
"totpCode": "Código TOTP",
|
||||
"copyTotp": "Copiar TOTP",
|
||||
"totpSecret": "Secreto TOTP",
|
||||
"totpSecretPlaceholder": "Introduzca la clave secreta TOTP",
|
||||
"welcomeTitle": "¡Bienvenido a AliasVault!",
|
||||
"welcomeDescription": "Para utilizar la extensión del navegador AliasVault: vaya a un sitio web y utilice la ventana de autocompletado de AliasVault para crear una nueva credencial.",
|
||||
"noPasskeysFound": "No se han creado llaves de acceso todavía. Las llaves se crean visitando un sitio web que ofrece llaves de acceso como método de autenticación.",
|
||||
"noAttachmentsFound": "No se encontraron credenciales con archivos adjuntos",
|
||||
"noMatchingCredentials": "No se han encontrado credenciales coincidentes",
|
||||
"createdAt": "Creado",
|
||||
"updatedAt": "Última actualización",
|
||||
"saveCredential": "Guardar credencial",
|
||||
"deleteCredentialTitle": "Borrar credencial",
|
||||
"deleteCredentialConfirm": "¿Está seguro de que desea eliminar estas credenciales? Esta acción no se puede deshacer.",
|
||||
"filters": {
|
||||
"all": "(All) Credentials",
|
||||
"passkeys": "Passkeys",
|
||||
"aliases": "Aliases",
|
||||
"userpass": "Passwords",
|
||||
"attachments": "Attachments"
|
||||
"all": "(Todas) Credenciales",
|
||||
"passkeys": "Llaves de acceso",
|
||||
"aliases": "Alias",
|
||||
"userpass": "Contraseñas",
|
||||
"attachments": "Archivos adjuntos"
|
||||
},
|
||||
"randomAlias": "Random Alias",
|
||||
"randomAlias": "Alias aleatorio",
|
||||
"manual": "Manual",
|
||||
"service": "Service",
|
||||
"serviceUrl": "Service URL",
|
||||
"loginCredentials": "Login Credentials",
|
||||
"generateRandomUsername": "Generate random username",
|
||||
"generateRandomPassword": "Generate random password",
|
||||
"changePasswordComplexity": "Change password complexity",
|
||||
"passwordLength": "Password length",
|
||||
"includeLowercase": "Include lowercase letters",
|
||||
"includeUppercase": "Include uppercase letters",
|
||||
"includeNumbers": "Include numbers",
|
||||
"includeSpecialChars": "Include special characters",
|
||||
"avoidAmbiguousChars": "Avoid ambiguous characters (o, 0, etc.)",
|
||||
"generateNewPreview": "Generate new preview",
|
||||
"generateRandomAlias": "Generate Random Alias",
|
||||
"clearAliasFields": "Clear Alias Fields",
|
||||
"service": "Servicio",
|
||||
"serviceUrl": "URL del servicio",
|
||||
"loginCredentials": "Credenciales de inicio de sesión",
|
||||
"generateRandomUsername": "Generar nombre de usuario aleatorio",
|
||||
"generateRandomPassword": "Generar contraseña aleatoria",
|
||||
"changePasswordComplexity": "Cambiar complejidad de contraseña",
|
||||
"passwordLength": "Longitud de la contraseña",
|
||||
"includeLowercase": "Incluye letras minúsculas",
|
||||
"includeUppercase": "Incluye letras mayúsculas",
|
||||
"includeNumbers": "Incluye números",
|
||||
"includeSpecialChars": "Incluye caracteres especiales",
|
||||
"avoidAmbiguousChars": "Evita caracteres ambiguos (o, 0, etc.)",
|
||||
"generateNewPreview": "Crear nueva vista previa",
|
||||
"generateRandomAlias": "Crear alias aleatorio",
|
||||
"clearAliasFields": "Limpiar campos de alias",
|
||||
"alias": "Alias",
|
||||
"firstName": "First Name",
|
||||
"lastName": "Last Name",
|
||||
"nickName": "Nick Name",
|
||||
"gender": "Gender",
|
||||
"birthDate": "Birth Date",
|
||||
"birthDatePlaceholder": "YYYY-MM-DD",
|
||||
"metadata": "Metadata",
|
||||
"firstName": "Nombre",
|
||||
"lastName": "Apellido",
|
||||
"nickName": "Apodo",
|
||||
"gender": "Género",
|
||||
"birthDate": "Fecha de nacimiento",
|
||||
"birthDatePlaceholder": "AAAA-MM-DD",
|
||||
"metadata": "Metadatos",
|
||||
"validation": {
|
||||
"required": "This field is required",
|
||||
"serviceNameRequired": "Service name is required",
|
||||
"invalidEmail": "Invalid email format",
|
||||
"invalidDateFormat": "Date must be in YYYY-MM-DD format"
|
||||
"required": "Se requiere este campo",
|
||||
"serviceNameRequired": "Se requiere Nombre del servicio",
|
||||
"invalidEmail": "Formato de correo electrónico inválido",
|
||||
"invalidDateFormat": "La fecha debe estar en formato AAAA-MM-DD"
|
||||
},
|
||||
"privateEmailTitle": "Private Email",
|
||||
"privateEmailAliasVaultServer": "AliasVault server",
|
||||
"privateEmailDescription": "E2E encrypted, fully private.",
|
||||
"publicEmailTitle": "Public Temp Email Providers",
|
||||
"publicEmailDescription": "Anonymous but limited privacy. Email content is readable by anyone that knows the address.",
|
||||
"useDomainChooser": "Use domain chooser",
|
||||
"enterCustomDomain": "Enter custom domain",
|
||||
"enterFullEmail": "Enter full email address",
|
||||
"enterEmailPrefix": "Enter email prefix"
|
||||
"privateEmailTitle": "Correo electrónico privado",
|
||||
"privateEmailAliasVaultServer": "Servidor AliasVault",
|
||||
"privateEmailDescription": "E2E cifrado, totalmente privado.",
|
||||
"publicEmailTitle": "Proveedores de Correo Temporal Públicos",
|
||||
"publicEmailDescription": "Privacidad anónima pero limitada. Contenido de correo electrónico puede ser leído por cualquiera que conozca la dirección.",
|
||||
"useDomainChooser": "Usar selector de dominio",
|
||||
"enterCustomDomain": "Introduzca dominio personalizado",
|
||||
"enterFullEmail": "Introduzca la dirección de correo completa",
|
||||
"enterEmailPrefix": "Introduzca prefijo de correo"
|
||||
},
|
||||
"totp": {
|
||||
"addCode": "Add 2FA Code",
|
||||
"instructions": "Enter the secret key shown by the website where you want to add two-factor authentication.",
|
||||
"nameOptional": "Name (optional)",
|
||||
"secretKey": "Secret Key",
|
||||
"saveToViewCode": "Save to view code",
|
||||
"addCode": "Añadir código 2FA",
|
||||
"instructions": "Introduzca la clave secreta mostrada por el sitio web donde desea añadir autenticación de dos factores.",
|
||||
"nameOptional": "Nombre (Opcional)",
|
||||
"secretKey": "Clave secreta",
|
||||
"saveToViewCode": "Guardar para ver el código",
|
||||
"errors": {
|
||||
"invalidSecretKey": "Invalid secret key format."
|
||||
"invalidSecretKey": "Formato de clave secreta inválida."
|
||||
}
|
||||
},
|
||||
"emails": {
|
||||
"title": "Emails",
|
||||
"deleteEmailTitle": "Delete Email",
|
||||
"deleteEmailConfirm": "Are you sure you want to permanently delete this email?",
|
||||
"from": "From",
|
||||
"to": "To",
|
||||
"date": "Date",
|
||||
"emailContent": "Email content",
|
||||
"attachments": "Attachments",
|
||||
"emailNotFound": "Email not found",
|
||||
"noEmails": "No emails found",
|
||||
"noEmailsDescription": "You have not received any emails at your private email addresses yet. When you receive a new email, it will appear here.",
|
||||
"title": "Correos electrónicos",
|
||||
"deleteEmailTitle": "Eliminar correo",
|
||||
"deleteEmailConfirm": "¿Está seguro que desea eliminar permanentemente este correo electrónico?",
|
||||
"from": "De",
|
||||
"to": "Para",
|
||||
"date": "Fecha",
|
||||
"emailContent": "Contenido del correo electrónico",
|
||||
"attachments": "Archivos adjuntos",
|
||||
"emailNotFound": "Correo electrónico no encontrado",
|
||||
"noEmails": "No se han encontrado correos electrónicos",
|
||||
"noEmailsDescription": "No has recibido ningún correo electrónico en tus direcciones privadas todavía. Cuando recibas un nuevo correo electrónico, aparecerá aquí.",
|
||||
"dateFormat": {
|
||||
"justNow": "just now",
|
||||
"minutesAgo_single": "{{count}} min ago",
|
||||
"minutesAgo_plural": "{{count}} mins ago",
|
||||
"hoursAgo_single": "{{count}} hr ago",
|
||||
"hoursAgo_plural": "{{count}} hrs ago",
|
||||
"yesterday": "yesterday"
|
||||
"justNow": "ahora mismo",
|
||||
"minutesAgo_single": "Hace {{count}} min",
|
||||
"minutesAgo_plural": "Hace {{count}} min",
|
||||
"hoursAgo_single": "Hace {{count}} h",
|
||||
"hoursAgo_plural": "Hace {{count}} h",
|
||||
"yesterday": "ayer"
|
||||
},
|
||||
"errors": {
|
||||
"emailLoadError": "An error occurred while loading emails. Please try again later.",
|
||||
"emailUnexpectedError": "An unexpected error occurred while loading emails. Please try again later."
|
||||
"emailLoadError": "Se ha producido un error al cargar los correos electrónicos. Por favor, inténtalo de nuevo más tarde.",
|
||||
"emailUnexpectedError": "Se ha producido un error inesperado al cargar los correos electrónicos. Por favor, inténtalo de nuevo más tarde."
|
||||
},
|
||||
"apiErrors": {
|
||||
"CLAIM_DOES_NOT_MATCH_USER": "The current chosen email address is already in use. Please change the email address by editing this credential.",
|
||||
"CLAIM_DOES_NOT_EXIST": "An error occurred while trying to load the emails. Please try to edit and save the credential entry to synchronize the database, then try again."
|
||||
"CLAIM_DOES_NOT_MATCH_USER": "La dirección de correo electrónico elegida actualmente ya está en uso. Por favor, cambie la dirección de correo electrónico editando esta credencial.",
|
||||
"CLAIM_DOES_NOT_EXIST": "Ocurrió un error mientras se trataba de cargar los correos electrónicos. Por favor, intente editar y guardar la entrada de credenciales para sincronizar la base de datos, y vuelva a intentarlo."
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settings",
|
||||
"serverUrl": "Server URL",
|
||||
"language": "Language",
|
||||
"autofillEnabled": "Enable Autofill",
|
||||
"version": "Version",
|
||||
"openInNewWindow": "Open in new window",
|
||||
"openWebApp": "Open web app",
|
||||
"loggedIn": "Logged in",
|
||||
"logout": "Logout",
|
||||
"lock": "Lock",
|
||||
"globalSettings": "Global Settings",
|
||||
"autofillPopup": "Autofill popup",
|
||||
"activeOnAllSites": "Active on all sites (unless disabled below)",
|
||||
"disabledOnAllSites": "Disabled on all sites",
|
||||
"rightClickContextMenu": "Right-click context menu",
|
||||
"autofillMatching": "Autofill Matching",
|
||||
"autofillMatchingMode": "Autofill matching mode",
|
||||
"autofillMatchingModeDescription": "Determines which credentials are considered a match and shown as suggestions in the autofill popup for a given website.",
|
||||
"autofillMatchingDefault": "URL + subdomain + name wildcard",
|
||||
"autofillMatchingUrlSubdomain": "URL + subdomain",
|
||||
"autofillMatchingUrlExact": "Exact URL domain only",
|
||||
"siteSpecificSettings": "Site-Specific Settings",
|
||||
"autofillPopupOn": "Autofill popup on: ",
|
||||
"enabledForThisSite": "Enabled for this site",
|
||||
"disabledForThisSite": "Disabled for this site",
|
||||
"temporarilyDisabledUntil": "Temporarily disabled until ",
|
||||
"resetAllSiteSettings": "Reset all site-specific settings",
|
||||
"appearance": "Appearance",
|
||||
"theme": "Theme",
|
||||
"useDefault": "Use default",
|
||||
"light": "Light",
|
||||
"dark": "Dark",
|
||||
"keyboardShortcuts": "Keyboard Shortcuts",
|
||||
"configureKeyboardShortcuts": "Configure keyboard shortcuts",
|
||||
"configure": "Configure",
|
||||
"clipboardClearTimeout": "Clear clipboard after copying",
|
||||
"clipboardClearTimeoutDescription": "Automatically clear the clipboard after copying sensitive data",
|
||||
"clipboardClearDisabled": "Never clear",
|
||||
"clipboardClear5Seconds": "Clear after 5 seconds",
|
||||
"clipboardClear10Seconds": "Clear after 10 seconds",
|
||||
"clipboardClear15Seconds": "Clear after 15 seconds",
|
||||
"autoLockTimeout": "Auto-lock Timeout",
|
||||
"autoLockTimeoutDescription": "Automatically lock the vault after a period of inactivity",
|
||||
"autoLockTimeoutHelp": "The vault will only lock after the specified period of inactivity (no autofill usage or extension popup opened). The vault will always lock when the browser is closed, regardless of this setting.",
|
||||
"autoLockNever": "Never",
|
||||
"autoLock15Seconds": "15 seconds",
|
||||
"autoLock1Minute": "1 minute",
|
||||
"autoLock5Minutes": "5 minutes",
|
||||
"autoLock15Minutes": "15 minutes",
|
||||
"autoLock30Minutes": "30 minutes",
|
||||
"autoLock1Hour": "1 hour",
|
||||
"autoLock4Hours": "4 hours",
|
||||
"autoLock8Hours": "8 hours",
|
||||
"autoLock24Hours": "24 hours",
|
||||
"versionPrefix": "Version ",
|
||||
"autofillSettings": "Autofill Settings",
|
||||
"clipboardSettings": "Clipboard Settings",
|
||||
"contextMenuSettings": "Context Menu Settings",
|
||||
"passkeySettings": "Passkey Settings",
|
||||
"contextMenu": "Context Menu",
|
||||
"contextMenuEnabled": "Context menu is enabled",
|
||||
"contextMenuDisabled": "Context menu is disabled",
|
||||
"contextMenuDescription": "Right-click on input fields to access AliasVault options",
|
||||
"selectLanguage": "Select Language",
|
||||
"serverConfiguration": "Server Configuration",
|
||||
"serverConfigurationDescription": "Configure the AliasVault server URL for self-hosted instances",
|
||||
"title": "Ajustes",
|
||||
"serverUrl": "URL del servidor",
|
||||
"language": "Idioma",
|
||||
"autofillEnabled": "Activar autocompletado",
|
||||
"version": "Versión",
|
||||
"openInNewWindow": "Abrir en una ventana nueva",
|
||||
"openWebApp": "Abrir la aplicación web",
|
||||
"loggedIn": "Sesión iniciada",
|
||||
"logout": "Cerrar sesión",
|
||||
"lock": "Bloquear",
|
||||
"globalSettings": "Ajustes globales",
|
||||
"autofillPopup": "Ventana de autorrellenado",
|
||||
"activeOnAllSites": "Activo en todos los sitios (a menos que se deshabilite debajo)",
|
||||
"disabledOnAllSites": "Deshabilitado en todos los sitios",
|
||||
"rightClickContextMenu": "Menú contextual del clic derecho",
|
||||
"autofillMatching": "Coincidencia de autocompletado",
|
||||
"autofillMatchingMode": "Modo de coincidencia de autocompletado",
|
||||
"autofillMatchingModeDescription": "Determina qué credenciales se consideran coincidentes y se muestran como sugerencias en el popup de autorrelleno de un sitio web determinado.",
|
||||
"autofillMatchingDefault": "URL + subdominio + nombre wildcard",
|
||||
"autofillMatchingUrlSubdomain": "URL + subdominio",
|
||||
"autofillMatchingUrlExact": "Solo URL exacta",
|
||||
"siteSpecificSettings": "Ajustes específicos del sitio",
|
||||
"autofillPopupOn": "Ventana de autorrelleno ",
|
||||
"enabledForThisSite": "Habilitado para este sitio",
|
||||
"disabledForThisSite": "Deshabilitado para este sitio",
|
||||
"temporarilyDisabledUntil": "Deshabilitado temporalmente hasta ",
|
||||
"resetAllSiteSettings": "Reiniciar todos los ajustes específicos del sitio",
|
||||
"appearance": "Apariencia",
|
||||
"theme": "Tema",
|
||||
"useDefault": "Uso por defecto",
|
||||
"light": "Claro",
|
||||
"dark": "Oscuro",
|
||||
"keyboardShortcuts": "Atajos de teclado",
|
||||
"configureKeyboardShortcuts": "Configurar atajos de teclado",
|
||||
"configure": "Configurar",
|
||||
"clipboardClearTimeout": "Limpiar portapapeles después de copiar",
|
||||
"clipboardClearTimeoutDescription": "Limpiar automáticamente el portapapeles después de copiar datos sensibles",
|
||||
"clipboardClearDisabled": "Nunca limpiar",
|
||||
"clipboardClear5Seconds": "Limpiar después 5 segundos",
|
||||
"clipboardClear10Seconds": "Limpiar después 10 segundos",
|
||||
"clipboardClear15Seconds": "Limpiar después 15 segundos",
|
||||
"autoLockTimeout": "Tiempo de bloqueo automático",
|
||||
"autoLockTimeoutDescription": "Bloquear automáticamente la bóveda después de un período de inactividad",
|
||||
"autoLockTimeoutHelp": "La bóveda sólo se bloqueará después del período especificado de inactividad (no se abrirá el uso de autocompletado o la ventana emergente). La bóveda siempre se bloqueará cuando el navegador esté cerrado, independientemente de esta configuración.",
|
||||
"autoLockNever": "Nunca",
|
||||
"autoLock15Seconds": "15 segundos",
|
||||
"autoLock1Minute": "1 minuto",
|
||||
"autoLock5Minutes": "5 minutos",
|
||||
"autoLock15Minutes": "15 minutos",
|
||||
"autoLock30Minutes": "30 minutos",
|
||||
"autoLock1Hour": "1 hora",
|
||||
"autoLock4Hours": "4 horas",
|
||||
"autoLock8Hours": "8 horas",
|
||||
"autoLock24Hours": "24 horas",
|
||||
"versionPrefix": "Versión ",
|
||||
"autofillSettings": "Ajustes de autocompletado",
|
||||
"clipboardSettings": "Ajustes del portapapeles",
|
||||
"contextMenuSettings": "Ajustes del menú contextual",
|
||||
"passkeySettings": "Ajustes de llaves de acceso",
|
||||
"contextMenu": "Menú Contextual",
|
||||
"contextMenuEnabled": "El menú contextual está activado",
|
||||
"contextMenuDisabled": "El menú contextual está desactivado",
|
||||
"contextMenuDescription": "Haga clic derecho en los campos de entrada para acceder a las opciones de AliasVault",
|
||||
"selectLanguage": "Seleccionar idioma",
|
||||
"serverConfiguration": "Configuración del servidor",
|
||||
"serverConfigurationDescription": "Configurar la URL del servidor AliasVault para instancias self-hosted",
|
||||
"customApiUrl": "API URL",
|
||||
"customClientUrl": "Client URL",
|
||||
"apiUrlHint": "The API endpoint URL (usually client URL + /api)",
|
||||
"clientUrlHint": "The web interface URL of your self-hosted instance",
|
||||
"autofillSettingsDescription": "Enable or disable the autofill popup on web pages",
|
||||
"autofillEnabledDescription": "Autofill suggestions will appear on login forms",
|
||||
"autofillDisabledDescription": "Autofill suggestions are disabled globally",
|
||||
"languageSettings": "Language",
|
||||
"customClientUrl": "URL de Cliente",
|
||||
"apiUrlHint": "La URL del endpoint de la API (generalmente URL del cliente + /api)",
|
||||
"clientUrlHint": "La URL de la interfaz web de su instancia self-hosted",
|
||||
"autofillSettingsDescription": "Activar o desactivar la ventana emergente de autorrelleno en páginas web",
|
||||
"autofillEnabledDescription": "Las sugerencias de autorrelleno aparecerán en los formularios de inicio de sesión",
|
||||
"autofillDisabledDescription": "Las sugerencias de autorrelleno están desactivadas globalmente",
|
||||
"languageSettings": "Idioma",
|
||||
"validation": {
|
||||
"apiUrlRequired": "API URL is required",
|
||||
"apiUrlInvalid": "Please enter a valid API URL",
|
||||
"clientUrlRequired": "Client URL is required",
|
||||
"clientUrlInvalid": "Please enter a valid client URL"
|
||||
"apiUrlRequired": "La URL de la API es necesaria",
|
||||
"apiUrlInvalid": "Por favor, introduzca una URL de API válida",
|
||||
"clientUrlRequired": "La URL de cliente es necesaria",
|
||||
"clientUrlInvalid": "Por favor, introduzca una URL de cliente válida"
|
||||
},
|
||||
"unlockMethod": {
|
||||
"title": "Vault Unlock Method",
|
||||
"introText": "Choose how you want to unlock your vault. You can use your master password (always available) or set up a PIN code for faster access. After 3 failed PIN attempts, you'll need to use your master password.",
|
||||
"password": "Master Password",
|
||||
"pin": "PIN Code",
|
||||
"pinDescription": "Unlock vault with PIN code",
|
||||
"setupPin": "Setup PIN Code",
|
||||
"enterNewPinDescription": "Enter a PIN code consisting of minimum 6 digits",
|
||||
"confirmPin": "Confirm PIN",
|
||||
"confirmPinDescription": "Enter your PIN again to confirm",
|
||||
"invalidPinFormat": "Invalid PIN format",
|
||||
"pinMismatch": "PINs do not match",
|
||||
"incorrectPin": "Incorrect PIN. {{attemptsRemaining}} attempts remaining.",
|
||||
"incorrectPinSingular": "Incorrect PIN. 1 attempt remaining.",
|
||||
"enableSuccess": "PIN unlock enabled successfully!",
|
||||
"pinLocked": "PIN unlock has been disabled. Please use your master password to unlock your vault.",
|
||||
"pinSecurityWarning": "PIN unlock in the browser extension can be less secure than your master password, as PINs typically have lower entropy and may be brute-forced if your device is compromised. Use it only on devices you fully trust."
|
||||
"title": "Método de desbloqueo de la bóveda",
|
||||
"introText": "Elija cómo desea desbloquear su bóveda. Puede utilizar su contraseña maestra (siempre disponible) o configurar un código PIN para un acceso más rápido. Después de 3 intentos fallidos de PIN, necesitarás usar tu contraseña maestra.",
|
||||
"password": "Contraseña Maestra",
|
||||
"pin": "Código PIN",
|
||||
"pinDescription": "Desbloquear bóveda con código PIN",
|
||||
"setupPin": "Configurar código PIN",
|
||||
"enterNewPinDescription": "Introduzca un código PIN que contenga un mínimo de 6 dígitos",
|
||||
"confirmPin": "Confirmar PIN",
|
||||
"confirmPinDescription": "Introduzca su PIN de nuevo para confirmar",
|
||||
"invalidPinFormat": "Formato PIN inválido",
|
||||
"pinMismatch": "Los PINs no coinciden",
|
||||
"incorrectPin": "PIN incorrecto, {{attemptsRemaining}} intentos restantes.",
|
||||
"incorrectPinSingular": "PIN incorrecto. 1 intento restante.",
|
||||
"enableSuccess": "¡PIN activado con éxito!",
|
||||
"pinLocked": "El desbloqueo con PIN ha sido deshabilitado. Por favor, utiliza tu contraseña maestra para desbloquear tu bóveda.",
|
||||
"pinSecurityWarning": "El PIN de desbloqueo en la extensión del navegador puede ser menos seguro que su contraseña maestra, ya que los PIN típicamente tienen menos entropía y se pueden obtener por fuerza bruta si su dispositivo está en peligro. Úselo sólo en dispositivos en los que confíe plenamente."
|
||||
}
|
||||
},
|
||||
"passkeys": {
|
||||
"passkey": "Passkey",
|
||||
"site": "Site",
|
||||
"displayName": "Name",
|
||||
"helpText": "Passkeys are created on the website when prompted. They cannot be manually edited. To remove this passkey, you can delete it from this credential. To replace this passkey or create a new one, visit the website and follow its prompts.",
|
||||
"passkeyMarkedForDeletion": "Passkey marked for deletion",
|
||||
"passkeyWillBeDeleted": "This passkey will be deleted when you save this credential.",
|
||||
"passkey": "Llave de acceso",
|
||||
"site": "Sitio",
|
||||
"displayName": "Nombre",
|
||||
"helpText": "Las llaves de acceso se crean en el sitio web cuando se le solicite. No pueden ser editadas manualmente. Para eliminar esta clave, puede eliminarla de esta credencial. Para reemplazar esta clave de acceso o crear una nueva, visite el sitio web y siga sus indicaciones.",
|
||||
"passkeyMarkedForDeletion": "Llave de acceso marcada para eliminar",
|
||||
"passkeyWillBeDeleted": "Esta llave de acceso se eliminará cuando guarde esta credencial.",
|
||||
"bypass": {
|
||||
"title": "Use Browser Passkey",
|
||||
"description": "How long would you like to use the browser's passkey provider for {{origin}}?",
|
||||
"thisTimeOnly": "This time only",
|
||||
"alwaysForSite": "Always for this site"
|
||||
"title": "Usar llave de acceso del navegador",
|
||||
"description": "¿Cuánto tiempo quieres usar el proveedor de llaves de acceso del navegador para {{origin}}?",
|
||||
"thisTimeOnly": "Solo esta vez",
|
||||
"alwaysForSite": "Siempre para este sitio"
|
||||
},
|
||||
"authenticate": {
|
||||
"title": "Sign in with Passkey",
|
||||
"signInFor": "Sign in with passkey for",
|
||||
"selectPasskey": "Select a passkey to sign in:",
|
||||
"noPasskeysFound": "No passkeys found for this site",
|
||||
"useBrowserPasskey": "Use Browser Passkey"
|
||||
"title": "Iniciar sesión con llave de acceso",
|
||||
"signInFor": "Iniciar sesión con llave para",
|
||||
"selectPasskey": "Seleccione una llave de acceso para iniciar sesión:",
|
||||
"noPasskeysFound": "No se encontraron llaves de acceso para este sitio",
|
||||
"useBrowserPasskey": "Usar llave de acceso del navegador"
|
||||
},
|
||||
"create": {
|
||||
"title": "Create Passkey",
|
||||
"createFor": "Create a new passkey for",
|
||||
"titleLabel": "Title",
|
||||
"titlePlaceholder": "Enter a name for this passkey",
|
||||
"createButton": "Create Passkey",
|
||||
"useBrowserPasskey": "Use Browser Passkey",
|
||||
"selectPasskeyToReplace": "Select a passkey to replace:",
|
||||
"createNewPasskey": "Create New Passkey",
|
||||
"replacingPasskey": "Replacing passkey: {{displayName}}",
|
||||
"confirmReplace": "Confirm Replace"
|
||||
"title": "Crear llave de acceso",
|
||||
"createFor": "Crear nueva llave de acceso para",
|
||||
"titleLabel": "Título",
|
||||
"titlePlaceholder": "Introduzca un nombre para esta llave de acceso",
|
||||
"createButton": "Crear llave de acceso",
|
||||
"useBrowserPasskey": "Usar llave de acceso del navegador",
|
||||
"selectPasskeyToReplace": "Seleccione una llave de acceso para reemplazar:",
|
||||
"createNewPasskey": "Crear nueva llave de acceso",
|
||||
"replacingPasskey": "Reemplazando llave de acceso: {{displayName}}",
|
||||
"confirmReplace": "Confirmar reemplazo"
|
||||
},
|
||||
"settings": {
|
||||
"passkeyProvider": "Passkey Provider",
|
||||
"passkeyProviderOn": "Passkey Provider on "
|
||||
"passkeyProvider": "Proveedor de llave de acceso",
|
||||
"passkeyProviderOn": "Proveedor de llave de acceso en "
|
||||
}
|
||||
},
|
||||
"upgrade": {
|
||||
"title": "Upgrade Vault",
|
||||
"subtitle": "AliasVault has updated and your vault needs to be upgraded. This should only take a few seconds.",
|
||||
"versionInformation": "Version Information",
|
||||
"yourVault": "Your vault version:",
|
||||
"newVersion": "New available version:",
|
||||
"upgrade": "Upgrade Vault",
|
||||
"upgrading": "Upgrading...",
|
||||
"logout": "Logout",
|
||||
"whatsNew": "What's New",
|
||||
"whatsNewDescription": "An upgrade is required to support the following changes:",
|
||||
"noDescriptionAvailable": "No description available for this version.",
|
||||
"title": "Actualizar bóveda",
|
||||
"subtitle": "AliasVault se ha actualizado y tu bóveda necesita ser actualizada. Esto solo debería tardar unos segundos.",
|
||||
"versionInformation": "Información de versión",
|
||||
"yourVault": "Tu versión de bóveda:",
|
||||
"newVersion": "Nueva versión disponible:",
|
||||
"upgrade": "Actualizar bóveda",
|
||||
"upgrading": "Actualizando...",
|
||||
"logout": "Cerrar sesión",
|
||||
"whatsNew": "Novedades",
|
||||
"whatsNewDescription": "Se requiere una actualización para soportar los siguientes cambios:",
|
||||
"noDescriptionAvailable": "Ninguna descripción disponible para esta versión.",
|
||||
"alerts": {
|
||||
"unableToGetVersionInfo": "Unable to get version information. Please try again.",
|
||||
"selfHostedServer": "Self-Hosted Server",
|
||||
"selfHostedWarning": "If you're using a self-hosted server, make sure to also update your self-hosted instance as otherwise logging in to the web client will stop working.",
|
||||
"continueUpgrade": "Continue Upgrade",
|
||||
"upgradeFailed": "Upgrade Failed",
|
||||
"failedToApplyMigration": "Failed to apply migration ({{current}} of {{total}})"
|
||||
"unableToGetVersionInfo": "No se pudo obtener información de la versión. Por favor, inténtalo de nuevo.",
|
||||
"selfHostedServer": "Servidor autoalojado",
|
||||
"selfHostedWarning": "Si está utilizando un servidor autoalojado, asegúrese de actualizar su instancia autoalojada, ya que de lo contrario iniciar sesión en el cliente web dejará de funcionar.",
|
||||
"continueUpgrade": "Continuar actualización",
|
||||
"upgradeFailed": "Actualización fallida",
|
||||
"failedToApplyMigration": "Error al migrar de ({{current}} a {{total}})"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
"password": "Mot de passe",
|
||||
"passwordPlaceholder": "Saisissez votre mot de passe",
|
||||
"rememberMe": "Se souvenir de moi",
|
||||
"loginButton": "Log in",
|
||||
"loginButton": "Se connecter",
|
||||
"noAccount": "Pas de compte?",
|
||||
"createVault": "Créer un nouveau coffre",
|
||||
"twoFactorTitle": "Veuillez entrer le code d'authentification de votre application d'authentification.",
|
||||
@@ -15,7 +15,7 @@
|
||||
"verify": "Vérifier",
|
||||
"twoFactorNote": "Remarque : si vous n'avez pas accès à votre appareil d'authentification, vous pouvez réinitialiser votre authentification à double facteur avec un code de récupération en vous connectant via le site web.",
|
||||
"masterPassword": "Mot de passe principal",
|
||||
"unlockVault": "Unlock",
|
||||
"unlockVault": "Déverrouiller",
|
||||
"unlockWithPin": "Déverrouiller avec un code PIN",
|
||||
"enterPinToUnlock": "Entrez votre code PIN pour déverrouiller votre coffre",
|
||||
"useMasterPassword": "Utiliser le mot de passe principal",
|
||||
@@ -29,9 +29,9 @@
|
||||
"connectingTo": "Connexion à",
|
||||
"switchAccounts": "Changer de compte ?",
|
||||
"loggedIn": "Connecté(e)",
|
||||
"loginWithMobile": "Log in using Mobile App",
|
||||
"unlockWithMobile": "Unlock using Mobile App",
|
||||
"scanQrCode": "Scan this QR code with your AliasVault mobile app to log in and unlock your vault.",
|
||||
"loginWithMobile": "Se connecter à l'aide de l'application mobile",
|
||||
"unlockWithMobile": "Déverrouiller en utilisant l'application mobile",
|
||||
"scanQrCode": "Scannez ce code QR avec votre application mobile AliasVault pour vous connecter et déverrouiller votre coffre.",
|
||||
"errors": {
|
||||
"invalidCode": "Veuillez entrer un code d'authentification valide à 6 chiffres.",
|
||||
"serverError": "Impossible d'accéder au serveur AliasVault. Veuillez réessayer plus tard ou contacter le support si le problème persiste.",
|
||||
@@ -39,7 +39,7 @@
|
||||
"accountLocked": "Compte temporairement verrouillé en raison d'un trop grand nombre de tentatives échouées.",
|
||||
"networkError": "Erreur réseau. Vérifiez votre connexion et réessayez.",
|
||||
"sessionExpired": "Votre session a expiré. Veuillez vous reconnecter.",
|
||||
"mobileLoginRequestExpired": "Mobile login request timed out. Please reload the page and try again."
|
||||
"mobileLoginRequestExpired": "La demande de connexion de l'application mobile a expiré. Veuillez recharger la page et réessayer."
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
@@ -57,7 +57,7 @@
|
||||
"next": "Suivant",
|
||||
"use": "Utiliser",
|
||||
"delete": "Supprimer",
|
||||
"save": "Save",
|
||||
"save": "Sauvegarder",
|
||||
"or": "Ou",
|
||||
"close": "Fermer",
|
||||
"copied": "Copié !",
|
||||
@@ -66,8 +66,8 @@
|
||||
"disabled": "Désactivé",
|
||||
"showPassword": "Afficher le mot de passe",
|
||||
"hidePassword": "Cacher le mot de passe",
|
||||
"showDetails": "Show details",
|
||||
"hideDetails": "Hide details",
|
||||
"showDetails": "Afficher les détails",
|
||||
"hideDetails": "Masquer les détails",
|
||||
"copyToClipboard": "Copier dans le presse-papiers",
|
||||
"loadingEmails": "Chargement des emails...",
|
||||
"loadingTotpCodes": "Chargement des codes TOTP...",
|
||||
@@ -99,9 +99,9 @@
|
||||
"clientVersionNotSupported": "Cette version de l'extension de navigateur AliasVault n'est plus prise en charge par le serveur. Veuillez mettre à jour votre extension de navigateur à la dernière version.",
|
||||
"browserExtensionOutdated": "Cette extension de navigateur est obsolète et ne peut pas être utilisée pour accéder à ce coffre-fort. Veuillez la mettre à jour pour continuer.",
|
||||
"serverVersionNotSupported": "Le serveur d'AliasVault doit être mis à jour vers une version plus récente afin d'utiliser cette extension de navigateur. Veuillez contacter le support si vous avez besoin d'aide.",
|
||||
"serverVersionTooOld": "The AliasVault server needs to be updated to a newer version in order to use this feature. Please contact the server admin if you need help.",
|
||||
"serverVersionTooOld": "Le serveur AliasVault doit être mis à jour vers une version plus récente pour pouvoir utiliser cette fonctionnalité. Veuillez contacter l'administrateur du serveur si vous avez besoin d'aide.",
|
||||
"unknownError": "Une erreur inconnue s'est produite",
|
||||
"unknownErrorTryAgain": "An unknown error occurred. Please try again.",
|
||||
"unknownErrorTryAgain": "Une erreur inconnue s'est produite. Merci de réessayer.",
|
||||
"vaultNotAvailable": "Coffre non disponible",
|
||||
"vaultIsLocked": "Le coffre est verrouillé",
|
||||
"passwordChanged": "Votre mot de passe a changé depuis la dernière fois que vous vous êtes connecté. Veuillez vous reconnecter pour des raisons de sécurité."
|
||||
@@ -186,8 +186,8 @@
|
||||
"welcomeTitle": "Bienvenue dans AliasVault !",
|
||||
"welcomeDescription": "Pour utiliser l'extension de navigateur AliasVault : accédez à un site web et utilisez la fenêtre de saisie automatique AliasVault pour créer un nouvel identifiant.",
|
||||
"noPasskeysFound": "No passkeys have been created yet. Passkeys are created by visiting a website that offers passkeys as an authentication method.",
|
||||
"noAttachmentsFound": "No credentials with attachments found",
|
||||
"noMatchingCredentials": "No matching credentials found",
|
||||
"noAttachmentsFound": "Aucun identifiant avec des pièces jointes trouvé",
|
||||
"noMatchingCredentials": "Aucun identifiant correspondant trouvé",
|
||||
"createdAt": "Créé",
|
||||
"updatedAt": "Dernière mise à jour",
|
||||
"saveCredential": "Enregistrer les identifiants",
|
||||
@@ -244,7 +244,7 @@
|
||||
"totp": {
|
||||
"addCode": "Add 2FA Code",
|
||||
"instructions": "Enter the secret key shown by the website where you want to add two-factor authentication.",
|
||||
"nameOptional": "Name (optional)",
|
||||
"nameOptional": "Nom (facultatif)",
|
||||
"secretKey": "Secret Key",
|
||||
"saveToViewCode": "Save to view code",
|
||||
"errors": {
|
||||
@@ -365,7 +365,7 @@
|
||||
"title": "Vault Unlock Method",
|
||||
"introText": "Choose how you want to unlock your vault. You can use your master password (always available) or set up a PIN code for faster access. After 3 failed PIN attempts, you'll need to use your master password.",
|
||||
"password": "Master Password",
|
||||
"pin": "PIN Code",
|
||||
"pin": "Code PIN",
|
||||
"pinDescription": "Unlock vault with PIN code",
|
||||
"setupPin": "Setup PIN Code",
|
||||
"enterNewPinDescription": "Enter a PIN code consisting of minimum 6 digits",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"password": "סיסמה",
|
||||
"passwordPlaceholder": "נא למלא את הסיסמה שלך",
|
||||
"rememberMe": "לזכור אותי",
|
||||
"loginButton": "Log in",
|
||||
"loginButton": "כניסה",
|
||||
"noAccount": "אין לך חשבון עדיין?",
|
||||
"createVault": "יצירת כספת חדשה",
|
||||
"twoFactorTitle": "נא למלא את קוד האימות מיישומון המאמת שלך.",
|
||||
@@ -57,7 +57,7 @@
|
||||
"next": "הבא",
|
||||
"use": "להשתמש",
|
||||
"delete": "מחיקה",
|
||||
"save": "Save",
|
||||
"save": "שמירה",
|
||||
"or": "או",
|
||||
"close": "סגירה",
|
||||
"copied": "הועתק!",
|
||||
@@ -244,8 +244,8 @@
|
||||
"totp": {
|
||||
"addCode": "Add 2FA Code",
|
||||
"instructions": "Enter the secret key shown by the website where you want to add two-factor authentication.",
|
||||
"nameOptional": "Name (optional)",
|
||||
"secretKey": "Secret Key",
|
||||
"nameOptional": "שם (רשות)",
|
||||
"secretKey": "מפתח סודי",
|
||||
"saveToViewCode": "Save to view code",
|
||||
"errors": {
|
||||
"invalidSecretKey": "Invalid secret key format."
|
||||
|
||||
@@ -6,7 +6,7 @@ export class AppInfo {
|
||||
/**
|
||||
* The current extension version. This should be updated with each release of the extension.
|
||||
*/
|
||||
public static readonly VERSION = '0.25.1';
|
||||
public static readonly VERSION = '0.25.3';
|
||||
|
||||
/**
|
||||
* The API version to send to the server (base semver without stage suffixes).
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import { describe, it, expect, beforeEach } from 'vitest';
|
||||
|
||||
import { filterCredentials } from '@/utils/credentialMatcher/CredentialMatcher';
|
||||
import type { Credential } from '@/utils/dist/shared/models/vault';
|
||||
|
||||
import { filterCredentials } from '../CredentialMatcher';
|
||||
|
||||
describe('CredentialMatcher - Credential URL Matching', () => {
|
||||
let testCredentials: Credential[];
|
||||
|
||||
@@ -20,7 +20,7 @@ export default defineConfig({
|
||||
return {
|
||||
name: "AliasVault",
|
||||
description: "AliasVault Browser AutoFill Extension. Keeping your personal information private.",
|
||||
version: "0.25.1",
|
||||
version: "0.25.3",
|
||||
content_security_policy: {
|
||||
extension_pages: "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
|
||||
},
|
||||
|
||||
@@ -93,8 +93,8 @@ android {
|
||||
applicationId 'net.aliasvault.app'
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2501900
|
||||
versionName "0.25.1"
|
||||
versionCode 2503901
|
||||
versionName "0.25.3"
|
||||
}
|
||||
signingConfigs {
|
||||
debug {
|
||||
|
||||
@@ -40,13 +40,13 @@
|
||||
<!-- Passkey Authentication Activity -->
|
||||
<activity
|
||||
android:name=".credentialprovider.PasskeyAuthenticationActivity"
|
||||
android:exported="true"
|
||||
android:exported="false"
|
||||
android:theme="@style/PasskeyRegistrationTheme" />
|
||||
|
||||
<!-- Passkey Registration Activity -->
|
||||
<activity
|
||||
android:name=".credentialprovider.PasskeyRegistrationActivity"
|
||||
android:exported="true"
|
||||
android:exported="false"
|
||||
android:theme="@style/PasskeyRegistrationTheme"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:fitsSystemWindows="true" />
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
package net.aliasvault.app.credentialprovider
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
@@ -8,6 +9,10 @@ import android.widget.TextView
|
||||
import androidx.credentials.provider.PendingIntentHandler
|
||||
import androidx.credentials.provider.ProviderGetCredentialRequest
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import net.aliasvault.app.R
|
||||
import net.aliasvault.app.utils.Helpers
|
||||
import net.aliasvault.app.vaultstore.VaultStore
|
||||
@@ -109,6 +114,19 @@ class PasskeyAuthenticationActivity : FragmentActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the loading message displayed to the user.
|
||||
*/
|
||||
private fun updateLoadingMessage(messageResId: Int) {
|
||||
runOnUiThread {
|
||||
try {
|
||||
findViewById<TextView>(R.id.loadingMessage)?.text = getString(messageResId)
|
||||
} catch (e: Exception) {
|
||||
Log.w(TAG, "Could not update loading message", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the passkey authentication request and generate assertion.
|
||||
* Called after authentication (biometric or PIN) succeeds and vault is unlocked.
|
||||
@@ -120,107 +138,149 @@ class PasskeyAuthenticationActivity : FragmentActivity() {
|
||||
finish()
|
||||
return
|
||||
}
|
||||
try {
|
||||
// Extract passkey ID from intent
|
||||
val passkeyIdString = intent.getStringExtra(
|
||||
AliasVaultCredentialProviderService.EXTRA_PASSKEY_ID,
|
||||
)
|
||||
if (passkeyIdString == null) {
|
||||
Log.e(TAG, "No passkey ID in intent")
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
val passkeyId = UUID.fromString(passkeyIdString.uppercase())
|
||||
|
||||
// Get database connection from vault (should be unlocked at this point)
|
||||
val db = vaultStore.database
|
||||
if (db == null) {
|
||||
Log.e(TAG, "Database not available - vault may not be unlocked")
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
val passkey = vaultStore.getPasskeyById(passkeyId, db)
|
||||
if (passkey == null) {
|
||||
Log.e(TAG, "Passkey not found: $passkeyId")
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
val requestJson = intent.getStringExtra(
|
||||
AliasVaultCredentialProviderService.EXTRA_REQUEST_JSON,
|
||||
) ?: ""
|
||||
val requestObj = JSONObject(requestJson)
|
||||
|
||||
// Extract clientDataHash from the calling app's request
|
||||
// Browsers (Chrome, Firefox, Edge, etc.) provide this, native apps typically don't
|
||||
val providedClientDataHash: ByteArray? = providerRequest.credentialOptions
|
||||
.filterIsInstance<androidx.credentials.GetPublicKeyCredentialOption>()
|
||||
.firstOrNull()?.clientDataHash
|
||||
|
||||
// Determine clientDataHash and clientDataJson based on what caller provided
|
||||
val clientDataHash: ByteArray
|
||||
val clientDataJson: String?
|
||||
if (providedClientDataHash != null) {
|
||||
// Browser provided clientDataHash - use it directly
|
||||
// The browser has its own clientDataJSON with the web origin
|
||||
clientDataHash = providedClientDataHash
|
||||
clientDataJson = null
|
||||
} else {
|
||||
// Native app scenario - build clientDataJSON ourselves and hash it
|
||||
val challenge = requestObj.optString("challenge", "")
|
||||
val origin = requestObj.optString("origin", "https://${passkey.rpId}")
|
||||
val json = buildClientDataJson(challenge, origin)
|
||||
clientDataHash = sha256(json.toByteArray(Charsets.UTF_8))
|
||||
clientDataJson = json
|
||||
}
|
||||
|
||||
// Use PasskeyAuthenticator.getAssertion for signing
|
||||
val credentialId = PasskeyHelper.guidToBytes(passkey.id.toString())
|
||||
val prfInputs = extractPrfInputs(requestObj)
|
||||
val assertion = PasskeyAuthenticator.getAssertion(
|
||||
credentialId = credentialId,
|
||||
clientDataHash = clientDataHash,
|
||||
rpId = passkey.rpId,
|
||||
privateKeyJWK = passkey.privateKey,
|
||||
userId = passkey.userHandle,
|
||||
uvPerformed = true,
|
||||
prfInputs = prfInputs,
|
||||
prfSecret = passkey.prfKey,
|
||||
)
|
||||
|
||||
// Build response JSON
|
||||
val response = buildPublicKeyCredentialResponse(
|
||||
assertion = assertion,
|
||||
clientDataJson = clientDataJson,
|
||||
)
|
||||
|
||||
val resultIntent = Intent()
|
||||
lifecycleScope.launch {
|
||||
try {
|
||||
PendingIntentHandler.setGetCredentialResponse(resultIntent, response)
|
||||
setResult(RESULT_OK, resultIntent)
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error setting credential response", e)
|
||||
try {
|
||||
PendingIntentHandler.setGetCredentialException(
|
||||
resultIntent,
|
||||
androidx.credentials.exceptions.GetCredentialUnknownException("Failed to generate assertion: ${e.message}"),
|
||||
)
|
||||
setResult(RESULT_OK, resultIntent)
|
||||
} catch (e2: Exception) {
|
||||
Log.e(TAG, "Error setting exception", e2)
|
||||
// Show retrieving status to user
|
||||
updateLoadingMessage(R.string.passkey_retrieving)
|
||||
|
||||
// Extract passkey ID from intent
|
||||
val passkeyIdString = intent.getStringExtra(
|
||||
AliasVaultCredentialProviderService.EXTRA_PASSKEY_ID,
|
||||
)
|
||||
if (passkeyIdString == null) {
|
||||
Log.e(TAG, "No passkey ID in intent")
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
return@launch
|
||||
}
|
||||
|
||||
val passkeyId = UUID.fromString(passkeyIdString.uppercase())
|
||||
|
||||
// Get database connection from vault
|
||||
val db = vaultStore.database
|
||||
if (db == null) {
|
||||
Log.e(TAG, "Database not available - vault may not be unlocked")
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
return@launch
|
||||
}
|
||||
|
||||
val passkey = vaultStore.getPasskeyById(passkeyId, db)
|
||||
if (passkey == null) {
|
||||
Log.e(TAG, "Passkey not found: $passkeyId")
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
return@launch
|
||||
}
|
||||
|
||||
val requestJson = intent.getStringExtra(
|
||||
AliasVaultCredentialProviderService.EXTRA_REQUEST_JSON,
|
||||
) ?: ""
|
||||
val requestObj = JSONObject(requestJson)
|
||||
|
||||
// Extract clientDataHash from the calling app's request
|
||||
// Browsers (Chrome, Firefox, Edge, etc.) provide this, native apps typically don't
|
||||
val providedClientDataHash: ByteArray? = providerRequest.credentialOptions
|
||||
.filterIsInstance<androidx.credentials.GetPublicKeyCredentialOption>()
|
||||
.firstOrNull()?.clientDataHash
|
||||
|
||||
// Show verifying status to user
|
||||
updateLoadingMessage(R.string.passkey_verifying)
|
||||
|
||||
// Verify origin of the calling app
|
||||
val originVerifier = OriginVerifier()
|
||||
val callingAppInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
providerRequest.callingAppInfo
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
// Run origin verification on IO thread
|
||||
val originResult = withContext(Dispatchers.IO) {
|
||||
originVerifier.verifyOrigin(
|
||||
callingAppInfo = callingAppInfo,
|
||||
requestedRpId = passkey.rpId,
|
||||
)
|
||||
}
|
||||
|
||||
val verifiedOrigin: String
|
||||
val isPrivilegedCaller: Boolean
|
||||
|
||||
when (originResult) {
|
||||
is OriginVerifier.OriginResult.Success -> {
|
||||
verifiedOrigin = originResult.origin
|
||||
isPrivilegedCaller = originResult.isPrivileged
|
||||
Log.d(TAG, "Origin verified: $verifiedOrigin (privileged: $isPrivilegedCaller)")
|
||||
}
|
||||
is OriginVerifier.OriginResult.Failure -> {
|
||||
Log.e(TAG, "Origin verification failed: ${originResult.reason}")
|
||||
showError("Security error: ${originResult.reason}")
|
||||
return@launch
|
||||
}
|
||||
}
|
||||
|
||||
// Show authenticating status to user
|
||||
updateLoadingMessage(R.string.passkey_authenticating)
|
||||
|
||||
// Determine clientDataHash and clientDataJson based on what caller provided
|
||||
val clientDataHash: ByteArray
|
||||
val clientDataJson: String?
|
||||
if (providedClientDataHash != null && isPrivilegedCaller) {
|
||||
// Browser provided clientDataHash - use it directly
|
||||
clientDataHash = providedClientDataHash
|
||||
clientDataJson = null
|
||||
} else {
|
||||
// Native app scenario - build clientDataJSON ourselves
|
||||
val challenge = requestObj.optString("challenge", "")
|
||||
val json = buildClientDataJson(challenge, verifiedOrigin)
|
||||
clientDataHash = sha256(json.toByteArray(Charsets.UTF_8))
|
||||
clientDataJson = json
|
||||
}
|
||||
|
||||
// Use PasskeyAuthenticator.getAssertion for signing
|
||||
val credentialId = PasskeyHelper.guidToBytes(passkey.id.toString())
|
||||
val prfInputs = extractPrfInputs(requestObj)
|
||||
val assertion = PasskeyAuthenticator.getAssertion(
|
||||
credentialId = credentialId,
|
||||
clientDataHash = clientDataHash,
|
||||
rpId = passkey.rpId,
|
||||
privateKeyJWK = passkey.privateKey,
|
||||
userId = passkey.userHandle,
|
||||
uvPerformed = true,
|
||||
prfInputs = prfInputs,
|
||||
prfSecret = passkey.prfKey,
|
||||
)
|
||||
|
||||
// Build response JSON
|
||||
val response = buildPublicKeyCredentialResponse(
|
||||
assertion = assertion,
|
||||
clientDataJson = clientDataJson,
|
||||
)
|
||||
|
||||
val resultIntent = Intent()
|
||||
try {
|
||||
PendingIntentHandler.setGetCredentialResponse(resultIntent, response)
|
||||
setResult(RESULT_OK, resultIntent)
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error setting credential response", e)
|
||||
try {
|
||||
PendingIntentHandler.setGetCredentialException(
|
||||
resultIntent,
|
||||
androidx.credentials.exceptions.GetCredentialUnknownException("Failed to generate assertion: ${e.message}"),
|
||||
)
|
||||
setResult(RESULT_OK, resultIntent)
|
||||
} catch (e2: Exception) {
|
||||
Log.e(TAG, "Error setting exception", e2)
|
||||
setResult(RESULT_CANCELED)
|
||||
}
|
||||
}
|
||||
finish()
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error processing authentication request", e)
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
}
|
||||
finish()
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error processing authentication request", e)
|
||||
setResult(RESULT_CANCELED)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -246,8 +246,11 @@ class PasskeyFormFragment : Fragment() {
|
||||
val requestObj = JSONObject(viewModel.requestJson)
|
||||
val challenge = requestObj.optString("challenge", "")
|
||||
|
||||
// Use origin from the request, or fallback to RP id
|
||||
val requestOrigin = viewModel.origin ?: ("https://" + viewModel.rpId)
|
||||
// Use the origin set by PasskeyRegistrationActivity
|
||||
val requestOrigin = viewModel.origin
|
||||
?: throw net.aliasvault.app.exceptions.PasskeyOperationException(
|
||||
"Origin not available",
|
||||
)
|
||||
|
||||
// Extract PRF inputs if present
|
||||
val prfInputs = extractPrfInputs(requestObj)
|
||||
@@ -438,8 +441,9 @@ class PasskeyFormFragment : Fragment() {
|
||||
val requestObj = JSONObject(viewModel.requestJson)
|
||||
val challenge = requestObj.optString("challenge", "")
|
||||
|
||||
// Use origin from the request
|
||||
val requestOrigin = viewModel.origin ?: throw PasskeyOperationException("Origin not available")
|
||||
// Use the origin set by PasskeyRegistrationActivity
|
||||
val requestOrigin = viewModel.origin
|
||||
?: throw PasskeyOperationException("Origin not available")
|
||||
|
||||
// Extract PRF inputs if present
|
||||
val prfInputs = extractPrfInputs(requestObj)
|
||||
|
||||
@@ -1,14 +1,20 @@
|
||||
package net.aliasvault.app.credentialprovider
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.activity.viewModels
|
||||
import androidx.credentials.CreatePublicKeyCredentialRequest
|
||||
import androidx.credentials.provider.CallingAppInfo
|
||||
import androidx.credentials.provider.PendingIntentHandler
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import net.aliasvault.app.R
|
||||
import net.aliasvault.app.credentialprovider.models.PasskeyRegistrationViewModel
|
||||
import net.aliasvault.app.utils.Helpers
|
||||
@@ -65,10 +71,9 @@ class PasskeyRegistrationActivity : FragmentActivity() {
|
||||
return
|
||||
}
|
||||
|
||||
// Get requestJson, clientDataHash, and origin from the request
|
||||
// Get requestJson, clientDataHash from the request
|
||||
viewModel.requestJson = createRequest.requestJson
|
||||
viewModel.clientDataHash = createRequest.clientDataHash
|
||||
viewModel.origin = createRequest.origin
|
||||
|
||||
// Parse request JSON to extract RP ID and user info
|
||||
val requestObj = JSONObject(viewModel.requestJson)
|
||||
@@ -102,29 +107,18 @@ class PasskeyRegistrationActivity : FragmentActivity() {
|
||||
null
|
||||
}
|
||||
|
||||
// Show loading screen while unlock is in progress
|
||||
// Show loading screen while verification and unlock are in progress
|
||||
setContentView(R.layout.activity_loading)
|
||||
|
||||
// Initialize unlock coordinator
|
||||
unlockCoordinator = UnlockCoordinator(
|
||||
activity = this,
|
||||
vaultStore = vaultStore,
|
||||
onUnlocked = {
|
||||
// Vault unlocked successfully - proceed with passkey registration
|
||||
proceedWithPasskeyRegistration(savedInstanceState)
|
||||
},
|
||||
onCancelled = {
|
||||
// User cancelled unlock
|
||||
finish()
|
||||
},
|
||||
onError = { errorMessage ->
|
||||
// Error during unlock
|
||||
showError(errorMessage)
|
||||
},
|
||||
)
|
||||
// Get calling app info for origin verification
|
||||
val callingAppInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
providerRequest.callingAppInfo
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
// Start the unlock flow
|
||||
unlockCoordinator.startUnlockFlow()
|
||||
// Verify origin and start unlock flow
|
||||
verifyOriginAndStartUnlock(callingAppInfo, savedInstanceState)
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error in onCreate", e)
|
||||
finish()
|
||||
@@ -140,6 +134,76 @@ class PasskeyRegistrationActivity : FragmentActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the loading message displayed to the user.
|
||||
*/
|
||||
private fun updateLoadingMessage(messageResId: Int) {
|
||||
runOnUiThread {
|
||||
try {
|
||||
findViewById<TextView>(R.id.loadingMessage)?.text = getString(messageResId)
|
||||
} catch (e: Exception) {
|
||||
Log.w(TAG, "Could not update loading message", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify origin on background thread and start unlock flow if successful.
|
||||
*/
|
||||
private fun verifyOriginAndStartUnlock(callingAppInfo: CallingAppInfo?, savedInstanceState: Bundle?) {
|
||||
lifecycleScope.launch {
|
||||
try {
|
||||
// Show verifying status to user (network call may happen)
|
||||
updateLoadingMessage(R.string.passkey_verifying)
|
||||
|
||||
// Run origin verification on IO thread (asset links fetch requires network)
|
||||
val originVerifier = OriginVerifier()
|
||||
val originResult = withContext(Dispatchers.IO) {
|
||||
originVerifier.verifyOrigin(
|
||||
callingAppInfo = callingAppInfo,
|
||||
requestedRpId = viewModel.rpId,
|
||||
)
|
||||
}
|
||||
|
||||
when (originResult) {
|
||||
is OriginVerifier.OriginResult.Success -> {
|
||||
viewModel.origin = originResult.origin
|
||||
viewModel.isPrivilegedCaller = originResult.isPrivileged
|
||||
Log.d(TAG, "Origin verified: ${originResult.origin} (privileged: ${originResult.isPrivileged})")
|
||||
|
||||
// Initialize unlock coordinator
|
||||
unlockCoordinator = UnlockCoordinator(
|
||||
activity = this@PasskeyRegistrationActivity,
|
||||
vaultStore = vaultStore,
|
||||
onUnlocked = {
|
||||
// Vault unlocked successfully - proceed with passkey registration
|
||||
proceedWithPasskeyRegistration(savedInstanceState)
|
||||
},
|
||||
onCancelled = {
|
||||
// User cancelled unlock
|
||||
finish()
|
||||
},
|
||||
onError = { errorMessage ->
|
||||
// Error during unlock
|
||||
showError(errorMessage)
|
||||
},
|
||||
)
|
||||
|
||||
// Start the unlock flow
|
||||
unlockCoordinator.startUnlockFlow()
|
||||
}
|
||||
is OriginVerifier.OriginResult.Failure -> {
|
||||
Log.e(TAG, "Origin verification failed: ${originResult.reason}")
|
||||
showError("Security error: ${originResult.reason}")
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error verifying origin", e)
|
||||
showError("Error verifying application: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Proceed with passkey registration after authentication (biometric or PIN).
|
||||
*/
|
||||
|
||||
@@ -17,6 +17,9 @@ class PasskeyRegistrationViewModel : ViewModel() {
|
||||
/** The origin URL of the passkey request. */
|
||||
var origin: String? = null
|
||||
|
||||
/** Whether the caller is a privileged app (browser). */
|
||||
var isPrivilegedCaller: Boolean = false
|
||||
|
||||
/** The relying party identifier. */
|
||||
var rpId: String = ""
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Dies wird den bestehenden Passkey durch einen neuen ersetzen. Bitte beachte, dass Dein alter Passkey überschrieben wird und nicht mehr zugänglich ist. Wenn Du stattdessen einen separaten Passkey erstellen möchtest, gehe zurück zum vorherigen Schritt.</string>
|
||||
<string name="passkey_replacing">Passkey ersetzen…</string>
|
||||
<string name="passkey_checking_connection">Verbindung wird überprüft…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Verbindungsfehler</string>
|
||||
<string name="connection_error_message">Es kann keine Verbindung zum Server hergestellt werden. Bitte überprüfe Deine Internetverbindung und versuche das Erstellen des Passkeys erneut.</string>
|
||||
|
||||
@@ -1,78 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">AliasVault</string>
|
||||
<string name="autofill_service_description" translatable="true">AliasVault AutoFill</string>
|
||||
<string name="aliasvault_icon">AliasVault icon</string>
|
||||
<string name="autofill_service_description" translatable="true">AutoFill de AliasVault</string>
|
||||
<string name="aliasvault_icon">Icono AliasVault</string>
|
||||
<!-- Common strings -->
|
||||
<string name="common_close">Close</string>
|
||||
<string name="common_next">Next</string>
|
||||
<string name="common_cancel">Cancel</string>
|
||||
<string name="unknown_error">An unknown error occurred</string>
|
||||
<string name="common_close">Cerrar</string>
|
||||
<string name="common_next">Siguiente</string>
|
||||
<string name="common_cancel">Cancelar</string>
|
||||
<string name="unknown_error">Se produjo un error desconocido</string>
|
||||
<!-- AutofillService strings -->
|
||||
<string name="autofill_failed_to_retrieve">Failed to retrieve, open app</string>
|
||||
<string name="autofill_no_match_found">No match found, create new?</string>
|
||||
<string name="autofill_open_app">Open app</string>
|
||||
<string name="autofill_vault_locked">Vault locked</string>
|
||||
<string name="autofill_failed_to_retrieve">Fallo al recuperar, abrir aplicación</string>
|
||||
<string name="autofill_no_match_found">No se han encontrado coincidencias, ¿crear nuevo?</string>
|
||||
<string name="autofill_open_app">Abrir aplicación</string>
|
||||
<string name="autofill_vault_locked">Bóveda bloqueada</string>
|
||||
<!-- Biometric prompts -->
|
||||
<string name="biometric_store_key_title">Store Encryption Key</string>
|
||||
<string name="biometric_store_key_subtitle">Authenticate to securely store your encryption key in the Android Keystore. This enables secure access to your vault.</string>
|
||||
<string name="biometric_unlock_vault_title">Unlock Vault</string>
|
||||
<string name="biometric_unlock_vault_subtitle">Authenticate to access your vault</string>
|
||||
<string name="biometric_store_key_title">Guardar clave de cifrado</string>
|
||||
<string name="biometric_store_key_subtitle">Autenticar para almacenar su clave de cifrado de forma segura en el almacén de claves Android. Esto habilita el acceso seguro a su bóveda.</string>
|
||||
<string name="biometric_unlock_vault_title">Desbloquear bóveda</string>
|
||||
<string name="biometric_unlock_vault_subtitle">Autenticar para acceder a su bóveda</string>
|
||||
<!-- Passkey registration -->
|
||||
<string name="passkey_registration_title">Create Passkey</string>
|
||||
<string name="create_passkey_title">Create New Passkey</string>
|
||||
<string name="create_passkey_subtitle">Register a new passkey for this website. It will be securely stored in your vault and automatically synced across your devices with AliasVault.</string>
|
||||
<string name="replace_passkey_title">Replace Passkey</string>
|
||||
<string name="passkey_display_name_label">Passkey Name</string>
|
||||
<string name="passkey_display_name_hint">Enter a name for this passkey</string>
|
||||
<string name="passkey_website_label">Website</string>
|
||||
<string name="passkey_username_label">Username</string>
|
||||
<string name="passkey_create_button">Create Passkey</string>
|
||||
<string name="passkey_creating">Creating passkey…</string>
|
||||
<string name="passkey_saving">Saving to vault…</string>
|
||||
<string name="passkey_syncing">Syncing with server…</string>
|
||||
<string name="passkey_registration_title">Crear llave de acceso</string>
|
||||
<string name="create_passkey_title">Crear nueva llave de acceso</string>
|
||||
<string name="create_passkey_subtitle">Registre una nueva llave de acceso para este sitio web. Se almacenará de forma segura en su bóveda y se sincronizará automáticamente en todos sus dispositivos con AliasVault.</string>
|
||||
<string name="replace_passkey_title">Reemplazar llave de acceso</string>
|
||||
<string name="passkey_display_name_label">Nombre de llave de acceso</string>
|
||||
<string name="passkey_display_name_hint">Introduzca un nombre para esta llave de acceso</string>
|
||||
<string name="passkey_website_label">Sitio Web</string>
|
||||
<string name="passkey_username_label">Nombre de usuario</string>
|
||||
<string name="passkey_create_button">Crear llave de acceso</string>
|
||||
<string name="passkey_creating">Creando llave de acceso…</string>
|
||||
<string name="passkey_saving">Guardando en la bóveda…</string>
|
||||
<string name="passkey_syncing">Sincronizando con el servidor…</string>
|
||||
<string name="passkey_error_title">Error</string>
|
||||
<string name="passkey_error_empty_name">Please enter a name for the passkey</string>
|
||||
<string name="passkey_creation_failed">Failed to create passkey</string>
|
||||
<string name="passkey_retry_button">Retry</string>
|
||||
<string name="passkey_info_icon">Info icon</string>
|
||||
<string name="passkey_create_explanation">This creates a new passkey and stores it in your vault. It will be automatically synced across all your devices that use AliasVault.</string>
|
||||
<string name="passkey_create_new_button">Create New Passkey</string>
|
||||
<string name="passkey_select_to_replace">Or, replace an existing passkey:</string>
|
||||
<string name="passkey_replace_button">Replace Passkey</string>
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_error_empty_name">Introduzca un nombre para la llave de acceso</string>
|
||||
<string name="passkey_creation_failed">Fallo al crear la llave de acceso</string>
|
||||
<string name="passkey_retry_button">Reintentar</string>
|
||||
<string name="passkey_info_icon">Icono de información</string>
|
||||
<string name="passkey_create_explanation">Esto crea una nueva llave de acceso y la almacena en tu bóveda. Se sincronizará automáticamente en todos tus dispositivos que utilicen AliasVault.</string>
|
||||
<string name="passkey_create_new_button">Crear nueva llave de acceso</string>
|
||||
<string name="passkey_select_to_replace">O, reemplazar una llave de acceso existente:</string>
|
||||
<string name="passkey_replace_button">Reemplazar llave de acceso</string>
|
||||
<string name="passkey_replace_explanation">Esto reemplazará la llave de acceso existente con una nueva. Tenga en cuenta que su llave de acceso antigua será sobrescrita y ya no será accesible. Si desea crear una llave de acceso separada en su lugar, vuelva a la pantalla anterior.</string>
|
||||
<string name="passkey_replacing">Reemplazando llave de acceso…</string>
|
||||
<string name="passkey_checking_connection">Comprobando la conexión…</string>
|
||||
<string name="passkey_retrieving">Recuperando llave…</string>
|
||||
<string name="passkey_verifying">Verificando…</string>
|
||||
<string name="passkey_authenticating">Autenticando…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
<string name="session_expired_title">Session Expired</string>
|
||||
<string name="session_expired_message">Your session has expired. Please sign in again.</string>
|
||||
<string name="password_changed_title">Password Changed</string>
|
||||
<string name="password_changed_message">Your password has been changed. Please sign in again.</string>
|
||||
<string name="version_not_supported_title">Update Required</string>
|
||||
<string name="version_not_supported_message">Your app version is no longer supported. Please update to the latest version.</string>
|
||||
<string name="server_unavailable_title">Server Unavailable</string>
|
||||
<string name="server_unavailable_message">The server is currently unavailable. Please try again later.</string>
|
||||
<string name="network_error_title">Network Error</string>
|
||||
<string name="network_error_message">A network error occurred. Please check your connection and try again.</string>
|
||||
<string name="server_version_not_supported_title">Server Update Required</string>
|
||||
<string name="server_version_not_supported_message">The server version is outdated. Please contact your administrator to update the server.</string>
|
||||
<string name="connection_error_title">Error de conexión</string>
|
||||
<string name="connection_error_message">No se puede establecer conexión con el servidor. Por favor, compruebe su conexión a Internet e intente crear la llave de acceso de nuevo.</string>
|
||||
<string name="session_expired_title">Sesión expirada</string>
|
||||
<string name="session_expired_message">Su sesión ha expirado. Por favor, inicie sesión de nuevo.</string>
|
||||
<string name="password_changed_title">Contraseña cambiada</string>
|
||||
<string name="password_changed_message">Su contraseña ha sido cambiada. Por favor, inicie sesión de nuevo.</string>
|
||||
<string name="version_not_supported_title">Actualización requerida</string>
|
||||
<string name="version_not_supported_message">La versión de su aplicación ya no es compatible. Por favor, actualice a la última versión.</string>
|
||||
<string name="server_unavailable_title">Servidor no disponible</string>
|
||||
<string name="server_unavailable_message">El servidor no está disponible actualmente. Inténtelo de nuevo más tarde.</string>
|
||||
<string name="network_error_title">Error de red</string>
|
||||
<string name="network_error_message">Se produjo un error de red. Por favor, compruebe la conexión y vuelva a intentarlo.</string>
|
||||
<string name="server_version_not_supported_title">Actualización del servidor necesaria</string>
|
||||
<string name="server_version_not_supported_message">La versión del servidor está desactualizada. Por favor, contacte con su administrador para actualizar el servidor.</string>
|
||||
<!-- Passkey authentication and unlock error messages -->
|
||||
<string name="error_unlock_method_required">Please enable biometric or PIN authentication in the main AliasVault app in order to continue</string>
|
||||
<string name="error_unlock_vault_first">Please unlock vault in AliasVault app first</string>
|
||||
<string name="error_vault_decrypt_failed">Failed to decrypt vault</string>
|
||||
<string name="error_biometric_cancelled">Biometric authentication cancelled</string>
|
||||
<string name="error_encryption_key_failed">Failed to retrieve encryption key</string>
|
||||
<string name="error_unlock_method_required">Por favor, habilite la autenticación biométrica o PIN en la aplicación principal de AliasVault para continuar</string>
|
||||
<string name="error_unlock_vault_first">Por favor, primero desbloquea bóveda en la aplicación AliasVault</string>
|
||||
<string name="error_vault_decrypt_failed">Error al descifrar la bóveda</string>
|
||||
<string name="error_biometric_cancelled">Autenticación biométrica cancelada</string>
|
||||
<string name="error_encryption_key_failed">Fallo al recuperar la clave de cifrado</string>
|
||||
<!-- PIN unlock -->
|
||||
<string name="pin_unlock_vault">Unlock Vault</string>
|
||||
<string name="pin_enter_to_unlock">Enter your PIN to unlock your vault</string>
|
||||
<string name="pin_locked_max_attempts">PIN locked after too many failed attempts</string>
|
||||
<string name="pin_incorrect_attempts_remaining">Incorrect PIN. %d attempts remaining</string>
|
||||
<string name="pin_unlock_vault">Desbloquear bóveda</string>
|
||||
<string name="pin_enter_to_unlock">Introduzca su PIN para desbloquear su bóveda</string>
|
||||
<string name="pin_locked_max_attempts">PIN bloqueado tras demasiados intentos fallidos</string>
|
||||
<string name="pin_incorrect_attempts_remaining">PIN incorrecto, %d intentos restantes</string>
|
||||
<!-- PIN setup -->
|
||||
<string name="pin_setup_title">Setup PIN</string>
|
||||
<string name="pin_setup_description">Choose a PIN to unlock your vault</string>
|
||||
<string name="pin_confirm_title">Confirm PIN</string>
|
||||
<string name="pin_confirm_description">Re-enter your PIN to confirm</string>
|
||||
<string name="pin_mismatch">PINs do not match. Please try again.</string>
|
||||
<string name="pin_setup_title">Configurar PIN</string>
|
||||
<string name="pin_setup_description">Elija un PIN para desbloquear su bóveda</string>
|
||||
<string name="pin_confirm_title">Confirmar PIN</string>
|
||||
<string name="pin_confirm_description">Vuelva a introducir su PIN para confirmar</string>
|
||||
<string name="pin_mismatch">Los PIN no coinciden. Por favor, inténtalo de nuevo.</string>
|
||||
</resources>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Tämä korvaa olemassa olevan todennusavaimen uudella todennusavaimella. Ole hyvä ja ota huomioon, että vanha todennusavaimesi on korvattu eikä enää käytettävissä. Jos haluat luoda erillisen todennusavaimen sen sijaan, mene takaisin edelliseen ruutuun.</string>
|
||||
<string name="passkey_replacing">Korvataan todennusavainta...</string>
|
||||
<string name="passkey_checking_connection">Tarkistetaan yhteyttä</string>
|
||||
<string name="passkey_retrieving">Noudetaan todennusavainta...</string>
|
||||
<string name="passkey_verifying">Tarkistetaan…</string>
|
||||
<string name="passkey_authenticating">Todennetaan…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Yhteysvirhe</string>
|
||||
<string name="connection_error_message">Yhteyttä palvelimeen ei voida luoda. Tarkista internet-yhteytesi ja yritä luoda todennusavain uudelleen.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">החיבור נבדק…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">שגיאת חיבור</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Questo sostituirà la passkey esistente con una nuova. Si prega di notare che la vecchia passkey sarà sovrascritta e non sarà più accessibile. Se si desidera invece creare una passkey separata, tornare alla schermata precedente.</string>
|
||||
<string name="passkey_replacing">Sostituzione passkey…</string>
|
||||
<string name="passkey_checking_connection">Controllo connessione…</string>
|
||||
<string name="passkey_retrieving">Recupero passkey…</string>
|
||||
<string name="passkey_verifying">Verifica…</string>
|
||||
<string name="passkey_authenticating">Autenticazione…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Errore Di Connessione</string>
|
||||
<string name="connection_error_message">Non è possibile effettuare alcuna connessione al server. Controlla la tua connessione internet e prova a creare nuovamente la passkey.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Dit zal de bestaande passkey vervangen door een nieuwe. Houd er rekening mee dat je oude passkey wordt overschreven en niet langer toegankelijk is. Als je in plaats hiervan een aparte passkey wilt maken, ga dan terug naar het vorige scherm.</string>
|
||||
<string name="passkey_replacing">Passkey vervangen…</string>
|
||||
<string name="passkey_checking_connection">Verbinding controleren…</string>
|
||||
<string name="passkey_retrieving">Passkey ophalen…</string>
|
||||
<string name="passkey_verifying">Verifiëren…</string>
|
||||
<string name="passkey_authenticating">Authenticeren…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Verbindingsfout</string>
|
||||
<string name="connection_error_message">Er kan geen verbinding met de server worden gemaakt. Controleer je internetverbinding en probeer het opnieuw.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Spowoduje to zastąpienie dotychczasowego klucza dostępu nowym. Należy pamiętać, że stare klucz zostanie nadpisany i nie będzie już dostępny. Jeśli chcesz utworzyć nowy klucz dostępu, wróć do poprzedniego ekranu.</string>
|
||||
<string name="passkey_replacing">Zastępowanie klucza dostępu…</string>
|
||||
<string name="passkey_checking_connection">Sprawdzanie połączenia…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Błąd połączenia</string>
|
||||
<string name="connection_error_message">Nie można nawiązać połączenia z serwerem. Sprawdź połączenie internetowe i spróbuj ponownie utworzyć klucz dostępu.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Isto irá substituir a passkey existente com uma nova. Por favor, saiba que sua passkey anterior será sobrescrita e não será mais acessível. Se você deseja criar uma passkey separadamente, volte à tela anterior.</string>
|
||||
<string name="passkey_replacing">Substituindo passkey…</string>
|
||||
<string name="passkey_checking_connection">Verificando conexão…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Erro de Conexão</string>
|
||||
<string name="connection_error_message">A conexão com o servidor não foi feita. Por favor, confira sua conexão com a internet e tente criar a passkey novamente.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">Существующий ключ доступа будет заменен на новый. Обратите внимание, что старый ключ будет перезаписан и станет недоступен. Если вы хотите создать отдельный ключ доступа, вернитесь на предыдущий экран.</string>
|
||||
<string name="passkey_replacing">Замена ключа доступа…</string>
|
||||
<string name="passkey_checking_connection">Проверка соединения…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Ошибка подключения</string>
|
||||
<string name="connection_error_message">Не удалось подключиться к серверу. Проверьте интернет-соединение и попробуйте создать ключ доступа снова.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">正在替换通行密钥…</string>
|
||||
<string name="passkey_checking_connection">检查连接中…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">连接错误</string>
|
||||
<string name="connection_error_message">No connection to the server can be made. Please check your internet connection and try creating the passkey again.</string>
|
||||
|
||||
@@ -49,6 +49,9 @@
|
||||
<string name="passkey_replace_explanation">This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.</string>
|
||||
<string name="passkey_replacing">Replacing passkey…</string>
|
||||
<string name="passkey_checking_connection">Checking connection…</string>
|
||||
<string name="passkey_retrieving">Retrieving passkey…</string>
|
||||
<string name="passkey_verifying">Verifying…</string>
|
||||
<string name="passkey_authenticating">Authenticating…</string>
|
||||
|
||||
<!-- Vault sync error messages -->
|
||||
<string name="connection_error_title">Connection Error</string>
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<locale android:name="de" />
|
||||
<locale android:name="en" />
|
||||
<locale android:name="es" />
|
||||
<locale android:name="fi" />
|
||||
<locale android:name="fr" />
|
||||
<locale android:name="he" />
|
||||
<locale android:name="it" />
|
||||
<locale android:name="nl" />
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"expo": {
|
||||
"name": "AliasVault",
|
||||
"slug": "AliasVault",
|
||||
"version": "0.25.1",
|
||||
"version": "0.25.3",
|
||||
"orientation": "portrait",
|
||||
"icon": "./assets/images/icon.png",
|
||||
"scheme": "aliasvault",
|
||||
|
||||
@@ -4,7 +4,9 @@ import { initReactI18next } from 'react-i18next';
|
||||
|
||||
import de from './locales/de.json';
|
||||
import en from './locales/en.json';
|
||||
import es from './locales/es.json';
|
||||
import fi from './locales/fi.json';
|
||||
import fr from './locales/fr.json';
|
||||
import he from './locales/he.json';
|
||||
import it from './locales/it.json';
|
||||
import nl from './locales/nl.json';
|
||||
@@ -17,7 +19,9 @@ import zh from './locales/zh.json';
|
||||
const resources = {
|
||||
de: { translation: de },
|
||||
en: { translation: en },
|
||||
es: { translation: es },
|
||||
fi: { translation: fi },
|
||||
fr: { translation: fr },
|
||||
he: { translation: he },
|
||||
nl: { translation: nl },
|
||||
it: { translation: it },
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"common": {
|
||||
"cancel": "Annuler",
|
||||
"close": "Close",
|
||||
"close": "Fermer",
|
||||
"delete": "Supprimer",
|
||||
"save": "Sauvegarder",
|
||||
"yes": "Oui",
|
||||
@@ -24,78 +24,78 @@
|
||||
"deleteItemConfirmTitle": "Supprimer l'élement",
|
||||
"deleteItemConfirmDescription": "Êtes-vous certain de vouloir supprimer cet élément?",
|
||||
"errors": {
|
||||
"unknownError": "An unknown error occurred. Please try again.",
|
||||
"unknownErrorTryAgain": "An unknown error occurred. Please try again.",
|
||||
"serverVersionTooOld": "The AliasVault server needs to be updated to a newer version in order to use this feature. Please contact the server admin if you need help."
|
||||
"unknownError": "Une erreur inconnue s'est produite. Merci de réessayer.",
|
||||
"unknownErrorTryAgain": "Une erreur inconnue s'est produite. Merci de réessayer.",
|
||||
"serverVersionTooOld": "Le serveur AliasVault doit être mis à jour vers une version plus récente pour pouvoir utiliser cette fonctionnalité. Veuillez contacter l'administrateur du serveur si vous avez besoin d'aide."
|
||||
}
|
||||
},
|
||||
"auth": {
|
||||
"login": "Log in",
|
||||
"logout": "Logout",
|
||||
"username": "Username or email",
|
||||
"password": "Password",
|
||||
"authCode": "Authentication Code",
|
||||
"unlock": "Unlock",
|
||||
"unlocking": "Unlocking...",
|
||||
"loggingIn": "Logging in",
|
||||
"validatingCredentials": "Validating credentials",
|
||||
"syncingVault": "Syncing vault",
|
||||
"verifyingAuthCode": "Verifying authentication code",
|
||||
"verify": "Verify",
|
||||
"unlockVault": "Unlock Vault",
|
||||
"unlockWithPin": "Unlock with PIN",
|
||||
"enterPassword": "Enter your password to unlock your vault",
|
||||
"enterPasswordPlaceholder": "Password",
|
||||
"enterAuthCode": "Enter 6-digit code",
|
||||
"login": "Se connecter",
|
||||
"logout": "Se déconnecter",
|
||||
"username": "Nom d'utilisateur ou email",
|
||||
"password": "Mot de passe",
|
||||
"authCode": "Code d'authentification",
|
||||
"unlock": "Déverrouiller",
|
||||
"unlocking": "Déverrouillage...",
|
||||
"loggingIn": "Connexion en cours",
|
||||
"validatingCredentials": "Validation des identifiants",
|
||||
"syncingVault": "Synchronisation du coffre",
|
||||
"verifyingAuthCode": "Vérification du code d'authentification",
|
||||
"verify": "Vérifier",
|
||||
"unlockVault": "Déverrouiller le coffre",
|
||||
"unlockWithPin": "Déverrouiller avec un code PIN",
|
||||
"enterPassword": "Entrez votre mot de passe principal pour déverrouiller votre coffre-fort",
|
||||
"enterPasswordPlaceholder": "Mot de passe",
|
||||
"enterAuthCode": "Saisissez le code à 6 chiffres",
|
||||
"usernamePlaceholder": "nom / nom@entreprise.com",
|
||||
"passwordPlaceholder": "Enter your password",
|
||||
"enableBiometric": "Enable {{biometric}}?",
|
||||
"biometricPrompt": "Would you like to use {{biometric}} to unlock your vault?",
|
||||
"tryBiometricAgain": "Try {{biometric}} Again",
|
||||
"tryPinAgain": "Try PIN Again",
|
||||
"authCodeNote": "Note: if you don't have access to your authenticator device, you can reset your 2FA with a recovery code by logging in via the website.",
|
||||
"passwordPlaceholder": "Saisissez votre mot de passe",
|
||||
"enableBiometric": "Activer {{biometric}}?",
|
||||
"biometricPrompt": "Voulez-vous utiliser {{biometric}} pour déverrouiller votre coffre ?",
|
||||
"tryBiometricAgain": "Réessayez {{biometric}}",
|
||||
"tryPinAgain": "Réessayez le PIN",
|
||||
"authCodeNote": "Remarque : si vous n'avez pas accès à votre appareil d'authentification, vous pouvez réinitialiser votre authentification 2FA avec un code de récupération en vous connectant via le site web.",
|
||||
"errors": {
|
||||
"credentialsRequired": "Username and password are required",
|
||||
"invalidAuthCode": "Please enter a valid 6-digit authentication code",
|
||||
"credentialsRequired": "Le nom d'utilisateur et le mot de passe sont requis",
|
||||
"invalidAuthCode": "Veuillez entrer un code d'authentification à 6 chiffres valide",
|
||||
"incorrectPassword": "Mot de passe incorrect. Veuillez réessayer.",
|
||||
"enterPassword": "Please enter your password",
|
||||
"serverError": "Could not reach AliasVault server. Please try again later or contact support if the problem persists.",
|
||||
"serverErrorSelfHosted": "Could not reach the API. For self-hosted instances, please verify the API endpoint is reachable by navigating to it in a browser: it should display 'OK'.",
|
||||
"networkError": "Network request failed. Please check your internet connection and try again.",
|
||||
"networkErrorSelfHosted": "Network request failed. Check your network connection and server availability. For self-hosted instances, please ensure you have a valid SSL certificate installed. Self-signed certificates are not supported on mobile devices for security reasons.",
|
||||
"sessionExpired": "Your session has expired. Please login again.",
|
||||
"httpError": "HTTP error: {{status}}"
|
||||
"enterPassword": "Veuillez saisir votre mot de passe",
|
||||
"serverError": "Impossible d'accéder au serveur AliasVault. Veuillez réessayer plus tard ou contacter le support si le problème persiste.",
|
||||
"serverErrorSelfHosted": "Impossible d'atteindre l'API. Pour les instances auto-hébergées, veuillez vérifier que le point de terminaison de l'API est accessible en naviguant vers celui-ci dans un navigateur : il devrait afficher 'OK'.",
|
||||
"networkError": "Erreur réseau. Vérifiez votre connexion et réessayez.",
|
||||
"networkErrorSelfHosted": "La requête réseau a échoué. Vérifiez votre connexion réseau et la disponibilité du serveur. Pour les instances auto-hébergées, veuillez vous assurer que vous avez un certificat SSL valide. Les certificats auto-signés ne sont pas pris en charge pour des raisons de sécurité.",
|
||||
"sessionExpired": "Votre session a expiré. Veuillez vous reconnecter.",
|
||||
"httpError": "Erreur HTTP : {{status}}"
|
||||
},
|
||||
"confirmLogout": "Are you sure you want to logout? You need to login again with your master password to access your vault.",
|
||||
"confirmLogout": "Êtes-vous sûr de vouloir vous déconnecter ? Vous devez vous reconnecter avec votre mot de passe maître pour accéder à votre coffre.",
|
||||
"noAccountYet": "Pas encore de compte ?",
|
||||
"createNewVault": "Créer un nouveau coffre-fort",
|
||||
"connectingTo": "Connexion à",
|
||||
"loggedInAs": "Connecté en tant que"
|
||||
},
|
||||
"vault": {
|
||||
"syncingVault": "Syncing vault",
|
||||
"uploadingVaultToServer": "Uploading vault to server",
|
||||
"savingChangesToVault": "Saving changes to vault",
|
||||
"checkingForVaultUpdates": "Checking for vault updates",
|
||||
"executingOperation": "Executing operation...",
|
||||
"checkingVaultUpdates": "Checking vault updates",
|
||||
"syncingUpdatedVault": "Syncing updated vault",
|
||||
"syncingVault": "Synchronisation du coffre",
|
||||
"uploadingVaultToServer": "Envoi du coffre sur le serveur",
|
||||
"savingChangesToVault": "Enregistrement des modifications dans le coffre",
|
||||
"checkingForVaultUpdates": "Vérification des mises à jour du coffre",
|
||||
"executingOperation": "Exécution de l'opération...",
|
||||
"checkingVaultUpdates": "Vérification des mises à jour du coffre",
|
||||
"syncingUpdatedVault": "Synchronisation du coffre mis à jour",
|
||||
"errors": {
|
||||
"failedToGetEncryptedDatabase": "Failed to get encrypted database",
|
||||
"usernameNotFound": "Username not found",
|
||||
"vaultOutdated": "Your vault is outdated. Please login on the AliasVault website and follow the steps.",
|
||||
"failedToSyncVault": "Failed to sync vault",
|
||||
"versionNotSupported": "This version of the AliasVault mobile app is not supported by the server anymore. Please update your app to the latest version.",
|
||||
"serverVersionNotSupported": "The AliasVault server needs to be updated to a newer version in order to use this mobile app. Please contact support if you need help.",
|
||||
"failedToGetEncryptedDatabase": "Impossible d'obtenir la base de données chiffrée",
|
||||
"usernameNotFound": "Identifiant non trouvé",
|
||||
"vaultOutdated": "Votre coffre est obsolète. Veuillez vous connecter sur le site AliasVault et suivre les étapes.",
|
||||
"failedToSyncVault": "Échec de la synchronisation du coffre",
|
||||
"versionNotSupported": "Cette version de l'application mobile AliasVault n'est plus prise en charge par le serveur. Veuillez mettre à jour votre application vers la dernière version.",
|
||||
"serverVersionNotSupported": "Le serveur AliasVault doit être mis à jour vers une version plus récente afin d'utiliser cette application mobile. Veuillez contacter le support si vous avez besoin d'aide.",
|
||||
"appOutdated": "Cette application est obsolète et ne peut pas être utilisée pour accéder à cette (nouvelle) version du coffre. Veuillez mettre à jour l'application AliasVault pour continuer.",
|
||||
"passwordChanged": "Your password has changed since the last time you logged in. Please login again for security reasons."
|
||||
"passwordChanged": "Votre mot de passe a changé depuis la dernière fois que vous vous êtes connecté. Veuillez vous reconnecter pour des raisons de sécurité."
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"title": "Credentials",
|
||||
"addCredential": "Add Credential",
|
||||
"editCredential": "Edit Credential",
|
||||
"deleteCredential": "Delete Credential",
|
||||
"title": "Identifiants",
|
||||
"addCredential": "Ajouter un identifiant",
|
||||
"editCredential": "Modifier l'identifiant",
|
||||
"deleteCredential": "Supprimer l'identifiant",
|
||||
"deleteConfirm": "Êtes-vous sûr de vouloir supprimer ces identifiants ? Cette action est irréversible.",
|
||||
"service": "Service",
|
||||
"serviceName": "Nom du service",
|
||||
@@ -113,116 +113,116 @@
|
||||
"birthDate": "Date de naissance",
|
||||
"birthDatePlaceholder": "AAAA-MM-JJ",
|
||||
"notes": "Notes",
|
||||
"randomAlias": "Random Alias",
|
||||
"manual": "Manual",
|
||||
"generateRandomAlias": "Generate Random Alias",
|
||||
"clearAliasFields": "Clear Alias Fields",
|
||||
"enterFullEmail": "Enter full email address",
|
||||
"enterEmailPrefix": "Enter email prefix",
|
||||
"useDomainChooser": "Use domain chooser",
|
||||
"enterCustomDomain": "Enter custom domain",
|
||||
"selectEmailDomain": "Select Email Domain",
|
||||
"privateEmailTitle": "Private Email",
|
||||
"privateEmailAliasVaultServer": "AliasVault server",
|
||||
"privateEmailDescription": "E2E encrypted, fully private.",
|
||||
"publicEmailTitle": "Public Temp Email Providers",
|
||||
"publicEmailDescription": "Anonymous but limited privacy. Email content is readable by anyone that knows the address.",
|
||||
"searchPlaceholder": "Search vault...",
|
||||
"noMatchingCredentials": "No matching credentials found",
|
||||
"noCredentialsFound": "No credentials found. Create one to get started. Tip: you can also login to the AliasVault web app to import credentials from other password managers.",
|
||||
"noPasskeysFound": "No passkeys have been created yet. Passkeys are created by visiting a website that offers passkeys as an authentication method.",
|
||||
"noAttachmentsFound": "No credentials with attachments found",
|
||||
"recentEmails": "Recent emails",
|
||||
"loadingEmails": "Loading emails...",
|
||||
"noEmailsYet": "No emails received yet.",
|
||||
"offlineEmailsMessage": "You are offline. Please connect to the internet to load your emails.",
|
||||
"emailLoadError": "An error occurred while loading emails. Please try again later.",
|
||||
"emailUnexpectedError": "An unexpected error occurred while loading emails. Please try again later.",
|
||||
"password": "Password",
|
||||
"passwordLength": "Password Length",
|
||||
"changePasswordComplexity": "Password Settings",
|
||||
"includeLowercase": "Lowercase (a-z)",
|
||||
"includeUppercase": "Uppercase (A-Z)",
|
||||
"includeNumbers": "Numbers (0-9)",
|
||||
"includeSpecialChars": "Special Characters (!@#)",
|
||||
"avoidAmbiguousChars": "Avoid Ambiguous Characters",
|
||||
"deletingCredential": "Deleting credential...",
|
||||
"errorLoadingCredentials": "Error loading credentials",
|
||||
"vaultSyncFailed": "Vault sync failed",
|
||||
"vaultSyncedSuccessfully": "Vault synced successfully",
|
||||
"vaultUpToDate": "Vault is up-to-date",
|
||||
"offlineMessage": "You are offline. Please connect to the internet to sync your vault.",
|
||||
"credentialCreated": "Credential Created!",
|
||||
"credentialCreatedMessage": "Your new credential has been added to your vault and is ready to use.",
|
||||
"credentialDetails": "Credential Details",
|
||||
"emailPreview": "Email Preview",
|
||||
"switchBackToBrowser": "Switch back to your browser to continue.",
|
||||
"randomAlias": "Alias aléatoire",
|
||||
"manual": "Manuel",
|
||||
"generateRandomAlias": "Générer un alias aléatoire",
|
||||
"clearAliasFields": "Effacer les champs d'alias",
|
||||
"enterFullEmail": "Entrez l'adresse email complète",
|
||||
"enterEmailPrefix": "Entrez le préfixe de l'email",
|
||||
"useDomainChooser": "Utiliser le sélecteur de domaine",
|
||||
"enterCustomDomain": "Entrez le domaine personnalisé",
|
||||
"selectEmailDomain": "Sélectionner un domaine de messagerie",
|
||||
"privateEmailTitle": "E-mail privé",
|
||||
"privateEmailAliasVaultServer": "Serveur AliasVault",
|
||||
"privateEmailDescription": "E2E chiffré, entièrement privé.",
|
||||
"publicEmailTitle": "Fournisseurs d'email public temporaires",
|
||||
"publicEmailDescription": "Anonyme mais confidentiel limitée. Le contenu des e-mails est lisible par toute personne qui connaît l'adresse.",
|
||||
"searchPlaceholder": "Rechercher dans le coffre...",
|
||||
"noMatchingCredentials": "Aucun identifiant correspondant trouvé",
|
||||
"noCredentialsFound": "Aucun identifiant trouvé. Créez en un pour commencer. Astuce : vous pouvez également vous connecter à l'application web AliasVault pour importer les identifiants depuis d'autres gestionnaires de mots de passe.",
|
||||
"noPasskeysFound": "Aucune clé d'accès n'a encore été créée. Les clés d'accès sont créés en visitant un site Web qui propose des clés d'accès comme méthode d'authentification.",
|
||||
"noAttachmentsFound": "Aucun identifiant avec des pièces jointes trouvé",
|
||||
"recentEmails": "E-mails récents",
|
||||
"loadingEmails": "Chargement des e-mails...",
|
||||
"noEmailsYet": "Pas encore d'e-mails reçus.",
|
||||
"offlineEmailsMessage": "Vous êtes déconnecté. Veuillez vous connecter à internet pour charger vos e-mails.",
|
||||
"emailLoadError": "Une erreur s'est produite lors du chargement des e-mails. Veuillez réessayer plus tard.",
|
||||
"emailUnexpectedError": "Une erreur inattendue s'est produite lors du chargement des e-mails. Veuillez réessayer plus tard.",
|
||||
"password": "Mot de passe",
|
||||
"passwordLength": "Longueur du mot de passe",
|
||||
"changePasswordComplexity": "Paramètres du mot de passe",
|
||||
"includeLowercase": "Minuscules (a-z)",
|
||||
"includeUppercase": "Majuscules (A-Z)",
|
||||
"includeNumbers": "Nombres (0-9)",
|
||||
"includeSpecialChars": "Caractères spéciaux (!@#)",
|
||||
"avoidAmbiguousChars": "Éviter les caractères ambigus",
|
||||
"deletingCredential": "Suppression de l'identifiant...",
|
||||
"errorLoadingCredentials": "Erreur lors du chargement des identifiants",
|
||||
"vaultSyncFailed": "Échec de la synchronisation du coffre",
|
||||
"vaultSyncedSuccessfully": "Le coffre a été synchronisé avec succès",
|
||||
"vaultUpToDate": "Le coffre est à jour",
|
||||
"offlineMessage": "Vous êtes déconnecté. Veuillez vous connecter à internet pour synchroniser votre coffre.",
|
||||
"credentialCreated": "Identifiant créé!",
|
||||
"credentialCreatedMessage": "Votre nouvel identifiant a été ajouté à votre coffre et est prêt à être utilisé.",
|
||||
"credentialDetails": "Détails de l'identifiant",
|
||||
"emailPreview": "Aperçu de l'e-mail",
|
||||
"switchBackToBrowser": "Passez à votre navigateur pour continuer.",
|
||||
"filters": {
|
||||
"all": "(All) Credentials",
|
||||
"passkeys": "Passkeys",
|
||||
"aliases": "Aliases",
|
||||
"userpass": "Passwords",
|
||||
"attachments": "Attachments"
|
||||
"all": "(Tous les) Identifiants de connexion",
|
||||
"passkeys": "Clés d'accès",
|
||||
"aliases": "Alias",
|
||||
"userpass": "Mots de passe",
|
||||
"attachments": "Pièces jointes"
|
||||
},
|
||||
"twoFactorAuth": "Two-factor authentication",
|
||||
"totpCode": "TOTP Code",
|
||||
"attachments": "Attachments",
|
||||
"deleteAttachment": "Delete",
|
||||
"fileSavedTo": "File saved to",
|
||||
"previewNotSupported": "Preview not supported",
|
||||
"downloadToView": "Download the file to view it",
|
||||
"twoFactorAuth": "Authentification à deux facteurs",
|
||||
"totpCode": "Code à usage unique",
|
||||
"attachments": "Pièces jointes",
|
||||
"deleteAttachment": "Supprimer",
|
||||
"fileSavedTo": "Fichier enregistré sous",
|
||||
"previewNotSupported": "Aperçu non supporté",
|
||||
"downloadToView": "Télécharger le fichier pour le voir",
|
||||
"unsavedChanges": {
|
||||
"title": "Discard Changes?",
|
||||
"message": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"discard": "Discard"
|
||||
"title": "Annuler les modifications?",
|
||||
"message": "Vos modifications n'ont pas été enregistrées. Voulez-vous vraiment les ignorer ?",
|
||||
"discard": "Ignorer"
|
||||
},
|
||||
"toasts": {
|
||||
"credentialUpdated": "Credential updated successfully",
|
||||
"credentialCreated": "Credential created successfully",
|
||||
"credentialDeleted": "Credential deleted successfully",
|
||||
"usernameCopied": "Username copied to clipboard",
|
||||
"emailCopied": "Email copied to clipboard",
|
||||
"passwordCopied": "Password copied to clipboard"
|
||||
"credentialUpdated": "Identifiant mis à jour avec succès",
|
||||
"credentialCreated": "Identifiant créé avec succès",
|
||||
"credentialDeleted": "Identifiant supprimé avec succès",
|
||||
"usernameCopied": "Nom d'utilisateur copié dans le presse-papiers",
|
||||
"emailCopied": "E-mail copié dans le presse-papiers",
|
||||
"passwordCopied": "Mot de passe copié dans le presse-papiers"
|
||||
},
|
||||
"createNewAliasFor": "Create new alias for",
|
||||
"createNewAliasFor": "Créer un nouvel alias pour",
|
||||
"errors": {
|
||||
"loadFailed": "Failed to load credential",
|
||||
"saveFailed": "Failed to save credential"
|
||||
"loadFailed": "Échec du chargement de l'identifiant",
|
||||
"saveFailed": "Échec de l'enregistrement de l'identifiant"
|
||||
},
|
||||
"contextMenu": {
|
||||
"title": "Credential Options",
|
||||
"edit": "Edit",
|
||||
"delete": "Delete",
|
||||
"copyUsername": "Copy Username",
|
||||
"copyEmail": "Copy Email",
|
||||
"copyPassword": "Copy Password"
|
||||
"title": "Options de l'identifiant",
|
||||
"edit": "Modifier",
|
||||
"delete": "Supprimer",
|
||||
"copyUsername": "Copier le nom d'utilisateur",
|
||||
"copyEmail": "Copier l'e-mail",
|
||||
"copyPassword": "Copier le mot de passe"
|
||||
}
|
||||
},
|
||||
"passkeys": {
|
||||
"passkey": "Passkey",
|
||||
"passkey": "Clé d'identification",
|
||||
"site": "Site",
|
||||
"displayName": "Display Name",
|
||||
"helpText": "Passkeys are created on the website when prompted. They cannot be manually edited. To remove this passkey, you can delete it from this credential.",
|
||||
"passkeyMarkedForDeletion": "Passkey marked for deletion",
|
||||
"passkeyWillBeDeleted": "This passkey will be deleted when you save this credential."
|
||||
"displayName": "Nom affiché",
|
||||
"helpText": "Les clés d'accès sont créées sur le site Web lorsque vous y êtes invité. Elles ne peuvent pas être modifiées manuellement. Pour supprimer cette clé, vous pouvez la supprimer de cet identifiant.",
|
||||
"passkeyMarkedForDeletion": "Clé d'accès marquée pour suppression",
|
||||
"passkeyWillBeDeleted": "Cette clé d'accès sera supprimée lorsque vous enregistrerez cet identifiant."
|
||||
},
|
||||
"totp": {
|
||||
"addCode": "Add 2FA Code",
|
||||
"nameOptional": "Name (optional)",
|
||||
"secretKey": "Secret Key",
|
||||
"instructions": "Enter the secret key shown by the website where you want to add two-factor authentication.",
|
||||
"saveToViewCode": "Save to view code",
|
||||
"addCode": "Ajouter un code 2FA",
|
||||
"nameOptional": "Nom (facultatif)",
|
||||
"secretKey": "Clé secrète",
|
||||
"instructions": "Entrez la clé secrète affichée par le site Web où vous souhaitez ajouter l'authentification à deux facteurs.",
|
||||
"saveToViewCode": "Enregistrer pour afficher le code",
|
||||
"errors": {
|
||||
"invalidSecretKey": "Invalid secret key format."
|
||||
"invalidSecretKey": "Format de clé secrète invalide."
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settings",
|
||||
"autofill": "Autofill & Passkeys",
|
||||
"title": "Réglages",
|
||||
"autofill": "Remplissage automatique et clés d'accès",
|
||||
"iosAutofillSettings": {
|
||||
"headerText": "You can configure AliasVault to provide native password and passkey autofill functionality in iOS. Follow the instructions below to enable it.",
|
||||
"passkeyNotice": "Passkeys are created through iOS. To store them in AliasVault, ensure Autofill below is enabled.",
|
||||
"howToEnable": "How to enable Autofill & Passkeys:",
|
||||
"headerText": "Vous pouvez configurer AliasVault pour fournir des fonctionnalités natives de saisie automatique du mot de passe et de clés d'accès dans iOS. Suivez les instructions ci-dessous pour l'activer.",
|
||||
"passkeyNotice": "Les clés d'accès sont créées via iOS. Pour les stocker dans AliasVault, assurez-vous que le remplissage automatique ci-dessous est activé.",
|
||||
"howToEnable": "Comment activer le remplissage automatique et les clés d'accès :",
|
||||
"step1": "1. Ouvrir les paramètres d'iOS via le bouton ci-dessous",
|
||||
"step2": "2. Aller dans « Général »",
|
||||
"step3": "3. Appuyer sur « Remplissage automatique et mots de passe »",
|
||||
@@ -233,45 +233,45 @@
|
||||
"warningText": "Note : Vous devrez vous authentifier avec Face ID/Touch ID ou votre code d'accès lorsque vous utilisez le remplissage automatique."
|
||||
},
|
||||
"androidAutofillSettings": {
|
||||
"warningTitle": "⚠️ Experimental Feature",
|
||||
"warningDescription": "Autofill and passkey support for Android is currently in an experimental state.",
|
||||
"warningLink": "Read more about it here",
|
||||
"headerText": "You can configure AliasVault to provide native password and passkey autofill functionality in Android. Follow the instructions below to enable it.",
|
||||
"passkeyNotice": "Passkeys are created through Android Credential Manager (Android 14+). To store them in AliasVault, ensure Autofill below is enabled.",
|
||||
"howToEnable": "How to enable Autofill & Passkeys:",
|
||||
"step1": "1. Open Android Settings via the button below, and change the \"autofill preferred service\" to \"AliasVault\"",
|
||||
"openAutofillSettings": "Open Autofill Settings",
|
||||
"buttonTip": "If the button above doesn't work it might be blocked because of security settings. You can manually go to Android Settings → General Management → Passwords and autofill.",
|
||||
"step2": "2. Some apps, e.g. Google Chrome, may require manual configuration in their settings to allow third-party autofill apps. However, most apps should work with autofill by default.",
|
||||
"alreadyConfigured": "I already configured it",
|
||||
"advancedOptions": "Advanced Options",
|
||||
"showSearchText": "Show search text",
|
||||
"showSearchTextDescription": "Include the text AliasVault receives from Android that it uses to search for a matching credential"
|
||||
"warningTitle": "⚠️ Fonctionnalité expérimentale",
|
||||
"warningDescription": "Le remplissage automatique et la prise en charge de la clé d'accès pour Android sont actuellement dans un état expérimental.",
|
||||
"warningLink": "En savoir plus à ce sujet ici",
|
||||
"headerText": "Vous pouvez configurer AliasVault pour fournir le mot de passe natif et la fonctionnalité de saisie automatique du mot de passe dans Android. Suivez les instructions ci-dessous pour l'activer.",
|
||||
"passkeyNotice": "Les mots de passe sont créés via le gestionnaire d'identifiants Android (Android 14+). Pour les stocker dans AliasVault, assurez-vous que le remplissage automatique ci-dessous est activé.",
|
||||
"howToEnable": "Comment activer le remplissage automatique et les clés d'accès:",
|
||||
"step1": "1. Ouvrez les paramètres Android via le bouton ci-dessous, et changez le \"service préféré de saisie automatique\" par \"AliasVault\"",
|
||||
"openAutofillSettings": "Ouvrir les paramètres de remplissage automatique",
|
||||
"buttonTip": "Si le bouton ci-dessus ne fonctionne pas, il peut être bloqué en raison des paramètres de sécurité. Vous pouvez manuellement aller dans Réglages Android → Gestion Générale → Mots de passe et saisie automatique.",
|
||||
"step2": "2. Certaines applications, par exemple Google Chrome, peuvent nécessiter une configuration manuelle dans leurs paramètres pour permettre le remplissage automatique des applications tierces. Cependant, la plupart des applications devraient fonctionner avec le remplissage automatique par défaut.",
|
||||
"alreadyConfigured": "Je l'ai déjà configuré",
|
||||
"advancedOptions": "Options avancées",
|
||||
"showSearchText": "Afficher le texte de recherche",
|
||||
"showSearchTextDescription": "Inclure le texte que AliasVault reçoit d'Android qu'il utilise pour rechercher un identifiant correspondant"
|
||||
},
|
||||
"vaultUnlock": "Méthode de déverrouillage du coffre-fort",
|
||||
"autoLock": "Délai de verrouillage automatique",
|
||||
"clipboardClear": "Clear Clipboard",
|
||||
"clipboardClearDescription": "Automatically clear copied passwords and sensitive information from your clipboard after a specified time period.",
|
||||
"clipboardClearAndroidWarning": "Note: some Android devices have clipboard history enabled, which may keep track of previously copied items, even after AliasVault clears the clipboard. AliasVault can only overwrite the most recent item, but older entries may remain visible in history. For security reasons, we recommend disabling any clipboard history features in your device settings.",
|
||||
"clipboardClear": "Effacer le presse-papiers",
|
||||
"clipboardClearDescription": "Effacer automatiquement les mots de passe copiés et les informations sensibles du presse-papiers après une période donnée.",
|
||||
"clipboardClearAndroidWarning": "Remarque : certains appareils Android ont l'historique du presse-papiers activé, qui peut garder une trace des éléments précédemment copiés, même après que AliasVault a effacé le presse-papiers. AliasVault ne peut que remplacer l'élément le plus récent, mais les entrées plus anciennes peuvent rester visibles dans l'historique. Pour des raisons de sécurité, nous vous recommandons de désactiver toutes les fonctionnalités d'historique du presse-papiers dans les paramètres de votre appareil.",
|
||||
"clipboardClearOptions": {
|
||||
"never": "Never",
|
||||
"5seconds": "5 seconds",
|
||||
"10seconds": "10 seconds",
|
||||
"15seconds": "15 seconds",
|
||||
"30seconds": "30 seconds"
|
||||
"never": "Jamais",
|
||||
"5seconds": "5 secondes",
|
||||
"10seconds": "10 secondes",
|
||||
"15seconds": "15 secondes",
|
||||
"30seconds": "30 secondes"
|
||||
},
|
||||
"batteryOptimizationHelpTitle": "Enable Background Clipboard Clearing",
|
||||
"batteryOptimizationActive": "Battery optimization is blocking background tasks",
|
||||
"batteryOptimizationDisabled": "Background clipboard clearing enabled",
|
||||
"batteryOptimizationHelpDescription": "Android's battery optimization prevents reliable clipboard clearing when the app is in the background. Disabling battery optimization for AliasVault allows precise background clipboard clearing and automatically grants necessary alarm permissions.",
|
||||
"disableBatteryOptimization": "Disable battery optimization",
|
||||
"batteryOptimizationHelpTitle": "Activer le nettoyage du presse-papier en arrière-plan",
|
||||
"batteryOptimizationActive": "L'optimisation de la batterie bloque les tâches en arrière-plan",
|
||||
"batteryOptimizationDisabled": "Effacement du presse-papiers en arrière-plan activé",
|
||||
"batteryOptimizationHelpDescription": "L'optimisation de la batterie d'Android empêche le nettoyage fiable du presse-papiers lorsque l'application est en arrière-plan. La désactivation de l'optimisation de la batterie pour AliasVault permet un nettoyage précis du presse-papiers et accorde automatiquement les autorisations d'alarme nécessaires.",
|
||||
"disableBatteryOptimization": "Désactiver l'optimisation de la batterie",
|
||||
"identityGenerator": "Générateur d'identité",
|
||||
"passwordGenerator": "Password Generator",
|
||||
"importExport": "Import / Export",
|
||||
"importSectionTitle": "Import",
|
||||
"importSectionDescription": "Import your passwords from other password managers or from a previous AliasVault export.",
|
||||
"importWebNote": "To import credentials from existing password managers, please login to the web app. The import feature is currently only available on the web version.",
|
||||
"exportSectionTitle": "Export",
|
||||
"passwordGenerator": "Générateur de mot de passe",
|
||||
"importExport": "Importer / Exporter",
|
||||
"importSectionTitle": "Importer",
|
||||
"importSectionDescription": "Importez vos mots de passe depuis d'autres gestionnaires de mots de passe ou depuis un précédent export AliasVault.",
|
||||
"importWebNote": "Pour importer des informations d’identification à partir des gestionnaires de mots de passe existants, veuillez vous connecter à l’application Web. La fonction d’importation n’est actuellement disponible que sur la version web.",
|
||||
"exportSectionTitle": "Exporter",
|
||||
"exportSectionDescription": "Export your vault data to a CSV file. This file can be used as a back-up and can also be imported into other password managers.",
|
||||
"exportCsvButton": "Export vault to CSV file",
|
||||
"exporting": "Exporting...",
|
||||
@@ -415,7 +415,7 @@
|
||||
"invalidQrCode": "Invalid QR Code",
|
||||
"notAliasVaultQr": "This is not a valid AliasVault QR code. Please scan a QR code generated by AliasVault.",
|
||||
"cameraPermissionTitle": "Camera Permission Required",
|
||||
"cameraPermissionMessage": "Please allow camera access to scan QR codes.",
|
||||
"cameraPermissionMessage": "Veuillez autoriser l'accès à l'appareil photo pour scanner les QR codes.",
|
||||
"mobileLogin": {
|
||||
"confirmTitle": "Confirm Login Request",
|
||||
"confirmSubtitle": "Re-authenticate to approve login on another device.",
|
||||
@@ -493,7 +493,7 @@
|
||||
"status": {
|
||||
"unlockingVault": "Unlocking vault",
|
||||
"decryptingVault": "Decrypting vault",
|
||||
"openingVaultReadOnly": "Opening vault in read-only mode",
|
||||
"openingVaultReadOnly": "Ouvrir le coffre en mode lecture seule",
|
||||
"retryingConnection": "Retrying connection..."
|
||||
},
|
||||
"offline": {
|
||||
|
||||
@@ -173,8 +173,8 @@
|
||||
"downloadToView": "יש להוריד את הקובץ כדי לצפות בו",
|
||||
"unsavedChanges": {
|
||||
"title": "להתעלם מהשינויים?",
|
||||
"message": "You have unsaved changes. Are you sure you want to discard them?",
|
||||
"discard": "Discard"
|
||||
"message": "יש שינויים שלא נשמרו. לסלק אותם?",
|
||||
"discard": "סילוק"
|
||||
},
|
||||
"toasts": {
|
||||
"credentialUpdated": "פרטי הגישה עודכנו בהצלחה",
|
||||
@@ -208,8 +208,8 @@
|
||||
},
|
||||
"totp": {
|
||||
"addCode": "Add 2FA Code",
|
||||
"nameOptional": "Name (optional)",
|
||||
"secretKey": "Secret Key",
|
||||
"nameOptional": "שם (רשות)",
|
||||
"secretKey": "מפתח סודי",
|
||||
"instructions": "Enter the secret key shown by the website where you want to add two-factor authentication.",
|
||||
"saveToViewCode": "Save to view code",
|
||||
"errors": {
|
||||
@@ -328,8 +328,8 @@
|
||||
"languageDescription": "נא להגדיר את השפה שתשמש ליצירת זהויות חדשות.",
|
||||
"genderSection": "מגדר",
|
||||
"genderDescription": "להגדיר את אפשרויות המגדר ליצירת זהויות חדשות.",
|
||||
"ageRangeSection": "Age Range",
|
||||
"ageRangeDescription": "Set the age range for generating new identities.",
|
||||
"ageRangeSection": "טווח גילים",
|
||||
"ageRangeDescription": "הגדרת טווח גילים ליצירת זהויות חדשות.",
|
||||
"genderOptions": {
|
||||
"random": "אקראי",
|
||||
"male": "זכר",
|
||||
@@ -412,10 +412,10 @@
|
||||
"qrScanner": {
|
||||
"title": "QR Code Scanner",
|
||||
"scanningMessage": "Scan AliasVault QR code",
|
||||
"invalidQrCode": "Invalid QR Code",
|
||||
"invalidQrCode": "קוד QR שגוי",
|
||||
"notAliasVaultQr": "This is not a valid AliasVault QR code. Please scan a QR code generated by AliasVault.",
|
||||
"cameraPermissionTitle": "Camera Permission Required",
|
||||
"cameraPermissionMessage": "Please allow camera access to scan QR codes.",
|
||||
"cameraPermissionTitle": "נדרשת הרשאת מצלמה",
|
||||
"cameraPermissionMessage": "נא לאפשר גישה למצלמה כדי לסרוק קודים מסוג QR.",
|
||||
"mobileLogin": {
|
||||
"confirmTitle": "Confirm Login Request",
|
||||
"confirmSubtitle": "Re-authenticate to approve login on another device.",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 70;
|
||||
objectVersion = 60;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
@@ -212,7 +212,7 @@
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||
CEE9098F2DA548C7008D568F /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||
CEE9098F2DA548C7008D568F /* Exceptions for "Autofill" folder in "Autofill" target */ = {
|
||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||
membershipExceptions = (
|
||||
Info.plist,
|
||||
@@ -222,13 +222,84 @@
|
||||
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||
|
||||
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||
CE59C7602E4F47FD0024A246 /* VaultUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = VaultUITests; sourceTree = "<group>"; };
|
||||
CE77825E2EA1822400A75E6F /* VaultUtils */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = VaultUtils; sourceTree = "<group>"; };
|
||||
CEE480882DBE86DC00F4A367 /* VaultStoreKit */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = VaultStoreKit; sourceTree = "<group>"; };
|
||||
CEE480972DBE86DD00F4A367 /* VaultStoreKitTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = VaultStoreKitTests; sourceTree = "<group>"; };
|
||||
CEE4816B2DBE8AC800F4A367 /* VaultUI */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = VaultUI; sourceTree = "<group>"; };
|
||||
CEE482AB2DBE8EFE00F4A367 /* VaultModels */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = VaultModels; sourceTree = "<group>"; };
|
||||
CEE909812DA548C7008D568F /* Autofill */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (CEE9098F2DA548C7008D568F /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Autofill; sourceTree = "<group>"; };
|
||||
CE59C7602E4F47FD0024A246 /* VaultUITests */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = VaultUITests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CE77825E2EA1822400A75E6F /* VaultUtils */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = VaultUtils;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE480882DBE86DC00F4A367 /* VaultStoreKit */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = VaultStoreKit;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE480972DBE86DD00F4A367 /* VaultStoreKitTests */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = VaultStoreKitTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE4816B2DBE8AC800F4A367 /* VaultUI */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = VaultUI;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE482AB2DBE8EFE00F4A367 /* VaultModels */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = VaultModels;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CEE909812DA548C7008D568F /* Autofill */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
CEE9098F2DA548C7008D568F /* Exceptions for "Autofill" folder in "Autofill" target */,
|
||||
);
|
||||
explicitFileTypes = {
|
||||
};
|
||||
explicitFolders = (
|
||||
);
|
||||
path = Autofill;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXFileSystemSynchronizedRootGroup section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -716,7 +787,9 @@
|
||||
Base,
|
||||
de,
|
||||
en,
|
||||
es,
|
||||
fi,
|
||||
fr,
|
||||
he,
|
||||
nl,
|
||||
it,
|
||||
@@ -1226,7 +1299,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_BITCODE = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
@@ -1241,7 +1314,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-ObjC",
|
||||
@@ -1267,7 +1340,7 @@
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
INFOPLIST_FILE = AliasVault/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = AliasVault;
|
||||
@@ -1277,7 +1350,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
"-ObjC",
|
||||
@@ -1347,7 +1420,10 @@
|
||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_LDFLAGS = "$(inherited) ";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
" ",
|
||||
);
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
|
||||
@@ -1401,7 +1477,10 @@
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
OTHER_LDFLAGS = "$(inherited) ";
|
||||
OTHER_LDFLAGS = (
|
||||
"$(inherited)",
|
||||
" ",
|
||||
);
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
USE_HERMES = true;
|
||||
@@ -1422,7 +1501,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
@@ -1458,7 +1537,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
@@ -1492,7 +1571,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1549,7 +1628,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1602,7 +1681,7 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1655,7 +1734,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1704,7 +1783,7 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
@@ -1739,7 +1818,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
@@ -1772,7 +1851,7 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1825,7 +1904,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1874,7 +1953,7 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1926,7 +2005,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -1977,7 +2056,7 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_ENTITLEMENTS = autofill/autofill.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
@@ -1993,7 +2072,7 @@
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
|
||||
@@ -2022,7 +2101,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = autofill/autofill.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2501900;
|
||||
CURRENT_PROJECT_VERSION = 2503901;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 8PHW4HN3F7;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||
@@ -2038,7 +2117,7 @@
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MARKETING_VERSION = 0.25.1;
|
||||
MARKETING_VERSION = 0.25.3;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = net.aliasvault.app.autofill;
|
||||
|
||||
@@ -23,7 +23,9 @@
|
||||
<array>
|
||||
<string>de</string>
|
||||
<string>en</string>
|
||||
<string>es</string>
|
||||
<string>fi</string>
|
||||
<string>fr</string>
|
||||
<string>he</string>
|
||||
<string>it</string>
|
||||
<string>nl</string>
|
||||
|
||||
Binary file not shown.
@@ -6,7 +6,9 @@
|
||||
<array>
|
||||
<string>de</string>
|
||||
<string>en</string>
|
||||
<string>es</string>
|
||||
<string>fi</string>
|
||||
<string>fr</string>
|
||||
<string>he</string>
|
||||
<string>it</string>
|
||||
<string>nl</string>
|
||||
|
||||
Binary file not shown.
@@ -333,9 +333,9 @@ PODS:
|
||||
- FBLazyVector (0.79.6)
|
||||
- fmt (11.0.2)
|
||||
- glog (0.3.5)
|
||||
- hermes-engine (0.79.5):
|
||||
- hermes-engine/Pre-built (= 0.79.5)
|
||||
- hermes-engine/Pre-built (0.79.5)
|
||||
- hermes-engine (0.79.6):
|
||||
- hermes-engine/Pre-built (= 0.79.6)
|
||||
- hermes-engine/Pre-built (0.79.6)
|
||||
- Macaw (0.9.10):
|
||||
- SWXMLHash
|
||||
- OpenSSL-Universal (3.3.3001)
|
||||
@@ -2442,7 +2442,7 @@ PODS:
|
||||
- SQLite.swift (0.14.1):
|
||||
- SQLite.swift/standard (= 0.14.1)
|
||||
- SQLite.swift/standard (0.14.1)
|
||||
- SwiftLint (0.59.1)
|
||||
- SwiftLint (0.62.2)
|
||||
- SWXMLHash (7.0.2)
|
||||
- Yoga (0.0.0)
|
||||
|
||||
@@ -2795,8 +2795,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
boost: 1dca942403ed9342f98334bf4c3621f011aa7946
|
||||
DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
|
||||
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
|
||||
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
|
||||
EXConstants: 98bcf0f22b820f9b28f9fee55ff2daededadd2f8
|
||||
EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd
|
||||
EXManifests: 691a779b04e4f2c96da46fb9bef4f86174fefcb5
|
||||
@@ -2826,9 +2826,9 @@ SPEC CHECKSUMS:
|
||||
EXUpdatesInterface: 7ff005b7af94ee63fa452ea7bb95d7a8ff40277a
|
||||
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
|
||||
FBLazyVector: 07309209b7b914451b8f822544a18e2a0a85afff
|
||||
fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6
|
||||
glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
|
||||
hermes-engine: f03b0e06d3882d71e67e45b073bb827da1a21aae
|
||||
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
|
||||
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
|
||||
hermes-engine: 44bb6fe76a6eb400d3a992e2d0b21946ae999fa9
|
||||
Macaw: 7af8ea57aa2cab35b4a52a45e6f85eea753ea9ae
|
||||
OpenSSL-Universal: 6082b0bf950e5636fe0d78def171184e2b3899c2
|
||||
RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82
|
||||
@@ -2908,7 +2908,7 @@ SPEC CHECKSUMS:
|
||||
SignalArgon2: 1c24183835ca861e6af06631c18b1671cdf35571
|
||||
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
|
||||
SQLite.swift: 2992550ebf3c5b268bf4352603e3df87d2a4ed72
|
||||
SwiftLint: 3d48e2fb2a3468fdaccf049e5e755df22fb40c2c
|
||||
SwiftLint: f84fc7d844e9cde0dc4f5013af608a269e317aba
|
||||
SWXMLHash: dd733a457e9c4fe93b1538654057aefae4acb382
|
||||
Yoga: dc7c21200195acacb62fa920c588e7c2106de45e
|
||||
|
||||
|
||||
@@ -1,73 +1,73 @@
|
||||
/* English localization strings for VaultUI */
|
||||
"error" = "Error";
|
||||
"cancel" = "Cancel";
|
||||
"back" = "Back";
|
||||
"next" = "Next";
|
||||
"edit" = "Edit";
|
||||
"website" = "Website";
|
||||
"username" = "Username";
|
||||
"title" = "Title";
|
||||
"unknown_error" = "An unknown error occurred";
|
||||
"cancel" = "Cancelar";
|
||||
"back" = "Atrás";
|
||||
"next" = "Siguiente";
|
||||
"edit" = "Editar";
|
||||
"website" = "Sitio Web";
|
||||
"username" = "Usuario";
|
||||
"title" = "Título";
|
||||
"unknown_error" = "Se produjo un error desconocido";
|
||||
|
||||
"loading_credentials" = "Loading credentials...";
|
||||
"no_credentials_found" = "No credentials found";
|
||||
"no_credentials_match" = "No existing credentials match your search";
|
||||
"create_new_credential" = "Create New Credential";
|
||||
"select_credential" = "Select Credential";
|
||||
"select_text_to_insert" = "Select Text to Insert";
|
||||
"choose_username" = "Choose Username";
|
||||
"select_text_to_insert_message" = "Select the text to insert into the focused input field";
|
||||
"choose_username_message" = "This website may require either your username or your email address to log in";
|
||||
"username_prefix" = "Username: ";
|
||||
"loading_credentials" = "Cargando credenciales...";
|
||||
"no_credentials_found" = "No se encontraron credenciales";
|
||||
"no_credentials_match" = "No hay credenciales existentes que coincidan con su búsqueda";
|
||||
"create_new_credential" = "Crear nueva credencial";
|
||||
"select_credential" = "Seleccionar credencial";
|
||||
"select_text_to_insert" = "Seleccionar texto a insertar";
|
||||
"choose_username" = "Escoge un nombre de usuario";
|
||||
"select_text_to_insert_message" = "Seleccione el texto a insertar en el campo de entrada resaltado";
|
||||
"choose_username_message" = "Este sitio web puede requerir su nombre de usuario o correo electrónico para iniciar sesión";
|
||||
"username_prefix" = "Usuario: ";
|
||||
"email_prefix" = "Email: ";
|
||||
"password" = "Password";
|
||||
"credentials_load_error" = "Failed to load credentials. Please open the AliasVault app to check for updates.";
|
||||
"no_credential_selected" = "No credential selected.";
|
||||
"retrieving_credential" = "Retrieving credential";
|
||||
"retrieving_passkey" = "Retrieving passkey";
|
||||
"password" = "Contraseña";
|
||||
"credentials_load_error" = "Error al cargar las credenciales. Por favor, abre la aplicación AliasVault para buscar actualizaciones.";
|
||||
"no_credential_selected" = "Ninguna credencial seleccionada.";
|
||||
"retrieving_credential" = "Recuperar credencial";
|
||||
"retrieving_passkey" = "Recuperando llave";
|
||||
|
||||
/* Context menu strings */
|
||||
"copy_username" = "Copy Username";
|
||||
"copy_password" = "Copy Password";
|
||||
"copy_email" = "Copy Email";
|
||||
"view_details" = "View Details";
|
||||
"username_copied" = "Username copied";
|
||||
"password_copied" = "Password copied";
|
||||
"email_copied" = "Email copied";
|
||||
"copy_username" = "Copiar nombre de usuario";
|
||||
"copy_password" = "Copiar Contraseña";
|
||||
"copy_email" = "Copiar email";
|
||||
"view_details" = "Ver detalles";
|
||||
"username_copied" = "Usuario copiado";
|
||||
"password_copied" = "Contraseña copiada";
|
||||
"email_copied" = "Email copiado";
|
||||
|
||||
/* Search bar */
|
||||
"search_credentials" = "Search credentials...";
|
||||
"search_credentials" = "Buscar credenciales...";
|
||||
|
||||
/* Passkey registration */
|
||||
"create_passkey_title" = "Create New Passkey";
|
||||
"create_passkey_subtitle" = "Register a new passkey for this website. It will be securely stored in your vault and automatically synced across your devices with AliasVault.";
|
||||
"create_passkey_button_confirm" = "Create Passkey";
|
||||
"create_passkey_title" = "Crear Nueva llave";
|
||||
"create_passkey_subtitle" = "Registre una nueva llave de acceso para este sitio web. Se almacenará de forma segura en su bóveda y se sincronizará automáticamente en todos sus dispositivos con AliasVault.";
|
||||
"create_passkey_button_confirm" = "Crear llave de acceso";
|
||||
|
||||
/* Passkey provider */
|
||||
"passkey" = "Passkey";
|
||||
"loading_passkeys" = "Loading passkeys...";
|
||||
"no_passkeys_found" = "No passkeys found";
|
||||
"no_passkeys_match" = "No existing passkeys match your search";
|
||||
"select_passkey" = "Select Passkey";
|
||||
"passkeys_load_error" = "Failed to load passkeys. Please open the AliasVault app to check for updates.";
|
||||
"passkey" = "Llave de acceso";
|
||||
"loading_passkeys" = "Cargando llaves de acceso...";
|
||||
"no_passkeys_found" = "No se encontraron claves de acceso";
|
||||
"no_passkeys_match" = "Ninguna llave de acceso existente coincide con la búsqueda";
|
||||
"select_passkey" = "Seleccionar la clave de acceso";
|
||||
"passkeys_load_error" = "Error al cargar las credenciales. Por favor, abre la aplicación AliasVault para buscar actualizaciones.";
|
||||
|
||||
/* Passkey replacement */
|
||||
"create_new_passkey" = "Create New Passkey";
|
||||
"select_passkey_to_replace" = "Or, replace an existing passkey";
|
||||
"confirm_replace" = "Replace Passkey";
|
||||
"replace_passkey_title" = "Replace Passkey";
|
||||
"replace_passkey_explanation" = "This will replace the existing passkey with a new one. Please be aware that your old passkey will be overwritten and no longer accessible. If you wish to create a separate passkey instead, go back to the previous screen.";
|
||||
"create_passkey_explanation" = "This creates a new passkey and stores it in your vault. It will be automatically synced across all your devices that use AliasVault.";
|
||||
"create_new_passkey" = "Crear nueva llave de acceso";
|
||||
"select_passkey_to_replace" = "O, reemplazar una llave de acceso existente";
|
||||
"confirm_replace" = "Reemplazar llave de acceso";
|
||||
"replace_passkey_title" = "Reemplazar llave de acceso";
|
||||
"replace_passkey_explanation" = "Esto reemplazará la llave de acceso existente con una nueva. Tenga en cuenta que su llave de acceso antigua será sobrescrita y ya no será accesible. Si desea crear una llave de acceso separada en su lugar, vuelva a la pantalla anterior.";
|
||||
"create_passkey_explanation" = "Esto crea una nueva llave de acceso y la almacena en tu bóveda. Se sincronizará automáticamente en todos tus dispositivos que utilicen AliasVault.";
|
||||
|
||||
/* PIN Unlock */
|
||||
"unlock_vault" = "Unlock Vault";
|
||||
"enter_pin_to_unlock_vault" = "Enter your PIN to unlock your vault";
|
||||
"pin_locked_max_attempts" = "PIN locked after too many failed attempts";
|
||||
"pin_incorrect_attempts_remaining" = "Incorrect PIN. %d attempts remaining";
|
||||
"unlock_vault" = "Desbloquear bóveda";
|
||||
"enter_pin_to_unlock_vault" = "Introduzca su PIN para desbloquear su bóveda";
|
||||
"pin_locked_max_attempts" = "PIN bloqueado tras demasiados intentos fallidos";
|
||||
"pin_incorrect_attempts_remaining" = "PIN incorrecto, %d intentos restantes";
|
||||
|
||||
/* PIN Setup */
|
||||
"pin_setup_title" = "Setup PIN";
|
||||
"pin_setup_subtitle" = "Choose a PIN to unlock your vault";
|
||||
"pin_confirm_title" = "Confirm PIN";
|
||||
"pin_confirm_subtitle" = "Re-enter your PIN to confirm";
|
||||
"pin_mismatch" = "PINs do not match. Please try again.";
|
||||
"pin_setup_title" = "Configurar PIN";
|
||||
"pin_setup_subtitle" = "Elija un PIN para desbloquear su bóveda";
|
||||
"pin_confirm_title" = "Confirmar PIN";
|
||||
"pin_confirm_subtitle" = "Vuelva a introducir su PIN para confirmar";
|
||||
"pin_mismatch" = "Los PIN no coinciden. Por favor, inténtalo de nuevo.";
|
||||
|
||||
209
apps/mobile-app/package-lock.json
generated
209
apps/mobile-app/package-lock.json
generated
@@ -127,6 +127,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
|
||||
"integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/generator": "^7.28.3",
|
||||
@@ -4097,6 +4098,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.17.tgz",
|
||||
"integrity": "sha512-uEcYWi1NV+2Qe1oELfp9b5hTYekqWATv2cuwcOAg5EvsIsUPtzFrKIasgUXLBRGb9P7yR5ifoJ+ug4u6jdqSTQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@react-navigation/core": "^7.12.4",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
@@ -4376,6 +4378,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
|
||||
"integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.21.3",
|
||||
"@svgr/babel-preset": "8.1.0",
|
||||
@@ -4611,7 +4614,6 @@
|
||||
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/estree": "*",
|
||||
"@types/json-schema": "*"
|
||||
@@ -4623,7 +4625,6 @@
|
||||
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/eslint": "*",
|
||||
"@types/estree": "*"
|
||||
@@ -4754,6 +4755,7 @@
|
||||
"integrity": "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"csstype": "^3.0.2"
|
||||
}
|
||||
@@ -4871,6 +4873,7 @@
|
||||
"integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "8.43.0",
|
||||
"@typescript-eslint/types": "8.43.0",
|
||||
@@ -5401,7 +5404,6 @@
|
||||
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/helper-numbers": "1.13.2",
|
||||
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
|
||||
@@ -5412,24 +5414,21 @@
|
||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
|
||||
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-api-error": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
|
||||
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-buffer": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
|
||||
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-numbers": {
|
||||
"version": "1.13.2",
|
||||
@@ -5437,7 +5436,6 @@
|
||||
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
|
||||
"@webassemblyjs/helper-api-error": "1.13.2",
|
||||
@@ -5449,8 +5447,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
|
||||
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@webassemblyjs/helper-wasm-section": {
|
||||
"version": "1.14.1",
|
||||
@@ -5458,7 +5455,6 @@
|
||||
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||
@@ -5472,7 +5468,6 @@
|
||||
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@xtuc/ieee754": "^1.2.0"
|
||||
}
|
||||
@@ -5483,7 +5478,6 @@
|
||||
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@xtuc/long": "4.2.2"
|
||||
}
|
||||
@@ -5493,8 +5487,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
|
||||
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@webassemblyjs/wasm-edit": {
|
||||
"version": "1.14.1",
|
||||
@@ -5502,7 +5495,6 @@
|
||||
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||
@@ -5520,7 +5512,6 @@
|
||||
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
|
||||
@@ -5535,7 +5526,6 @@
|
||||
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||
@@ -5549,7 +5539,6 @@
|
||||
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@webassemblyjs/helper-api-error": "1.13.2",
|
||||
@@ -5565,7 +5554,6 @@
|
||||
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@webassemblyjs/ast": "1.14.1",
|
||||
"@xtuc/long": "4.2.2"
|
||||
@@ -5585,16 +5573,14 @@
|
||||
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
|
||||
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"peer": true
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/@xtuc/long": {
|
||||
"version": "4.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
|
||||
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/abab": {
|
||||
"version": "2.0.6",
|
||||
@@ -5643,6 +5629,7 @@
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
|
||||
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
@@ -5667,7 +5654,6 @@
|
||||
"integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
},
|
||||
@@ -5747,7 +5733,6 @@
|
||||
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"ajv": "^8.0.0"
|
||||
},
|
||||
@@ -5766,7 +5751,6 @@
|
||||
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"fast-uri": "^3.0.1",
|
||||
@@ -5783,8 +5767,7 @@
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/anser": {
|
||||
"version": "1.4.10",
|
||||
@@ -6433,24 +6416,24 @@
|
||||
}
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "1.20.3",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
|
||||
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
|
||||
"version": "1.20.4",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
|
||||
"integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"bytes": "~3.1.2",
|
||||
"content-type": "~1.0.5",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.13.0",
|
||||
"raw-body": "2.5.2",
|
||||
"destroy": "~1.2.0",
|
||||
"http-errors": "~2.0.1",
|
||||
"iconv-lite": "~0.4.24",
|
||||
"on-finished": "~2.4.1",
|
||||
"qs": "~6.14.0",
|
||||
"raw-body": "~2.5.3",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
"unpipe": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8",
|
||||
@@ -6467,6 +6450,27 @@
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/body-parser/node_modules/http-errors": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
|
||||
"integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"depd": "~2.0.0",
|
||||
"inherits": "~2.0.4",
|
||||
"setprototypeof": "~1.2.0",
|
||||
"statuses": "~2.0.2",
|
||||
"toidentifier": "~1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/express"
|
||||
}
|
||||
},
|
||||
"node_modules/body-parser/node_modules/ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
@@ -6474,6 +6478,16 @@
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/body-parser/node_modules/statuses": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
||||
"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/boolbase": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||
@@ -6542,6 +6556,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"caniuse-lite": "^1.0.30001737",
|
||||
"electron-to-chromium": "^1.5.211",
|
||||
@@ -6780,7 +6795,6 @@
|
||||
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
}
|
||||
@@ -7815,7 +7829,6 @@
|
||||
"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
@@ -8021,8 +8034,7 @@
|
||||
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
|
||||
"integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/es-object-atoms": {
|
||||
"version": "1.1.1",
|
||||
@@ -8138,6 +8150,7 @@
|
||||
"integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.8.0",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
@@ -8322,6 +8335,7 @@
|
||||
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rtsao/scc": "^1.1.0",
|
||||
"array-includes": "^3.1.9",
|
||||
@@ -8678,6 +8692,7 @@
|
||||
"resolved": "https://registry.npmjs.org/expo/-/expo-53.0.22.tgz",
|
||||
"integrity": "sha512-sJ2I4W/e5iiM4u/wYCe3qmW4D7WPCRqByPDD0hJcdYNdjc9HFFFdO4OAudZVyC/MmtoWZEIH5kTJP1cw9FjzYA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.0",
|
||||
"@expo/cli": "0.24.21",
|
||||
@@ -8763,6 +8778,7 @@
|
||||
"resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.1.7.tgz",
|
||||
"integrity": "sha512-byBjGsJ6T6FrLlhOBxw4EaiMXrZEn/MlUYIj/JAd+FS7ll5X/S4qVRbIimSJtdW47hXMq0zxPfJX6njtA56hHA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@expo/config": "~11.0.12",
|
||||
"@expo/env": "~1.0.7"
|
||||
@@ -8876,6 +8892,7 @@
|
||||
"resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.3.2.tgz",
|
||||
"integrity": "sha512-wUlMdpqURmQ/CNKK/+BIHkDA5nGjMqNlYmW0pJFXY/KE/OG80Qcavdu2sHsL4efAIiNGvYdBS10WztuQYU4X0A==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fontfaceobserver": "^2.1.0"
|
||||
},
|
||||
@@ -8926,6 +8943,7 @@
|
||||
"resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-7.1.7.tgz",
|
||||
"integrity": "sha512-ZJaH1RIch2G/M3hx2QJdlrKbYFUTOjVVW4g39hfxrE5bPX9xhZUYXqxqQtzMNl1ylAevw9JkgEfWbBWddbZ3UA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"expo-constants": "~17.1.7",
|
||||
"invariant": "^2.2.4"
|
||||
@@ -9208,8 +9226,7 @@
|
||||
"url": "https://opencollective.com/fastify"
|
||||
}
|
||||
],
|
||||
"license": "BSD-3-Clause",
|
||||
"peer": true
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/fast-xml-parser": {
|
||||
"version": "4.5.3",
|
||||
@@ -9733,8 +9750,7 @@
|
||||
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
|
||||
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"peer": true
|
||||
"license": "BSD-2-Clause"
|
||||
},
|
||||
"node_modules/glob/node_modules/brace-expansion": {
|
||||
"version": "2.0.2",
|
||||
@@ -10070,6 +10086,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.27.6"
|
||||
},
|
||||
@@ -10913,6 +10930,7 @@
|
||||
"integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jest/core": "^29.7.0",
|
||||
"@jest/types": "^29.6.3",
|
||||
@@ -11232,9 +11250,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/jest-expo/node_modules/react-server-dom-webpack": {
|
||||
"version": "19.0.0",
|
||||
"resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.0.0.tgz",
|
||||
"integrity": "sha512-hLug9KEXLc8vnU9lDNe2b2rKKDaqrp5gNiES4uyu2Up3FZfZJZmdwLFXlWzdA9gTB/6/cWduSB2K1Lfag2pSvw==",
|
||||
"version": "19.0.3",
|
||||
"resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.0.3.tgz",
|
||||
"integrity": "sha512-Ri1trzmT2G2ZTrummbbJca306MKyXpI8l4B7j1F8jGCjykUHCaojwtXBr/luEiRSFzQRkYBkH+wabfppP3x/IQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -11246,8 +11264,8 @@
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"react": "^19.0.3",
|
||||
"react-dom": "^19.0.3",
|
||||
"webpack": "^5.59.0"
|
||||
}
|
||||
},
|
||||
@@ -11256,8 +11274,7 @@
|
||||
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
|
||||
"integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/jest-get-type": {
|
||||
"version": "29.6.3",
|
||||
@@ -12311,7 +12328,6 @@
|
||||
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.11.5"
|
||||
}
|
||||
@@ -14369,13 +14385,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/qs": {
|
||||
"version": "6.13.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
|
||||
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
|
||||
"version": "6.14.1",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
|
||||
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
|
||||
"devOptional": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"side-channel": "^1.0.6"
|
||||
"side-channel": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
@@ -14445,7 +14461,6 @@
|
||||
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.1.0"
|
||||
}
|
||||
@@ -14460,21 +14475,52 @@
|
||||
}
|
||||
},
|
||||
"node_modules/raw-body": {
|
||||
"version": "2.5.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
||||
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
||||
"version": "2.5.3",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
|
||||
"integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"unpipe": "1.0.0"
|
||||
"bytes": "~3.1.2",
|
||||
"http-errors": "~2.0.1",
|
||||
"iconv-lite": "~0.4.24",
|
||||
"unpipe": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/raw-body/node_modules/http-errors": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
|
||||
"integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"depd": "~2.0.0",
|
||||
"inherits": "~2.0.4",
|
||||
"setprototypeof": "~1.2.0",
|
||||
"statuses": "~2.0.2",
|
||||
"toidentifier": "~1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/express"
|
||||
}
|
||||
},
|
||||
"node_modules/raw-body/node_modules/statuses": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
||||
"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/rc": {
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
||||
@@ -14504,6 +14550,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
|
||||
"integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -14562,6 +14609,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz",
|
||||
"integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
},
|
||||
@@ -14610,6 +14658,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.6.tgz",
|
||||
"integrity": "sha512-kvIWSmf4QPfY41HC25TR285N7Fv0Pyn3DAEK8qRL9dA35usSaxsJkHfw+VqnonqJjXOaoKCEanwudRAJ60TBGA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jest/create-cache-key-function": "^29.7.0",
|
||||
"@react-native/assets-registry": "0.79.6",
|
||||
@@ -14829,6 +14878,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.17.5.tgz",
|
||||
"integrity": "sha512-SxBK7wQfJ4UoWoJqQnmIC7ZjuNgVb9rcY5Xc67upXAFKftWg0rnkknTw6vgwnjRcvYThrjzUVti66XoZdDJGtw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/plugin-transform-arrow-functions": "^7.0.0-0",
|
||||
"@babel/plugin-transform-class-properties": "^7.0.0-0",
|
||||
@@ -14864,6 +14914,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz",
|
||||
"integrity": "sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"react": "*",
|
||||
"react-native": "*"
|
||||
@@ -14874,6 +14925,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.15.4.tgz",
|
||||
"integrity": "sha512-aKHPDScUbpQiZEG9eZssHdG5jEQs4yiJ8eMx6g81Ex/xU7DZkv3911enzdCb+v4eJE79X8waizY0ZhauZJQmrw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"react-freeze": "^1.0.0",
|
||||
"react-native-is-edge-to-edge": "^1.2.1",
|
||||
@@ -14889,6 +14941,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.11.2.tgz",
|
||||
"integrity": "sha512-+YfF72IbWQUKzCIydlijV1fLuBsQNGMT6Da2kFlo1sh+LE3BIm/2Q7AR1zAAR6L0BFLi1WaQPLfFUC9bNZpOmw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"css-select": "^5.1.0",
|
||||
"css-tree": "^1.1.3",
|
||||
@@ -14930,6 +14983,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.13.5.tgz",
|
||||
"integrity": "sha512-MfC2B+woL4Hlj2WCzcb1USySKk+SteXnUKmKktOk/H/AQy5+LuVdkPKm8SknJ0/RxaxhZ48WBoTRGaqgR137hw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"invariant": "2.2.4"
|
||||
@@ -15497,7 +15551,6 @@
|
||||
"integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"ajv": "^8.9.0",
|
||||
@@ -15536,7 +15589,6 @@
|
||||
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.3"
|
||||
},
|
||||
@@ -15549,8 +15601,7 @@
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/secure-remote-password": {
|
||||
"version": "0.3.0",
|
||||
@@ -15660,7 +15711,6 @@
|
||||
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"randombytes": "^2.1.0"
|
||||
}
|
||||
@@ -16710,7 +16760,6 @@
|
||||
"integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
@@ -16809,7 +16858,6 @@
|
||||
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/trace-mapping": "^0.3.25",
|
||||
"jest-worker": "^27.4.5",
|
||||
@@ -16845,7 +16893,6 @@
|
||||
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*",
|
||||
"merge-stream": "^2.0.0",
|
||||
@@ -16861,7 +16908,6 @@
|
||||
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
},
|
||||
@@ -17228,6 +17274,7 @@
|
||||
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
@@ -17591,7 +17638,6 @@
|
||||
"integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"glob-to-regexp": "^0.4.1",
|
||||
"graceful-fs": "^4.1.2"
|
||||
@@ -17625,7 +17671,6 @@
|
||||
"integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/eslint-scope": "^3.7.7",
|
||||
"@types/estree": "^1.0.8",
|
||||
@@ -17685,7 +17730,6 @@
|
||||
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"esrecurse": "^4.3.0",
|
||||
"estraverse": "^4.1.1"
|
||||
@@ -17700,7 +17744,6 @@
|
||||
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ export class AppInfo {
|
||||
/**
|
||||
* The current mobile app version. This should be updated with each release of the mobile app.
|
||||
*/
|
||||
public static readonly VERSION = '0.25.1';
|
||||
public static readonly VERSION = '0.25.3';
|
||||
|
||||
/**
|
||||
* The API version to send to the server (base semver without stage suffixes).
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
//-----------------------------------------------------------------------
|
||||
// <copyright file="RecentUsageAccountDeletions.cs" company="aliasvault">
|
||||
// Copyright (c) aliasvault. All rights reserved.
|
||||
// Licensed under the AGPLv3 license. See LICENSE.md file in the project root for full license information.
|
||||
// </copyright>
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
namespace AliasVault.Admin.Main.Models;
|
||||
|
||||
/// <summary>
|
||||
/// Model representing usernames with most account deletions in the last 30 days.
|
||||
/// </summary>
|
||||
public class RecentUsageAccountDeletions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the username.
|
||||
/// </summary>
|
||||
public string Username { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the number of account deletions for this username in the last 30 days.
|
||||
/// </summary>
|
||||
public int DeletionCount30d { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the date when the most recent account with this username was registered.
|
||||
/// </summary>
|
||||
public DateTime? LastRegistrationDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the date when the most recent account with this username was deleted.
|
||||
/// </summary>
|
||||
public DateTime? LastDeletionDate { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
//-----------------------------------------------------------------------
|
||||
// <copyright file="RecentUsageDeletionsByIp.cs" company="aliasvault">
|
||||
// Copyright (c) aliasvault. All rights reserved.
|
||||
// Licensed under the AGPLv3 license. See LICENSE.md file in the project root for full license information.
|
||||
// </copyright>
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
namespace AliasVault.Admin.Main.Models;
|
||||
|
||||
/// <summary>
|
||||
/// Model representing IP addresses with most account deletions in the last 30 days.
|
||||
/// </summary>
|
||||
public class RecentUsageDeletionsByIp
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the original IP address (for linking purposes).
|
||||
/// </summary>
|
||||
public string OriginalIpAddress { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the anonymized IP address.
|
||||
/// </summary>
|
||||
public string IpAddress { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the number of account deletions from this IP in the last 30 days.
|
||||
/// </summary>
|
||||
public int DeletionCount30d { get; set; }
|
||||
}
|
||||
@@ -31,4 +31,14 @@ public class RecentUsageStatistics
|
||||
/// Gets or sets the list of IP addresses with most mobile login requests in the last 72 hours.
|
||||
/// </summary>
|
||||
public List<RecentUsageMobileLogins> TopIpsByMobileLogins72h { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the list of IP addresses with most account deletions in the last 30 days.
|
||||
/// </summary>
|
||||
public List<RecentUsageDeletionsByIp> TopIpsByDeletions30d { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the list of usernames with most account deletions in the last 30 days.
|
||||
/// </summary>
|
||||
public List<RecentUsageAccountDeletions> TopUsernamesByDeletions30d { get; set; } = new();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
@using AliasVault.Admin.Main.Models
|
||||
@using AliasVault.RazorComponents.Tables
|
||||
|
||||
<div class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm dark:border-gray-700 sm:p-6 dark:bg-gray-800">
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">Top Usernames by Account Deletions (Last 30d)</h3>
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400">Usernames with the most account deletion events in the last 30 days</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (Data != null && Data.Any())
|
||||
{
|
||||
<div class="mb-3">
|
||||
<Paginator CurrentPage="@CurrentPage" PageSize="@PageSize" TotalRecords="@Data.Count" OnPageChanged="@HandlePageChanged" />
|
||||
</div>
|
||||
<div class="overflow-x-auto">
|
||||
<SortableTable Columns="@_tableColumns">
|
||||
@foreach (var deletion in PagedData)
|
||||
{
|
||||
<SortableTableRow>
|
||||
<SortableTableColumn IsPrimary="true">
|
||||
<a href="logging/auth?search=@Uri.EscapeDataString(deletion.Username)" class="text-gray-900 dark:text-gray-100 hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer">
|
||||
@deletion.Username
|
||||
</a>
|
||||
</SortableTableColumn>
|
||||
<SortableTableColumn>@deletion.DeletionCount30d.ToString("N0")</SortableTableColumn>
|
||||
<SortableTableColumn>
|
||||
@if (deletion.LastDeletionDate.HasValue)
|
||||
{
|
||||
<span>@deletion.LastDeletionDate.Value.ToString("yyyy-MM-dd HH:mm:ss") UTC</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-gray-400 dark:text-gray-500">-</span>
|
||||
}
|
||||
</SortableTableColumn>
|
||||
</SortableTableRow>
|
||||
}
|
||||
</SortableTable>
|
||||
</div>
|
||||
}
|
||||
else if (Data != null)
|
||||
{
|
||||
<div class="text-center text-gray-500 dark:text-gray-400">
|
||||
<svg class="mx-auto h-12 w-12 text-gray-300 dark:text-gray-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
<h3 class="mt-2 text-sm font-medium text-gray-900 dark:text-white">No Recent Account Deletions</h3>
|
||||
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400">No account deletions occurred in the last 30 days.</p>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="px-6 py-8 flex justify-center">
|
||||
<LoadingIndicator />
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public List<RecentUsageAccountDeletions>? Data { get; set; }
|
||||
|
||||
private int CurrentPage { get; set; } = 1;
|
||||
private int PageSize { get; set; } = 10;
|
||||
|
||||
private IEnumerable<RecentUsageAccountDeletions> PagedData =>
|
||||
Data?.Skip((CurrentPage - 1) * PageSize).Take(PageSize) ?? Enumerable.Empty<RecentUsageAccountDeletions>();
|
||||
|
||||
private readonly List<TableColumn> _tableColumns = new()
|
||||
{
|
||||
new() { Title = "Username", PropertyName = "Username", Sortable = false },
|
||||
new() { Title = "Deletions (30d)", PropertyName = "DeletionCount30d", Sortable = false },
|
||||
new() { Title = "Last Deletion", PropertyName = "LastDeletionDate", Sortable = false }
|
||||
};
|
||||
|
||||
private void HandlePageChanged(int page)
|
||||
{
|
||||
CurrentPage = page;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,7 @@
|
||||
public List<RecentUsageAliases>? Data { get; set; }
|
||||
|
||||
private int CurrentPage { get; set; } = 1;
|
||||
private int PageSize { get; set; } = 20;
|
||||
private int PageSize { get; set; } = 10;
|
||||
|
||||
private IEnumerable<RecentUsageAliases> PagedData =>
|
||||
Data?.Skip((CurrentPage - 1) * PageSize).Take(PageSize) ?? Enumerable.Empty<RecentUsageAliases>();
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
@using AliasVault.Admin.Main.Models
|
||||
@using AliasVault.RazorComponents.Tables
|
||||
|
||||
<div class="p-4 bg-white border border-gray-200 rounded-lg shadow-sm dark:border-gray-700 sm:p-6 dark:bg-gray-800">
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">Top IP Addresses by Account Deletions (Last 30d)</h3>
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400">IP addresses with the most account deletions in the last 30 days (last octet anonymized)</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (Data != null && Data.Any())
|
||||
{
|
||||
<div class="mb-3">
|
||||
<Paginator CurrentPage="@CurrentPage" PageSize="@PageSize" TotalRecords="@Data.Count" OnPageChanged="@HandlePageChanged" />
|
||||
</div>
|
||||
<div class="overflow-x-auto">
|
||||
<SortableTable Columns="@_tableColumns">
|
||||
@foreach (var ip in PagedData)
|
||||
{
|
||||
<SortableTableRow>
|
||||
<SortableTableColumn IsPrimary="true">
|
||||
<a href="logging/auth?search=@Uri.EscapeDataString(ip.OriginalIpAddress)" class="font-mono text-gray-900 dark:text-gray-100 hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer">
|
||||
@ip.IpAddress
|
||||
</a>
|
||||
</SortableTableColumn>
|
||||
<SortableTableColumn>@ip.DeletionCount30d.ToString("N0")</SortableTableColumn>
|
||||
</SortableTableRow>
|
||||
}
|
||||
</SortableTable>
|
||||
</div>
|
||||
}
|
||||
else if (Data != null)
|
||||
{
|
||||
<div class="text-center text-gray-500 dark:text-gray-400">
|
||||
<svg class="mx-auto h-12 w-12 text-gray-300 dark:text-gray-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
<h3 class="mt-2 text-sm font-medium text-gray-900 dark:text-white">No Recent Account Deletions</h3>
|
||||
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400">No account deletions occurred in the last 30 days.</p>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="px-6 py-8 flex justify-center">
|
||||
<LoadingIndicator />
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter]
|
||||
public List<RecentUsageDeletionsByIp>? Data { get; set; }
|
||||
|
||||
private int CurrentPage { get; set; } = 1;
|
||||
private int PageSize { get; set; } = 10;
|
||||
|
||||
private IEnumerable<RecentUsageDeletionsByIp> PagedData =>
|
||||
Data?.Skip((CurrentPage - 1) * PageSize).Take(PageSize) ?? Enumerable.Empty<RecentUsageDeletionsByIp>();
|
||||
|
||||
private readonly List<TableColumn> _tableColumns = new()
|
||||
{
|
||||
new() { Title = "IP Range", PropertyName = "IpAddress", Sortable = false },
|
||||
new() { Title = "Deletions (30d)", PropertyName = "DeletionCount30d", Sortable = false }
|
||||
};
|
||||
|
||||
private void HandlePageChanged(int page)
|
||||
{
|
||||
CurrentPage = page;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
@@ -61,7 +61,7 @@
|
||||
public List<RecentUsageEmails>? Data { get; set; }
|
||||
|
||||
private int CurrentPage { get; set; } = 1;
|
||||
private int PageSize { get; set; } = 20;
|
||||
private int PageSize { get; set; } = 10;
|
||||
|
||||
private IEnumerable<RecentUsageEmails> PagedData =>
|
||||
Data?.Skip((CurrentPage - 1) * PageSize).Take(PageSize) ?? Enumerable.Empty<RecentUsageEmails>();
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
public List<RecentUsageMobileLogins>? Data { get; set; }
|
||||
|
||||
private int CurrentPage { get; set; } = 1;
|
||||
private int PageSize { get; set; } = 20;
|
||||
private int PageSize { get; set; } = 10;
|
||||
|
||||
private IEnumerable<RecentUsageMobileLogins> PagedData =>
|
||||
Data?.Skip((CurrentPage - 1) * PageSize).Take(PageSize) ?? Enumerable.Empty<RecentUsageMobileLogins>();
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
public List<RecentUsageRegistrations>? Data { get; set; }
|
||||
|
||||
private int CurrentPage { get; set; } = 1;
|
||||
private int PageSize { get; set; } = 20;
|
||||
private int PageSize { get; set; } = 10;
|
||||
|
||||
private IEnumerable<RecentUsageRegistrations> PagedData =>
|
||||
Data?.Skip((CurrentPage - 1) * PageSize).Take(PageSize) ?? Enumerable.Empty<RecentUsageRegistrations>();
|
||||
|
||||
@@ -30,6 +30,12 @@
|
||||
|
||||
<!-- Top IP Addresses by Mobile Login Requests ---->
|
||||
<RecentUsageMobileLoginsTable Data="@_recentUsageStats?.TopIpsByMobileLogins72h" />
|
||||
|
||||
<!-- Top IP Addresses by Account Deletions ---->
|
||||
<RecentUsageDeletionsByIpTable Data="@_recentUsageStats?.TopIpsByDeletions30d" />
|
||||
|
||||
<!-- Top Usernames by Account Deletions ---->
|
||||
<RecentUsageAccountDeletionsTable Data="@_recentUsageStats?.TopUsernamesByDeletions30d" />
|
||||
</div>
|
||||
|
||||
@if (_loadingError)
|
||||
|
||||
@@ -218,11 +218,7 @@ else
|
||||
v.RevisionNumber,
|
||||
CredentialCount = v.CredentialsCount,
|
||||
}),
|
||||
EmailClaims = u.EmailClaims.Select(ec => new
|
||||
{
|
||||
ec.CreatedAt,
|
||||
ec.Address
|
||||
}),
|
||||
EmailClaimCount = u.EmailClaims.Count(),
|
||||
})
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
@@ -247,7 +243,7 @@ else
|
||||
IsInactive = isInactive,
|
||||
VaultCount = user.Vaults.Count(),
|
||||
CredentialCount = user.Vaults.OrderByDescending(x => x.RevisionNumber).First().CredentialCount,
|
||||
EmailClaimCount = user.EmailClaims.Count(),
|
||||
EmailClaimCount = user.EmailClaimCount,
|
||||
VaultStorageInKb = user.Vaults.Sum(x => x.FileSize),
|
||||
};
|
||||
}).ToList();
|
||||
|
||||
@@ -116,6 +116,8 @@ public class StatisticsService
|
||||
GetTopUsersByEmails72hAsync().ContinueWith(t => stats.TopUsersByEmails72h = t.Result),
|
||||
GetTopIpsByRegistrations72hAsync().ContinueWith(t => stats.TopIpsByRegistrations72h = t.Result),
|
||||
GetTopIpsByMobileLogins72hAsync().ContinueWith(t => stats.TopIpsByMobileLogins72h = t.Result),
|
||||
GetTopIpsByDeletions30dAsync().ContinueWith(t => stats.TopIpsByDeletions30d = t.Result),
|
||||
GetTopUsernamesByDeletions30dAsync().ContinueWith(t => stats.TopUsernamesByDeletions30d = t.Result),
|
||||
};
|
||||
|
||||
await Task.WhenAll(tasks);
|
||||
@@ -475,7 +477,7 @@ public class StatisticsService
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top 20 users by number of aliases created in the last 72 hours.
|
||||
/// Gets the top 100 users by number of aliases created in the last 72 hours.
|
||||
/// </summary>
|
||||
/// <returns>List of top users by recent aliases.</returns>
|
||||
private async Task<List<RecentUsageAliases>> GetTopUsersByAliases72hAsync()
|
||||
@@ -495,7 +497,7 @@ public class StatisticsService
|
||||
AliasCount72h = g.Count(),
|
||||
})
|
||||
.OrderByDescending(u => u.AliasCount72h)
|
||||
.Take(20)
|
||||
.Take(100)
|
||||
.ToListAsync();
|
||||
|
||||
return topUsers.Select(u => new RecentUsageAliases
|
||||
@@ -509,7 +511,7 @@ public class StatisticsService
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top 20 users by number of emails received in the last 72 hours.
|
||||
/// Gets the top 100 users by number of emails received in the last 72 hours.
|
||||
/// </summary>
|
||||
/// <returns>List of top users by recent emails.</returns>
|
||||
private async Task<List<RecentUsageEmails>> GetTopUsersByEmails72hAsync()
|
||||
@@ -529,7 +531,7 @@ public class StatisticsService
|
||||
EmailCount72h = g.Count(),
|
||||
})
|
||||
.OrderByDescending(u => u.EmailCount72h)
|
||||
.Take(20)
|
||||
.Take(100)
|
||||
.ToListAsync();
|
||||
|
||||
return topUsers.Select(u => new RecentUsageEmails
|
||||
@@ -543,7 +545,7 @@ public class StatisticsService
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top 20 IP addresses by number of registrations in the last 72 hours.
|
||||
/// Gets the top 100 IP addresses by number of registrations in the last 72 hours.
|
||||
/// </summary>
|
||||
/// <returns>List of top IP addresses by recent registrations.</returns>
|
||||
private async Task<List<RecentUsageRegistrations>> GetTopIpsByRegistrations72hAsync()
|
||||
@@ -565,7 +567,7 @@ public class StatisticsService
|
||||
RegistrationCount72h = g.Count(),
|
||||
})
|
||||
.OrderByDescending(ip => ip.RegistrationCount72h)
|
||||
.Take(20)
|
||||
.Take(100)
|
||||
.ToListAsync();
|
||||
|
||||
return topIps.Select(ip => new RecentUsageRegistrations
|
||||
@@ -577,7 +579,7 @@ public class StatisticsService
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top 20 IP addresses by number of mobile login requests in the last 72 hours.
|
||||
/// Gets the top 100 IP addresses by number of mobile login requests in the last 72 hours.
|
||||
/// </summary>
|
||||
/// <returns>List of top IP addresses by mobile login requests.</returns>
|
||||
private async Task<List<RecentUsageMobileLogins>> GetTopIpsByMobileLogins72hAsync()
|
||||
@@ -597,7 +599,7 @@ public class StatisticsService
|
||||
MobileLoginCount72h = g.Count(),
|
||||
})
|
||||
.OrderByDescending(ip => ip.MobileLoginCount72h)
|
||||
.Take(20)
|
||||
.Take(100)
|
||||
.ToListAsync();
|
||||
|
||||
return topIps.Select(ip => new RecentUsageMobileLogins
|
||||
@@ -607,4 +609,72 @@ public class StatisticsService
|
||||
MobileLoginCount72h = ip.MobileLoginCount72h,
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top 100 IP addresses by number of account deletions in the last 30 days.
|
||||
/// </summary>
|
||||
/// <returns>List of top IP addresses by recent account deletions.</returns>
|
||||
private async Task<List<RecentUsageDeletionsByIp>> GetTopIpsByDeletions30dAsync()
|
||||
{
|
||||
await using var context = await _contextFactory.CreateDbContextAsync();
|
||||
var cutoffDate = DateTime.UtcNow.AddDays(-30);
|
||||
|
||||
// Get account deletions by IP from auth logs (using AccountDeletion event type)
|
||||
var topIps = await context.AuthLogs
|
||||
.Where(al => al.Timestamp >= cutoffDate &&
|
||||
al.IpAddress != null &&
|
||||
al.IpAddress != "xxx.xxx.xxx.xxx" &&
|
||||
al.IsSuccess &&
|
||||
al.EventType == AuthEventType.AccountDeletion)
|
||||
.GroupBy(al => al.IpAddress)
|
||||
.Select(g => new
|
||||
{
|
||||
IpAddress = g.Key,
|
||||
DeletionCount30d = g.Count(),
|
||||
})
|
||||
.OrderByDescending(ip => ip.DeletionCount30d)
|
||||
.Take(100)
|
||||
.ToListAsync();
|
||||
|
||||
return topIps.Select(ip => new RecentUsageDeletionsByIp
|
||||
{
|
||||
OriginalIpAddress = ip.IpAddress!,
|
||||
IpAddress = AnonymizeIpAddress(ip.IpAddress!),
|
||||
DeletionCount30d = ip.DeletionCount30d,
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top 100 usernames by number of account deletions in the last 30 days.
|
||||
/// </summary>
|
||||
/// <returns>List of top usernames by recent account deletions.</returns>
|
||||
private async Task<List<RecentUsageAccountDeletions>> GetTopUsernamesByDeletions30dAsync()
|
||||
{
|
||||
await using var context = await _contextFactory.CreateDbContextAsync();
|
||||
var cutoffDate = DateTime.UtcNow.AddDays(-30);
|
||||
|
||||
// Get account deletions by username from auth logs (using AccountDeletion event type)
|
||||
var topUsernames = await context.AuthLogs
|
||||
.Where(al => al.Timestamp >= cutoffDate &&
|
||||
al.Username != null &&
|
||||
al.IsSuccess &&
|
||||
al.EventType == AuthEventType.AccountDeletion)
|
||||
.GroupBy(al => al.Username)
|
||||
.Select(g => new
|
||||
{
|
||||
Username = g.Key,
|
||||
DeletionCount30d = g.Count(),
|
||||
LastDeletionDate = g.Max(al => al.Timestamp),
|
||||
})
|
||||
.OrderByDescending(u => u.DeletionCount30d)
|
||||
.Take(100)
|
||||
.ToListAsync();
|
||||
|
||||
return topUsernames.Select(u => new RecentUsageAccountDeletions
|
||||
{
|
||||
Username = u.Username!,
|
||||
DeletionCount30d = u.DeletionCount30d,
|
||||
LastDeletionDate = u.LastDeletionDate,
|
||||
}).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,75 +117,75 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="REFRESH_TOKEN_REQUIRED" xml:space="preserve">
|
||||
<value>Refresh token is required.</value>
|
||||
<value>Se requiere actualizar el token.</value>
|
||||
</data>
|
||||
<data name="ACCOUNT_BLOCKED" xml:space="preserve">
|
||||
<value>Your account has been disabled. If you believe this is a mistake, please contact support.</value>
|
||||
<value>Tu cuenta ha sido desactivada. Si crees que esto es un error, ponte en contacto con soporte.</value>
|
||||
</data>
|
||||
<data name="INVALID_REFRESH_TOKEN" xml:space="preserve">
|
||||
<value>Invalid refresh token</value>
|
||||
<value>Token de actualización inválido</value>
|
||||
</data>
|
||||
<data name="PUBLIC_REGISTRATION_DISABLED" xml:space="preserve">
|
||||
<value>New account registration is currently disabled on this server. Please contact the administrator.</value>
|
||||
<value>El registro de nueva cuenta está actualmente deshabilitado en este servidor. Por favor, contacte con el administrador.</value>
|
||||
</data>
|
||||
<data name="USER_NOT_FOUND" xml:space="preserve">
|
||||
<value>Invalid username or password. Please try again.</value>
|
||||
<value>Nombre de usuario o contraseña no válidos. Por favor, inténtelo de nuevo.</value>
|
||||
</data>
|
||||
<data name="USERNAME_REQUIRED" xml:space="preserve">
|
||||
<value>Username is required.</value>
|
||||
<value>Se requiere un nombre de usuario.</value>
|
||||
</data>
|
||||
<data name="USERNAME_ALREADY_IN_USE" xml:space="preserve">
|
||||
<value>Username is already in use.</value>
|
||||
<value>El nombre de usuario ya está en uso.</value>
|
||||
</data>
|
||||
<data name="USERNAME_AVAILABLE" xml:space="preserve">
|
||||
<value>Username is available.</value>
|
||||
<value>El nombre de usuario está disponible.</value>
|
||||
</data>
|
||||
<data name="USERNAME_MISMATCH" xml:space="preserve">
|
||||
<value>Username does not match the current user.</value>
|
||||
<value>El nombre de usuario no coincide con el usuario actual.</value>
|
||||
</data>
|
||||
<data name="PASSWORD_MISMATCH" xml:space="preserve">
|
||||
<value>The provided password does not match your current password.</value>
|
||||
<value>La contraseña proporcionada no coincide con su contraseña actual.</value>
|
||||
</data>
|
||||
<data name="ACCOUNT_SUCCESSFULLY_DELETED" xml:space="preserve">
|
||||
<value>Account successfully deleted.</value>
|
||||
<value>Cuenta eliminada con éxito.</value>
|
||||
</data>
|
||||
<data name="USERNAME_EMPTY_OR_WHITESPACE" xml:space="preserve">
|
||||
<value>Username cannot be empty or whitespace.</value>
|
||||
<value>El nombre de usuario no puede estar vacío o en blanco.</value>
|
||||
</data>
|
||||
<data name="USERNAME_TOO_SHORT" xml:space="preserve">
|
||||
<value>Username too short: must be at least 3 characters long.</value>
|
||||
<value>Nombre de usuario demasiado corto: debe tener al menos 3 caracteres.</value>
|
||||
</data>
|
||||
<data name="USERNAME_TOO_LONG" xml:space="preserve">
|
||||
<value>Username too long: cannot be longer than 40 characters.</value>
|
||||
<value>Nombre de usuario demasiado largo: no puede tener más de 40 caracteres.</value>
|
||||
</data>
|
||||
<data name="USERNAME_INVALID_EMAIL" xml:space="preserve">
|
||||
<value>Invalid email address.</value>
|
||||
<value>Dirección de correo electrónico inválida.</value>
|
||||
</data>
|
||||
<data name="USERNAME_INVALID_CHARACTERS" xml:space="preserve">
|
||||
<value>Username is invalid, can only contain letters or digits.</value>
|
||||
<value>El nombre de usuario inválido, solo puede contener letras o dígitos.</value>
|
||||
</data>
|
||||
<data name="PENDING_MIGRATIONS" xml:space="preserve">
|
||||
<value>There are pending migrations. Please run 'dotnet ef database update' to apply them.</value>
|
||||
<value>Hay migraciones pendientes. Ejecute 'dotnet ef database update' para aplicarlas.</value>
|
||||
</data>
|
||||
<data name="INTERNAL_SERVER_ERROR" xml:space="preserve">
|
||||
<value>Internal server error</value>
|
||||
<value>Error interno del servidor</value>
|
||||
</data>
|
||||
<data name="VAULT_ERROR" xml:space="preserve">
|
||||
<value>The local vault is not up-to-date. Please synchronize your vault by refreshing the page and try again.</value>
|
||||
<value>La bóveda local no está actualizada. Por favor, sincronice su bóveda actualizando la página e inténtelo de nuevo.</value>
|
||||
</data>
|
||||
<data name="UNKNOWN_ERROR" xml:space="preserve">
|
||||
<value>An unknown error occurred. Please try again.</value>
|
||||
<value>Se ha producido un error desconocido. Por favor, inténtelo de nuevo.</value>
|
||||
</data>
|
||||
<data name="INVALID_AUTHENTICATOR_CODE" xml:space="preserve">
|
||||
<value>Invalid authenticator code. Please try again.</value>
|
||||
<value>Código de autenticación inválido. Por favor, inténtelo de nuevo.</value>
|
||||
</data>
|
||||
<data name="INVALID_RECOVERY_CODE" xml:space="preserve">
|
||||
<value>Invalid recovery code. Please try again.</value>
|
||||
<value>Código de recuperación inválido. Por favor, inténtelo de nuevo.</value>
|
||||
</data>
|
||||
<data name="VAULT_NOT_UP_TO_DATE" xml:space="preserve">
|
||||
<value>Your vault is not up-to-date. Please synchronize your vault and try again.</value>
|
||||
<value>Su bóveda no está actualizada. Por favor, sincronice su bóveda e inténtelo de nuevo.</value>
|
||||
</data>
|
||||
<data name="ACCOUNT_LOCKED" xml:space="preserve">
|
||||
<value>You have entered an incorrect password too many times and your account has now been locked out. You can try again in 30 minutes.</value>
|
||||
<value>Ha introducido una contraseña incorrecta demasiadas veces y su cuenta ha sido bloqueada. Puede intentarlo de nuevo en 30 minutos.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -60,114 +60,114 @@
|
||||
</resheader>
|
||||
<!-- Page titles -->
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Log in to AliasVault</value>
|
||||
<value>Iniciar sesión en AliasVault</value>
|
||||
<comment>Main login page title</comment>
|
||||
</data>
|
||||
<data name="TwoFactorAuthenticationTitle" xml:space="preserve">
|
||||
<value>Two-factor authentication</value>
|
||||
<value>Autenticación de doble factor</value>
|
||||
<comment>Title for 2FA step</comment>
|
||||
</data>
|
||||
<data name="RecoveryCodeVerificationTitle" xml:space="preserve">
|
||||
<value>Recovery code verification</value>
|
||||
<value>Verificación de código de recuperación</value>
|
||||
<comment>Title for recovery code step</comment>
|
||||
</data>
|
||||
<!-- Form labels -->
|
||||
<data name="UsernameOrEmailLabel" xml:space="preserve">
|
||||
<value>Your username or email</value>
|
||||
<value>Tu nombre de usuario o email</value>
|
||||
<comment>Label for username/email input field</comment>
|
||||
</data>
|
||||
<data name="PasswordLabel" xml:space="preserve">
|
||||
<value>Your password</value>
|
||||
<value>Tu contraseña</value>
|
||||
<comment>Label for password input field</comment>
|
||||
</data>
|
||||
<data name="AuthenticatorCodeLabel" xml:space="preserve">
|
||||
<value>Authenticator code</value>
|
||||
<value>Código de autentificación</value>
|
||||
<comment>Label for 2FA code input field</comment>
|
||||
</data>
|
||||
<data name="RecoveryCodeLabel" xml:space="preserve">
|
||||
<value>Recovery Code</value>
|
||||
<value>Código de recuperación</value>
|
||||
<comment>Label for recovery code input field</comment>
|
||||
</data>
|
||||
<data name="RememberMeLabel" xml:space="preserve">
|
||||
<value>Remember me</value>
|
||||
<value>Recordar mis datos</value>
|
||||
<comment>Label for remember me checkbox</comment>
|
||||
</data>
|
||||
<data name="RememberMachineLabel" xml:space="preserve">
|
||||
<value>Remember this machine</value>
|
||||
<value>Recordar este equipo</value>
|
||||
<comment>Label for remember machine checkbox</comment>
|
||||
</data>
|
||||
<!-- Buttons -->
|
||||
<data name="LoginButton" xml:space="preserve">
|
||||
<value>Log in</value>
|
||||
<value>Iniciar sesión</value>
|
||||
<comment>Login button text</comment>
|
||||
</data>
|
||||
<!-- Links -->
|
||||
<data name="LostPasswordLink" xml:space="preserve">
|
||||
<value>Lost Password?</value>
|
||||
<value>¿Perdiste contraseña?</value>
|
||||
<comment>Link text for password recovery</comment>
|
||||
</data>
|
||||
<data name="CreateNewVaultLink" xml:space="preserve">
|
||||
<value>Create new vault</value>
|
||||
<value>Crear nueva bóveda</value>
|
||||
<comment>Link text for creating a new vault</comment>
|
||||
</data>
|
||||
<data name="LoginWithRecoveryCodeLink" xml:space="preserve">
|
||||
<value>Log in with a recovery code instead.</value>
|
||||
<value>Iniciar sesión con un código de recuperación en su lugar.</value>
|
||||
<comment>Link text for logging in with recovery code</comment>
|
||||
</data>
|
||||
<data name="LoginWithAuthenticatorLink" xml:space="preserve">
|
||||
<value>Log in with an authenticator code instead.</value>
|
||||
<value>Iniciar sesión con un código de autenticación en su lugar.</value>
|
||||
<comment>Link text for logging in with authenticator</comment>
|
||||
</data>
|
||||
<data name="MobileDeviceLink" xml:space="preserve">
|
||||
<value>Log in using Mobile App</value>
|
||||
<value>Iniciar sesión con la aplicación móvil</value>
|
||||
<comment>Link text for mobile device login</comment>
|
||||
</data>
|
||||
<!-- Descriptions and help text -->
|
||||
<data name="TwoFactorAuthenticationDescription" xml:space="preserve">
|
||||
<value>Your login is protected with an authenticator app. Enter your authenticator code below.</value>
|
||||
<value>Su inicio de sesión está protegido con una aplicación de autenticación. Introduzca su código de autenticación abajo.</value>
|
||||
<comment>Description for 2FA step</comment>
|
||||
</data>
|
||||
<data name="RecoveryCodeDescription" xml:space="preserve">
|
||||
<value>You have requested to log in with a recovery code. A recovery code is a one-time code that can be used to log in to your account. Note that if you don't manually disable 2FA after login, you will be asked for an authenticator code again at the next login.</value>
|
||||
<value>Ha solicitado iniciar sesión con un código de recuperación. Un código de recuperación es un código de una sola vez que se puede utilizar para iniciar sesión en su cuenta. Tenga en cuenta que si no desactiva manualmente 2FA después de iniciar sesión, se le pedirá un código de autenticación de nuevo en el próximo inicio de sesión.</value>
|
||||
<comment>Description for recovery code step</comment>
|
||||
</data>
|
||||
<data name="NoAccountYetText" xml:space="preserve">
|
||||
<value>No account yet?</value>
|
||||
<value>¿Sin cuenta todavía?</value>
|
||||
<comment>Text before registration link</comment>
|
||||
</data>
|
||||
<data name="DontHaveAuthenticatorText" xml:space="preserve">
|
||||
<value>Don't have access to your authenticator device?</value>
|
||||
<value>¿No tienes acceso a tu dispositivo de autenticación?</value>
|
||||
<comment>Question text about not having access to authenticator</comment>
|
||||
</data>
|
||||
<data name="RegainedAccessText" xml:space="preserve">
|
||||
<value>Regained access to your authenticator device?</value>
|
||||
<value>¿Acceso recuperado al dispositivo de autenticación?</value>
|
||||
<comment>Question text about regaining access to authenticator</comment>
|
||||
</data>
|
||||
<!-- Loading and status messages -->
|
||||
<data name="LoggingInMessage" xml:space="preserve">
|
||||
<value>Logging in...</value>
|
||||
<value>Iniciando sesión...</value>
|
||||
<comment>Loading message during login process</comment>
|
||||
</data>
|
||||
<data name="VerifyingTwoFactorCodeMessage" xml:space="preserve">
|
||||
<value>Verifying 2FA code...</value>
|
||||
<value>Verificando código 2FA...</value>
|
||||
<comment>Loading message during 2FA verification</comment>
|
||||
</data>
|
||||
<data name="VerifyingRecoveryCodeMessage" xml:space="preserve">
|
||||
<value>Verifying recovery code...</value>
|
||||
<value>Verificando código de recuperación...</value>
|
||||
<comment>Loading message during recovery code verification</comment>
|
||||
</data>
|
||||
<!-- Error messages -->
|
||||
<data name="LoginErrorMessage" xml:space="preserve">
|
||||
<value>An error occurred while processing the login request. Try again (later).</value>
|
||||
<value>Se ha producido un error al procesar la solicitud de acceso. Inténtalo de nuevo (más tarde).</value>
|
||||
<comment>Generic login error message</comment>
|
||||
</data>
|
||||
<data name="LoginRequestErrorMessage" xml:space="preserve">
|
||||
<value>An error occurred while processing the login request.</value>
|
||||
<value>Se ha producido un error al procesar la solicitud de acceso.</value>
|
||||
<comment>Login request processing error message</comment>
|
||||
</data>
|
||||
<!-- Placeholders -->
|
||||
<data name="UsernamePlaceholder" xml:space="preserve">
|
||||
<value>name / name@company.com</value>
|
||||
<value>nombre / nombre@empresa.com</value>
|
||||
<comment>Placeholder text for username input</comment>
|
||||
</data>
|
||||
<data name="PasswordPlaceholder" xml:space="preserve">
|
||||
|
||||
@@ -60,57 +60,57 @@
|
||||
</resheader>
|
||||
<!-- Page title -->
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Create a new AliasVault account</value>
|
||||
<value>Crear una nueva cuenta de AliasVault</value>
|
||||
<comment>Main registration page title</comment>
|
||||
</data>
|
||||
<!-- Form labels -->
|
||||
<data name="UsernameOrEmailLabel" xml:space="preserve">
|
||||
<value>Your username or email</value>
|
||||
<value>Tu nombre de usuario o email</value>
|
||||
<comment>Label for username/email input field</comment>
|
||||
</data>
|
||||
<data name="PasswordLabel" xml:space="preserve">
|
||||
<value>Your password</value>
|
||||
<value>Tu contraseña</value>
|
||||
<comment>Label for password input field</comment>
|
||||
</data>
|
||||
<data name="ConfirmPasswordLabel" xml:space="preserve">
|
||||
<value>Confirm password</value>
|
||||
<value>Confirmar contraseña</value>
|
||||
<comment>Label for password confirmation input field</comment>
|
||||
</data>
|
||||
<!-- Terms and conditions -->
|
||||
<data name="AcceptTermsLabel" xml:space="preserve">
|
||||
<value>I accept the</value>
|
||||
<value>Acepto los</value>
|
||||
<comment>Text before terms and conditions link</comment>
|
||||
</data>
|
||||
<data name="TermsAndConditionsLink" xml:space="preserve">
|
||||
<value>Terms and Conditions</value>
|
||||
<value>Términos y Condiciones</value>
|
||||
<comment>Link text for terms and conditions</comment>
|
||||
</data>
|
||||
<!-- Buttons -->
|
||||
<data name="CreateAccountButton" xml:space="preserve">
|
||||
<value>Create account</value>
|
||||
<value>Crear cuenta</value>
|
||||
<comment>Create account button text</comment>
|
||||
</data>
|
||||
<!-- Links -->
|
||||
<data name="AlreadyRegisteredText" xml:space="preserve">
|
||||
<value>Already registered?</value>
|
||||
<value>¿Ya estás registrado?</value>
|
||||
<comment>Text before login link</comment>
|
||||
</data>
|
||||
<data name="LoginHereLink" xml:space="preserve">
|
||||
<value>Login here</value>
|
||||
<value>Iniciar sesión aquí</value>
|
||||
<comment>Link text for login page</comment>
|
||||
</data>
|
||||
<!-- Loading and status messages -->
|
||||
<data name="CreatingAccountMessage" xml:space="preserve">
|
||||
<value>Creating account...</value>
|
||||
<value>Creando cuenta...</value>
|
||||
<comment>Loading message during account creation</comment>
|
||||
</data>
|
||||
<data name="RegistrationErrorMessage" xml:space="preserve">
|
||||
<value>An error occurred during registration.</value>
|
||||
<value>Se ha producido un error durante el registro.</value>
|
||||
<comment>Generic registration error message</comment>
|
||||
</data>
|
||||
<!-- Placeholders -->
|
||||
<data name="UsernamePlaceholder" xml:space="preserve">
|
||||
<value>name / name@company.com</value>
|
||||
<value>nombre / nombre@empresa.com</value>
|
||||
<comment>Placeholder text for username input</comment>
|
||||
</data>
|
||||
<data name="PasswordPlaceholder" xml:space="preserve">
|
||||
|
||||
@@ -20,59 +20,59 @@
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<data name="WelcomeMessage">
|
||||
<value>Great! Now, let's set up your master password for AliasVault.</value>
|
||||
<value>¡Genial! Ahora, vamos a configurar su contraseña maestra para AliasVault.</value>
|
||||
<comment>Assistant welcome message for password setup step</comment>
|
||||
</data>
|
||||
<data name="ImportantNote">
|
||||
<value>Important: This master password will be used to encrypt your vault. It should be a long, complex string that you can remember. If you forget this password, your data will be permanently inaccessible.</value>
|
||||
<value>Importante: Esta contraseña maestra se utilizará para cifrar tu bóveda. Debería ser una cadena larga y compleja que puedas recordar. Si olvida esta contraseña, sus datos serán inaccesibles permanentemente.</value>
|
||||
<comment>Important warning about master password</comment>
|
||||
</data>
|
||||
<data name="SecurityPoint1">
|
||||
<value>Your master password never leaves your device</value>
|
||||
<value>Tu contraseña maestra nunca sale de tu dispositivo</value>
|
||||
<comment>First security point about password privacy</comment>
|
||||
</data>
|
||||
<data name="SecurityPoint2">
|
||||
<value>The server has no access to your unencrypted data</value>
|
||||
<value>El servidor no tiene acceso a tus datos no cifrados</value>
|
||||
<comment>Second security point about server access</comment>
|
||||
</data>
|
||||
<data name="SecurityPoint3">
|
||||
<value>Even the server admin cannot restore your access if you forget this password</value>
|
||||
<value>Incluso el administrador del servidor no puede restaurar su acceso si olvida esta contraseña</value>
|
||||
<comment>Third security point about password recovery</comment>
|
||||
</data>
|
||||
<data name="MasterPasswordLabel">
|
||||
<value>Master Password</value>
|
||||
<value>Contraseña Maestra</value>
|
||||
<comment>Label for master password field</comment>
|
||||
</data>
|
||||
<data name="MasterPasswordPlaceholder">
|
||||
<value>Enter your master password</value>
|
||||
<value>Ingrese su contraseña maestra</value>
|
||||
<comment>Placeholder for master password field</comment>
|
||||
</data>
|
||||
<data name="ConfirmMasterPasswordLabel">
|
||||
<value>Confirm Master Password</value>
|
||||
<value>Confirma tu Contraseña Maestra</value>
|
||||
<comment>Label for confirm password field</comment>
|
||||
</data>
|
||||
<data name="ConfirmMasterPasswordPlaceholder">
|
||||
<value>Confirm your master password</value>
|
||||
<value>Confirma tu contraseña maestra</value>
|
||||
<comment>Placeholder for confirm password field</comment>
|
||||
</data>
|
||||
<data name="ValidatingPasswordMessage">
|
||||
<value>Validating password...</value>
|
||||
<value>Validando contraseña...</value>
|
||||
<comment>Message shown while validating password</comment>
|
||||
</data>
|
||||
<data name="PasswordValidAndStrongMessage">
|
||||
<value>Password is valid and strong!</value>
|
||||
<value>¡Contraseña válida y fuerte!</value>
|
||||
<comment>Success message for valid password</comment>
|
||||
</data>
|
||||
<data name="PasswordTooShortError">
|
||||
<value>Master password must be at least 10 characters long.</value>
|
||||
<value>La contraseña maestra debe tener al menos 10 caracteres.</value>
|
||||
<comment>Error message for password too short</comment>
|
||||
</data>
|
||||
<data name="ConfirmPasswordPrompt">
|
||||
<value>Confirm your password by entering it again.</value>
|
||||
<value>Confirme su contraseña introduciéndola de nuevo.</value>
|
||||
<comment>Prompt to confirm password</comment>
|
||||
</data>
|
||||
<data name="PasswordsMismatchError">
|
||||
<value>Passwords do not match.</value>
|
||||
<value>Las contraseñas no coinciden.</value>
|
||||
<comment>Error message when passwords don't match</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -21,32 +21,32 @@
|
||||
</xsd:schema>
|
||||
<!-- Instructions -->
|
||||
<data name="PleaseReadAndAgree">
|
||||
<value>Please read and agree to the following terms and conditions before proceeding.</value>
|
||||
<value>Por favor, lea y acepte los siguientes términos y condiciones antes de continuar.</value>
|
||||
<comment>Instructions to read and agree to terms</comment>
|
||||
</data>
|
||||
<!-- Terms and Conditions title -->
|
||||
<data name="TermsAndConditionsTitle">
|
||||
<value>Terms and Conditions</value>
|
||||
<value>Términos y Condiciones</value>
|
||||
<comment>Title for the terms and conditions section</comment>
|
||||
</data>
|
||||
<!-- Terms content -->
|
||||
<data name="TermsContent">
|
||||
<value>AliasVault is designed to enhance your online security and protect your privacy. With AliasVault, you can create unique identities and email aliases for your various online accounts, helping you maintain control over your personal information and reduce the risk of identity theft.
|
||||
<value>AliasVault está diseñado para mejorar su seguridad en línea y proteger su privacidad. Con AliasVault, puede crear identidades únicas y alias de correo electrónico para sus diversas cuentas en línea, lo que le ayuda a mantener el control sobre su información personal y reducir el riesgo de robo de identidad.
|
||||
|
||||
By using AliasVault, you agree to the following terms:
|
||||
Al utilizar AliasVault, usted acepta los siguientes términos:
|
||||
|
||||
1. You will not use AliasVault for any illegal purposes, including but not limited to fraud, identity theft, or impersonating real individuals.
|
||||
1. No utilizará AliasVault para ningún fin ilegal, incluyendo, entre otros, el fraude, el robo de identidad o la suplantación de personas reales.
|
||||
|
||||
2. You are responsible for maintaining the confidentiality of your account and any aliases created through AliasVault.
|
||||
2. Usted es responsable de mantener la confidencialidad de su cuenta y de cualquier alias creado a través de AliasVault.
|
||||
|
||||
3. AliasVault reserves the right to terminate your account if we suspect any misuse or violation of these terms.
|
||||
3. AliasVault se reserva el derecho de cancelar su cuenta si sospechamos de cualquier uso indebido o violación de estos términos.
|
||||
|
||||
4. You understand that while AliasVault enhances your privacy, no system is completely foolproof, and you use the service at your own risk.</value>
|
||||
4. Usted entiende que, aunque AliasVault mejora su privacidad, ningún sistema es completamente infalible y utiliza el servicio bajo su propia responsabilidad.</value>
|
||||
<comment>Full terms and conditions content</comment>
|
||||
</data>
|
||||
<!-- Agreement checkbox -->
|
||||
<data name="AgreementCheckboxLabel">
|
||||
<value>I have read and agree to the Terms and Conditions</value>
|
||||
<value>He leído y acepto los Términos y Condiciones</value>
|
||||
<comment>Label for the agreement checkbox</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -21,46 +21,46 @@
|
||||
</xsd:schema>
|
||||
<!-- Assistant messages -->
|
||||
<data name="GreatNowLetsSetupUsername">
|
||||
<value>Great! Now, let's set up your username for AliasVault.</value>
|
||||
<value>¡Genial! Ahora, vamos a configurar tu nombre de usuario para AliasVault.</value>
|
||||
<comment>Assistant message about setting up username</comment>
|
||||
</data>
|
||||
<data name="EnterUsernameInstructions">
|
||||
<value>Please enter a username you'd like to use. This can be your email address or any unique name you prefer.</value>
|
||||
<value>Por favor, introduce un nombre de usuario que te gustaría usar. Esta puede ser tu dirección email o cualquier nombre único que prefieras.</value>
|
||||
<comment>Instructions for entering username</comment>
|
||||
</data>
|
||||
<data name="RememberUsernameNote">
|
||||
<value>Remember: This is what you'll use to log in later, so make sure it's something you'll remember!</value>
|
||||
<value>Recuerde: ¡Esto es lo que usarás para iniciar sesión más tarde, así que asegúrate de que es algo que recordarás!</value>
|
||||
<comment>Important note about remembering username</comment>
|
||||
</data>
|
||||
<!-- Form labels -->
|
||||
<data name="UsernameLabel">
|
||||
<value>Username</value>
|
||||
<value>Usuario</value>
|
||||
<comment>Label for username input field</comment>
|
||||
</data>
|
||||
<data name="UsernamePlaceholder">
|
||||
<value>Enter your desired username or email</value>
|
||||
<value>Introduce tu nombre de usuario o email</value>
|
||||
<comment>Placeholder text for username input</comment>
|
||||
</data>
|
||||
<!-- Validation messages -->
|
||||
<data name="ValidatingUsernameMessage">
|
||||
<value>Validating username...</value>
|
||||
<value>Validando nombre de usuario...</value>
|
||||
<comment>Message shown while validating username</comment>
|
||||
</data>
|
||||
<data name="UsernameAvailableMessage">
|
||||
<value>Username is available!</value>
|
||||
<value>¡El nombre de usuario está disponible!</value>
|
||||
<comment>Message shown when username is available</comment>
|
||||
</data>
|
||||
<data name="UsernameRequiredError">
|
||||
<value>Username is required.</value>
|
||||
<value>Se requiere un nombre de usuario.</value>
|
||||
<comment>Error message when username is empty</comment>
|
||||
</data>
|
||||
<data name="ServerCommunicationError">
|
||||
<value>An error occurred during communication with the AliasVault server.</value>
|
||||
<value>Se ha producido un error durante la comunicación con el servidor AliasVault.</value>
|
||||
<comment>Error message for server communication issues</comment>
|
||||
</data>
|
||||
<!-- Alt text -->
|
||||
<data name="AssistantAvatarAlt">
|
||||
<value>AliasVault Assistant</value>
|
||||
<value>Asistente de AliasVault</value>
|
||||
<comment>Alt text for assistant avatar image</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,7 +59,7 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="ClearClipboardButton" xml:space="preserve">
|
||||
<value>Clear Clipboard</value>
|
||||
<value>Limpiar portapapeles</value>
|
||||
<comment>Button text to manually clear clipboard immediately</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -59,55 +59,55 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="TwoFactorAuthenticationTitle" xml:space="preserve">
|
||||
<value>Two-factor authentication</value>
|
||||
<value>Autenticación de doble factor</value>
|
||||
<comment>Section title for 2FA codes</comment>
|
||||
</data>
|
||||
<data name="AddTotpCodeButton" xml:space="preserve">
|
||||
<value>Add TOTP Code</value>
|
||||
<value>Añadir código TOTP</value>
|
||||
<comment>Button text to add new TOTP code</comment>
|
||||
</data>
|
||||
<data name="AddTotpCodeDescription" xml:space="preserve">
|
||||
<value>Add a two-factor authenticator code</value>
|
||||
<value>Añadir un código de autenticación de doble factor</value>
|
||||
<comment>Description for adding TOTP codes</comment>
|
||||
</data>
|
||||
<data name="AddTotpCodeModalTitle" xml:space="preserve">
|
||||
<value>Add 2FA TOTP Code</value>
|
||||
<value>Añadir código TOTP 2FA</value>
|
||||
<comment>Modal title for adding TOTP code</comment>
|
||||
</data>
|
||||
<data name="CloseFormButton" xml:space="preserve">
|
||||
<value>Close form</value>
|
||||
<value>Cerrar formulario</value>
|
||||
<comment>Button to close the add TOTP form</comment>
|
||||
</data>
|
||||
<data name="TotpInstructions" xml:space="preserve">
|
||||
<value>If the website offers or requires 2FA for your account, copy the secret key or QR code URI and paste it below.</value>
|
||||
<value>Si el sitio web ofrece o requiere 2FA para su cuenta, copie la clave secreta o el código QR URI y péguelo a continuación.</value>
|
||||
<comment>Instructions for adding TOTP codes</comment>
|
||||
</data>
|
||||
<data name="NameOptionalLabel" xml:space="preserve">
|
||||
<value>Name (optional)</value>
|
||||
<value>Nombre (Opcional)</value>
|
||||
<comment>Label for optional name field</comment>
|
||||
</data>
|
||||
<data name="SecretKeyLabel" xml:space="preserve">
|
||||
<value>Secret Key</value>
|
||||
<value>Clave secreta</value>
|
||||
<comment>Label for secret key field</comment>
|
||||
</data>
|
||||
<data name="SecretKeyPlaceholder" xml:space="preserve">
|
||||
<value>Enter secret key (manual entry)</value>
|
||||
<value>Introducir clave secreta (entrada manual)</value>
|
||||
<comment>Placeholder text for secret key input</comment>
|
||||
</data>
|
||||
<data name="SaveButton" xml:space="preserve">
|
||||
<value>Save</value>
|
||||
<value>Guardar</value>
|
||||
<comment>Save button text</comment>
|
||||
</data>
|
||||
<data name="SaveToViewCodeMessage" xml:space="preserve">
|
||||
<value>Save to view code</value>
|
||||
<value>Guardar para ver el código</value>
|
||||
<comment>Message shown for unsaved TOTP codes</comment>
|
||||
</data>
|
||||
<data name="DeleteTotpCodeConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this TOTP code?</value>
|
||||
<value>¿Está seguro que desea eliminar este código TOTP?</value>
|
||||
<comment>Confirmation message for deleting TOTP code</comment>
|
||||
</data>
|
||||
<data name="DeleteTotpCodeTitle" xml:space="preserve">
|
||||
<value>Delete TOTP code</value>
|
||||
<value>Eliminar código TOTP</value>
|
||||
<comment>Title for delete TOTP code action</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,15 +59,15 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="TwoFactorAuthenticationTitle" xml:space="preserve">
|
||||
<value>Two-factor authentication</value>
|
||||
<value>Autenticación de doble factor</value>
|
||||
<comment>Section title for 2FA codes</comment>
|
||||
</data>
|
||||
<data name="NoTotpCodesMessage" xml:space="preserve">
|
||||
<value>No two-factor authenticator codes available</value>
|
||||
<value>No hay códigos de autenticación de doble factor disponibles</value>
|
||||
<comment>Message shown when no TOTP codes are configured</comment>
|
||||
</data>
|
||||
<data name="CopiedMessage" xml:space="preserve">
|
||||
<value>Copied!</value>
|
||||
<value>¡Copiado!</value>
|
||||
<comment>Feedback message when TOTP code is copied to clipboard</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,63 +59,63 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="FromLabel" xml:space="preserve">
|
||||
<value>From:</value>
|
||||
<value>De:</value>
|
||||
<comment>Email sender field label</comment>
|
||||
</data>
|
||||
<data name="ToLabel" xml:space="preserve">
|
||||
<value>To:</value>
|
||||
<value>Para:</value>
|
||||
<comment>Email recipient field label</comment>
|
||||
</data>
|
||||
<data name="DateLabel" xml:space="preserve">
|
||||
<value>Date:</value>
|
||||
<value>Fecha:</value>
|
||||
<comment>Email date field label</comment>
|
||||
</data>
|
||||
<data name="ActionsLabel" xml:space="preserve">
|
||||
<value>Actions:</value>
|
||||
<value>Acciones:</value>
|
||||
<comment>Email actions section label</comment>
|
||||
</data>
|
||||
<data name="DeleteButton" xml:space="preserve">
|
||||
<value>Delete</value>
|
||||
<value>Eliminar</value>
|
||||
<comment>Delete email button text</comment>
|
||||
</data>
|
||||
<data name="AttachmentsLabel" xml:space="preserve">
|
||||
<value>Attachments:</value>
|
||||
<value>Archivos adjuntos:</value>
|
||||
<comment>Email attachments section header</comment>
|
||||
</data>
|
||||
<data name="CloseButton" xml:space="preserve">
|
||||
<value>Close</value>
|
||||
<value>Cerrar</value>
|
||||
<comment>Close modal button text</comment>
|
||||
</data>
|
||||
<data name="DeleteEmailTitle" xml:space="preserve">
|
||||
<value>Delete Email</value>
|
||||
<value>Eliminar Email</value>
|
||||
<comment>Delete email confirmation dialog title</comment>
|
||||
</data>
|
||||
<data name="DeleteEmailConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this email? This action cannot be undone.</value>
|
||||
<value>¿Está seguro que desea eliminar este correo electrónico? Esta acción no se puede deshacer.</value>
|
||||
<comment>Delete email confirmation message</comment>
|
||||
</data>
|
||||
<data name="EmailDeletedSuccess" xml:space="preserve">
|
||||
<value>Email deleted successfully</value>
|
||||
<value>Correo eliminado exitosamente</value>
|
||||
<comment>Success message when email is deleted</comment>
|
||||
</data>
|
||||
<data name="EmailDeleteFailed" xml:space="preserve">
|
||||
<value>Failed to delete email</value>
|
||||
<value>Error al eliminar el correo</value>
|
||||
<comment>Error message when email deletion fails</comment>
|
||||
</data>
|
||||
<data name="GenericError" xml:space="preserve">
|
||||
<value>An error occurred</value>
|
||||
<value>Ha ocurrido un error</value>
|
||||
<comment>Generic error message</comment>
|
||||
</data>
|
||||
<data name="NoEmailBody" xml:space="preserve">
|
||||
<value>[This email has no body.]</value>
|
||||
<value>[Este email no tiene cuerpo.]</value>
|
||||
<comment>Message shown when email has no content</comment>
|
||||
</data>
|
||||
<data name="AttachmentDownloadFailed" xml:space="preserve">
|
||||
<value>Failed to download attachment</value>
|
||||
<value>Error al descargar el archivo adjunto</value>
|
||||
<comment>Error message when attachment download fails</comment>
|
||||
</data>
|
||||
<data name="AttachmentDownloadError" xml:space="preserve">
|
||||
<value>Error downloading attachment</value>
|
||||
<value>Error al descargar el archivo adjunto</value>
|
||||
<comment>Error message for attachment download error</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,63 +59,63 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="FromLabel" xml:space="preserve">
|
||||
<value>From:</value>
|
||||
<value>De:</value>
|
||||
<comment>Email sender field label</comment>
|
||||
</data>
|
||||
<data name="ToLabel" xml:space="preserve">
|
||||
<value>To:</value>
|
||||
<value>Para:</value>
|
||||
<comment>Email recipient field label</comment>
|
||||
</data>
|
||||
<data name="DateLabel" xml:space="preserve">
|
||||
<value>Date:</value>
|
||||
<value>Fecha:</value>
|
||||
<comment>Email date field label</comment>
|
||||
</data>
|
||||
<data name="CredentialLabel" xml:space="preserve">
|
||||
<value>Credential:</value>
|
||||
<value>Credencial:</value>
|
||||
<comment>Email credential field label</comment>
|
||||
</data>
|
||||
<data name="NoneValue" xml:space="preserve">
|
||||
<value>None</value>
|
||||
<value>Nada</value>
|
||||
<comment>No credential assigned value</comment>
|
||||
</data>
|
||||
<data name="AttachmentsLabel" xml:space="preserve">
|
||||
<value>Attachments:</value>
|
||||
<value>Archivos adjuntos:</value>
|
||||
<comment>Email attachments section header</comment>
|
||||
</data>
|
||||
<data name="SelectEmailMessage" xml:space="preserve">
|
||||
<value>Select an email to view its contents</value>
|
||||
<value>Seleccione un email para ver su contenido</value>
|
||||
<comment>Empty state message when no email is selected</comment>
|
||||
</data>
|
||||
<data name="DeleteEmailTitle" xml:space="preserve">
|
||||
<value>Delete Email</value>
|
||||
<value>Eliminar Email</value>
|
||||
<comment>Delete email confirmation dialog title</comment>
|
||||
</data>
|
||||
<data name="DeleteEmailConfirmation" xml:space="preserve">
|
||||
<value>Are you sure you want to delete this email? This action cannot be undone.</value>
|
||||
<value>¿Está seguro que desea eliminar este correo? Esta acción no se puede deshacer.</value>
|
||||
<comment>Delete email confirmation message</comment>
|
||||
</data>
|
||||
<data name="EmailDeletedSuccess" xml:space="preserve">
|
||||
<value>Email deleted successfully</value>
|
||||
<value>Correo eliminado correctamente</value>
|
||||
<comment>Success message when email is deleted</comment>
|
||||
</data>
|
||||
<data name="EmailDeleteFailed" xml:space="preserve">
|
||||
<value>Failed to delete email</value>
|
||||
<value>Error al eliminar el correo</value>
|
||||
<comment>Error message when email deletion fails</comment>
|
||||
</data>
|
||||
<data name="GenericError" xml:space="preserve">
|
||||
<value>An error occurred</value>
|
||||
<value>Ha ocurrido un error</value>
|
||||
<comment>Generic error message</comment>
|
||||
</data>
|
||||
<data name="NoEmailBody" xml:space="preserve">
|
||||
<value>[This email has no body.]</value>
|
||||
<value>[Este email no tiene cuerpo.]</value>
|
||||
<comment>Message shown when email has no content</comment>
|
||||
</data>
|
||||
<data name="AttachmentDownloadFailed" xml:space="preserve">
|
||||
<value>Failed to download attachment</value>
|
||||
<value>Error al descargar el archivo adjunto</value>
|
||||
<comment>Error message when attachment download fails</comment>
|
||||
</data>
|
||||
<data name="AttachmentDownloadError" xml:space="preserve">
|
||||
<value>Error downloading attachment</value>
|
||||
<value>Error descargando archivo adjunto</value>
|
||||
<comment>Error message for attachment download error</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,7 +59,7 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="NewEmailTooltip" xml:space="preserve">
|
||||
<value>New email</value>
|
||||
<value>Nuevo correo</value>
|
||||
<comment>Tooltip text for new email indicator</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,35 +59,35 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="EmailSectionTitle" xml:space="preserve">
|
||||
<value>Email</value>
|
||||
<value>Correo</value>
|
||||
<comment>Section title for email panel</comment>
|
||||
</data>
|
||||
<data name="AutoRefreshEnabledTooltip" xml:space="preserve">
|
||||
<value>Auto-refresh enabled</value>
|
||||
<value>Auto-refrescar activado</value>
|
||||
<comment>Tooltip for auto-refresh indicator</comment>
|
||||
</data>
|
||||
<data name="SubjectColumn" xml:space="preserve">
|
||||
<value>Subject</value>
|
||||
<value>Asunto</value>
|
||||
<comment>Table column header for email subject</comment>
|
||||
</data>
|
||||
<data name="DateColumn" xml:space="preserve">
|
||||
<value>Date</value>
|
||||
<value>Fecha</value>
|
||||
<comment>Table column header for email date</comment>
|
||||
</data>
|
||||
<data name="NoEmailsReceivedMessage" xml:space="preserve">
|
||||
<value>No emails received (yet).</value>
|
||||
<value>No se han recibido correos (aún).</value>
|
||||
<comment>Message when no emails are available</comment>
|
||||
</data>
|
||||
<data name="EmailAddressInUseError" xml:space="preserve">
|
||||
<value>The current chosen email address is already in use. Please change the email address by editing this credential.</value>
|
||||
<value>La dirección de correo electrónico elegida actualmente ya está en uso. Por favor, cambie la dirección de correo electrónico editando esta credencial.</value>
|
||||
<comment>Error message when email address is already in use</comment>
|
||||
</data>
|
||||
<data name="EmailLoadError" xml:space="preserve">
|
||||
<value>An error occurred while trying to load the emails. Please try to edit and save the credential entry to synchronize the database, then try again.</value>
|
||||
<value>Ocurrió un error mientras se trataba de cargar los correos electrónicos. Por favor, intente editar y guardar la entrada de credenciales para sincronizar la base de datos, y vuelva a intentarlo.</value>
|
||||
<comment>Error message when email loading fails</comment>
|
||||
</data>
|
||||
<data name="LoadMoreButton" xml:space="preserve">
|
||||
<value>Load more</value>
|
||||
<value>Cargar más</value>
|
||||
<comment>Button text to load more emails</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,31 +59,31 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="UseDomainChooserButton" xml:space="preserve">
|
||||
<value>Use domain chooser</value>
|
||||
<value>Usar selector de dominio</value>
|
||||
<comment>Button to switch back to domain chooser</comment>
|
||||
</data>
|
||||
<data name="EnterCustomDomainButton" xml:space="preserve">
|
||||
<value>Enter custom domain</value>
|
||||
<value>Introduzca dominio personalizado</value>
|
||||
<comment>Button to switch to custom domain entry</comment>
|
||||
</data>
|
||||
<data name="SelectEmailDomainTitle" xml:space="preserve">
|
||||
<value>Select Email Domain</value>
|
||||
<value>Seleccionar dominio de correo</value>
|
||||
<comment>Title of domain selection popup</comment>
|
||||
</data>
|
||||
<data name="PrivateEmailTitle" xml:space="preserve">
|
||||
<value>Private Email (AliasVault server)</value>
|
||||
<value>Correo privado (servidor AliasVault)</value>
|
||||
<comment>Title for private email domains section</comment>
|
||||
</data>
|
||||
<data name="PrivateEmailDescription" xml:space="preserve">
|
||||
<value>E2E encrypted, fully private.</value>
|
||||
<value>E2E cifrado, totalmente privado.</value>
|
||||
<comment>Description of private email domains</comment>
|
||||
</data>
|
||||
<data name="PublicEmailTitle" xml:space="preserve">
|
||||
<value>Public Temp Email Providers</value>
|
||||
<value>Proveedores de Correo Temporal Públicos</value>
|
||||
<comment>Title for public email domains section</comment>
|
||||
</data>
|
||||
<data name="PublicEmailDescription" xml:space="preserve">
|
||||
<value>Anonymous but limited privacy. Email content is readable by anyone that knows the address.</value>
|
||||
<value>Privacidad anónima pero limitada. Contenido de correo electrónico puede ser leído por cualquiera que conozca la dirección.</value>
|
||||
<comment>Description of public email domains</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,83 +59,83 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Reset Vault</value>
|
||||
<value>Restablecer bóveda</value>
|
||||
<comment>Page title</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbImportExport" xml:space="preserve">
|
||||
<value>Import / Export</value>
|
||||
<value>Importar / Exportar</value>
|
||||
<comment>Breadcrumb for import export</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbResetVault" xml:space="preserve">
|
||||
<value>Reset Vault</value>
|
||||
<value>Restablecer bóveda</value>
|
||||
<comment>Breadcrumb for reset vault</comment>
|
||||
</data>
|
||||
<data name="ResetVaultPleaseNote" xml:space="preserve">
|
||||
<value>Please note:</value>
|
||||
<value>Ten en cuenta:</value>
|
||||
<comment>Reset vault please note prefix</comment>
|
||||
</data>
|
||||
<data name="ResetVaultCredentialsDeletedNote" xml:space="preserve">
|
||||
<value>All encrypted credentials in your vault will be permanently deleted</value>
|
||||
<value>Todas las credenciales cifradas en tu bóveda serán eliminadas permanentemente</value>
|
||||
<comment>Reset vault note about credentials being deleted</comment>
|
||||
</data>
|
||||
<data name="ResetVaultEmailAliasesKeptNote" xml:space="preserve">
|
||||
<value>Your email aliases will be preserved and can be re-used after resetting your vault</value>
|
||||
<value>Sus alias de correo electrónico serán conservados y pueden ser reutilizados después de restablecer su bóveda</value>
|
||||
<comment>Reset vault note about email aliases being kept</comment>
|
||||
</data>
|
||||
<data name="ResetVaultSettingsKeptNote" xml:space="preserve">
|
||||
<value>Your account settings and preferences will be preserved</value>
|
||||
<value>Se conservarán los ajustes y preferencias de su cuenta</value>
|
||||
<comment>Reset vault note about settings being kept</comment>
|
||||
</data>
|
||||
<data name="ResetVaultIrreversibleNote" xml:space="preserve">
|
||||
<value>This action cannot be undone</value>
|
||||
<value>Esta acción no se puede deshacer</value>
|
||||
<comment>Reset vault note about action being irreversible</comment>
|
||||
</data>
|
||||
<data name="ResetVaultConfirmUsernameLabel" xml:space="preserve">
|
||||
<value>To continue, please type your username to confirm</value>
|
||||
<value>Para continuar, por favor escribe tu nombre de usuario para confirmar</value>
|
||||
<comment>Reset vault username confirmation label</comment>
|
||||
</data>
|
||||
<data name="ResetVaultContinueButton" xml:space="preserve">
|
||||
<value>Continue with vault reset</value>
|
||||
<value>Continuar con el restablecimiento de bóveda</value>
|
||||
<comment>Reset vault continue button</comment>
|
||||
</data>
|
||||
<data name="ResetVaultFinalWarning" xml:space="preserve">
|
||||
<value>Final warning: You are about to permanently delete all your credentials!</value>
|
||||
<value>Advertencia final: ¡Estás a punto de eliminar permanentemente todas tus credenciales!</value>
|
||||
<comment>Reset vault final warning message</comment>
|
||||
</data>
|
||||
<data name="ResetVaultDeletionIrreversibleNote" xml:space="preserve">
|
||||
<value>This deletion is irreversible and cannot be undone</value>
|
||||
<value>Esta acción es irreversible y no se puede deshacer</value>
|
||||
<comment>Reset vault final step irreversible note</comment>
|
||||
</data>
|
||||
<data name="ResetVaultEnterPasswordLabel" xml:space="preserve">
|
||||
<value>Enter your password to confirm</value>
|
||||
<value>Introduce tu contraseña para confirmar</value>
|
||||
<comment>Reset vault password confirmation label</comment>
|
||||
</data>
|
||||
<data name="ResetVaultConfirmButton" xml:space="preserve">
|
||||
<value>Reset my vault</value>
|
||||
<value>Restablecer bóveda</value>
|
||||
<comment>Reset vault final confirmation button</comment>
|
||||
</data>
|
||||
<data name="ResetVaultUsernameRequired" xml:space="preserve">
|
||||
<value>Username is required.</value>
|
||||
<value>Se requiere un nombre de usuario.</value>
|
||||
<comment>Reset vault username required error</comment>
|
||||
</data>
|
||||
<data name="ResetVaultUsernameDoesNotMatch" xml:space="preserve">
|
||||
<value>The username you entered does not match your account username.</value>
|
||||
<value>El nombre de usuario introducido no coincide con el nombre de usuario de su cuenta.</value>
|
||||
<comment>Reset vault username mismatch error</comment>
|
||||
</data>
|
||||
<data name="ResetVaultPasswordIncorrect" xml:space="preserve">
|
||||
<value>The password you entered is incorrect.</value>
|
||||
<value>La contraseña introducida es incorrecta.</value>
|
||||
<comment>Reset vault password incorrect error</comment>
|
||||
</data>
|
||||
<data name="ResetVaultProgressMessage" xml:space="preserve">
|
||||
<value>Resetting vault...</value>
|
||||
<value>Restableciendo bóveda...</value>
|
||||
<comment>Reset vault progress message</comment>
|
||||
</data>
|
||||
<data name="ResetVaultSuccessMessage" xml:space="preserve">
|
||||
<value>Your vault has been successfully reset. All credentials have been deleted and you can now start fresh.</value>
|
||||
<value>Tu bóveda se ha restablecido correctamente. Todas las credenciales han sido eliminadas y ahora puedes empezar a actualizar.</value>
|
||||
<comment>Reset vault success message</comment>
|
||||
</data>
|
||||
<data name="ResetVaultErrorMessage" xml:space="preserve">
|
||||
<value>An error occurred while resetting your vault. Please try again.</value>
|
||||
<value>Se ha producido un error al restablecer la bóveda. Por favor, inténtelo de nuevo.</value>
|
||||
<comment>Reset vault error message</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -60,55 +60,55 @@
|
||||
</resheader>
|
||||
<!-- Page title and breadcrumbs -->
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Change password</value>
|
||||
<value>Cambiar contraseña</value>
|
||||
<comment>Page title for the change password page</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbSecuritySettings" xml:space="preserve">
|
||||
<value>Security settings</value>
|
||||
<value>Ajustes de seguridad</value>
|
||||
<comment>Breadcrumb text for security settings</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbChangePassword" xml:space="preserve">
|
||||
<value>Change password</value>
|
||||
<value>Cambiar contraseña</value>
|
||||
<comment>Breadcrumb text for change password</comment>
|
||||
</data>
|
||||
<!-- Page description -->
|
||||
<data name="PageDescription" xml:space="preserve">
|
||||
<value>Changing your master password also changes the vault encryption keys. It is advised to periodically change your master password to keep your vaults secure.</value>
|
||||
<value>Cambiar su contraseña maestra también cambia las claves de cifrado de bóveda. Se recomienda cambiar periódicamente su contraseña maestra para mantener sus bóvedas seguras.</value>
|
||||
<comment>Description text explaining the password change process</comment>
|
||||
</data>
|
||||
<!-- Form labels -->
|
||||
<data name="CurrentPasswordLabel" xml:space="preserve">
|
||||
<value>Current Password</value>
|
||||
<value>Contraseña actual</value>
|
||||
<comment>Label for current password input field</comment>
|
||||
</data>
|
||||
<data name="NewPasswordLabel" xml:space="preserve">
|
||||
<value>New Password</value>
|
||||
<value>Nueva contraseña</value>
|
||||
<comment>Label for new password input field</comment>
|
||||
</data>
|
||||
<data name="ConfirmNewPasswordLabel" xml:space="preserve">
|
||||
<value>Confirm New Password</value>
|
||||
<value>Confirmar nueva contraseña</value>
|
||||
<comment>Label for confirm new password input field</comment>
|
||||
</data>
|
||||
<!-- Button text -->
|
||||
<data name="ChangePasswordButton" xml:space="preserve">
|
||||
<value>Change Password</value>
|
||||
<value>Cambiar contraseña</value>
|
||||
<comment>Button text for changing password</comment>
|
||||
</data>
|
||||
<!-- Loading and status messages -->
|
||||
<data name="ChangingPasswordMessage" xml:space="preserve">
|
||||
<value>Changing password...</value>
|
||||
<value>Cambiando contraseña...</value>
|
||||
<comment>Loading message displayed while changing password</comment>
|
||||
</data>
|
||||
<data name="PasswordChangedSuccessfully" xml:space="preserve">
|
||||
<value>Password changed successfully.</value>
|
||||
<value>Contraseña cambiada con éxito.</value>
|
||||
<comment>Success message after password change</comment>
|
||||
</data>
|
||||
<data name="FailedToInitiatePasswordChange" xml:space="preserve">
|
||||
<value>Failed to initiate the password change process.</value>
|
||||
<value>Error al iniciar el proceso de cambio de contraseña.</value>
|
||||
<comment>Error message when password change initiation fails</comment>
|
||||
</data>
|
||||
<data name="FailedToChangePassword" xml:space="preserve">
|
||||
<value>Failed to change password. Please refresh the page and try again.</value>
|
||||
<value>Error al cambiar la contraseña. Por favor, actualiza la página e inténtalo de nuevo.</value>
|
||||
<comment>Error message when password change fails</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -60,80 +60,80 @@
|
||||
</resheader>
|
||||
<!-- Page title and breadcrumbs -->
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Delete Account</value>
|
||||
<value>Eliminar cuenta</value>
|
||||
<comment>Page title for the delete account page</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbSecuritySettings" xml:space="preserve">
|
||||
<value>Security settings</value>
|
||||
<value>Ajustes de seguridad</value>
|
||||
<comment>Breadcrumb text for security settings</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbDeleteAccount" xml:space="preserve">
|
||||
<value>Delete Account</value>
|
||||
<value>Eliminar cuenta</value>
|
||||
<comment>Breadcrumb text for delete account</comment>
|
||||
</data>
|
||||
<!-- Warning messages -->
|
||||
<data name="PermanentActionWarning" xml:space="preserve">
|
||||
<value>Warning: This action is permanent and cannot be undone. All your data will be permanently deleted.</value>
|
||||
<value>Advertencia: Esta acción es permanente y no se puede deshacer. Todos tus datos serán eliminados permanentemente.</value>
|
||||
<comment>Warning message about permanent deletion</comment>
|
||||
</data>
|
||||
<data name="FinalWarning" xml:space="preserve">
|
||||
<value>Final warning: Enter your password to permanently delete your account.</value>
|
||||
<value>Advertencia final: Introduzca su contraseña para eliminar permanentemente su cuenta.</value>
|
||||
<comment>Final warning message before account deletion</comment>
|
||||
</data>
|
||||
<!-- Note sections -->
|
||||
<data name="PleaseNote" xml:space="preserve">
|
||||
<value>Please note:</value>
|
||||
<value>Ten en cuenta:</value>
|
||||
<comment>Header for note section</comment>
|
||||
</data>
|
||||
<data name="VaultsDeletedNote" xml:space="preserve">
|
||||
<value>All encrypted vaults which includes all of your credentials will be permanently deleted</value>
|
||||
<value>Todas las bóvedas cifradas que incluyen todas tus credenciales serán eliminadas permanentemente</value>
|
||||
<comment>Note about vault deletion</comment>
|
||||
</data>
|
||||
<data name="EmailAliasesOrphanedNote" xml:space="preserve">
|
||||
<value>Your email aliases will be orphaned and cannot be claimed by other users</value>
|
||||
<value>Tus alias de correo electrónico serán huérfanos y no podrán ser reclamados por otros usuarios</value>
|
||||
<comment>Note about email aliases being orphaned</comment>
|
||||
</data>
|
||||
<data name="AccountCannotBeRecoveredNote" xml:space="preserve">
|
||||
<value>Your account cannot be recovered after deletion</value>
|
||||
<value>Su cuenta no puede ser recuperada después de la eliminación</value>
|
||||
<comment>Note about account recovery</comment>
|
||||
</data>
|
||||
<data name="DeletionIrreversibleNote" xml:space="preserve">
|
||||
<value>Account deletion is irreversible and cannot be undone. Pressing the button below will delete your account immmediately and permanently.</value>
|
||||
<value>La eliminación de la cuenta es irreversible y no se puede deshacer. Al pulsar el botón de abajo se eliminará su cuenta de forma inmediata y de forma permanente.</value>
|
||||
<comment>Note about deletion being irreversible</comment>
|
||||
</data>
|
||||
<!-- Form labels -->
|
||||
<data name="ConfirmUsernameLabel" xml:space="preserve">
|
||||
<value>Confirm your username</value>
|
||||
<value>Confirma tu nombre de usuario</value>
|
||||
<comment>Label for username confirmation input field</comment>
|
||||
</data>
|
||||
<data name="EnterPasswordLabel" xml:space="preserve">
|
||||
<value>Enter your password</value>
|
||||
<value>Introduzca su contraseña</value>
|
||||
<comment>Label for password input field</comment>
|
||||
</data>
|
||||
<!-- Button text -->
|
||||
<data name="ContinueWithAccountDeletion" xml:space="preserve">
|
||||
<value>Continue with Account Deletion</value>
|
||||
<value>Continuar con la eliminación de la cuenta</value>
|
||||
<comment>Button text to continue with account deletion</comment>
|
||||
</data>
|
||||
<data name="DeleteMyAccount" xml:space="preserve">
|
||||
<value>Delete My Account</value>
|
||||
<value>Eliminar Mi Cuenta</value>
|
||||
<comment>Button text to delete account</comment>
|
||||
</data>
|
||||
<!-- Loading and status messages -->
|
||||
<data name="DeletingAccountMessage" xml:space="preserve">
|
||||
<value>Deleting account...</value>
|
||||
<value>Eliminando cuenta...</value>
|
||||
<comment>Loading message displayed while deleting account</comment>
|
||||
</data>
|
||||
<data name="UsernameRequired" xml:space="preserve">
|
||||
<value>Username is required</value>
|
||||
<value>Nombre de usuario requerido</value>
|
||||
<comment>Error message when username is not provided</comment>
|
||||
</data>
|
||||
<data name="UsernameDoesNotMatch" xml:space="preserve">
|
||||
<value>The username you entered does not match your current username. Please try again.</value>
|
||||
<value>El nombre de usuario introducido no coincide con su nombre de usuario actual. Por favor, inténtelo de nuevo.</value>
|
||||
<comment>Error message when username doesn't match</comment>
|
||||
</data>
|
||||
<data name="ErrorProcessingRequest" xml:space="preserve">
|
||||
<value>An error occurred while processing the request.</value>
|
||||
<value>Se ha producido un error al procesar la solicitud.</value>
|
||||
<comment>Generic error message for request processing</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -60,48 +60,48 @@
|
||||
</resheader>
|
||||
<!-- Page title and breadcrumbs -->
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Disable two-factor authentication</value>
|
||||
<value>Desactivar la autenticación de doble factor</value>
|
||||
<comment>Page title for the disable 2FA page</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbSecuritySettings" xml:space="preserve">
|
||||
<value>Security settings</value>
|
||||
<value>Ajustes de seguridad</value>
|
||||
<comment>Breadcrumb text for security settings</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbDisable2Fa" xml:space="preserve">
|
||||
<value>Disable two-factor authentication</value>
|
||||
<value>Desactivar la autenticación de doble factor</value>
|
||||
<comment>Breadcrumb text for disable 2FA</comment>
|
||||
</data>
|
||||
<!-- Page description -->
|
||||
<data name="PageDescription" xml:space="preserve">
|
||||
<value>Disabling two-factor authentication means you will be able to login with only your password.</value>
|
||||
<value>Desactivar la autenticación de doble factor significa que sólo podrá iniciar sesión con su contraseña.</value>
|
||||
<comment>Description text explaining what disabling 2FA means</comment>
|
||||
</data>
|
||||
<!-- Warning message -->
|
||||
<data name="WarningMessage" xml:space="preserve">
|
||||
<value>Please note: after disabling two-factor authentication any configured authenticator app(s) will stop working. When you want to re-enable two-factor authentication you will have to configure the authenticator app(s) again.</value>
|
||||
<value>Nota: después de desactivar la autenticación de dos factores, cualquier aplicación de autenticación configurada dejará de funcionar. Cuando quiera volver a habilitar la autenticación de doble factor, tendrá que configurar la(s) aplicación(es) de autenticación de nuevo.</value>
|
||||
<comment>Warning message about the consequences of disabling 2FA</comment>
|
||||
</data>
|
||||
<!-- Status message -->
|
||||
<data name="StatusMessage" xml:space="preserve">
|
||||
<value>Two factor authentication is currently enabled. Disable it in order to be able to access your vault with your password only.</value>
|
||||
<value>La autenticación de doble factor está activada. Desactívala para poder acceder a tu bóveda con tu contraseña únicamente.</value>
|
||||
<comment>Status message explaining current 2FA state</comment>
|
||||
</data>
|
||||
<!-- Button text -->
|
||||
<data name="ConfirmDisableButton" xml:space="preserve">
|
||||
<value>Confirm Disable Two-Factor Authentication</value>
|
||||
<value>Confirmar Desactivar Autenticación de Doble Factor</value>
|
||||
<comment>Button text to confirm disabling 2FA</comment>
|
||||
</data>
|
||||
<!-- Success and error messages -->
|
||||
<data name="TwoFactorDisabledSuccess" xml:space="preserve">
|
||||
<value>Two-factor authentication is now successfully disabled.</value>
|
||||
<value>La autenticación de doble factor se ha desactivado correctamente.</value>
|
||||
<comment>Success message when 2FA is disabled</comment>
|
||||
</data>
|
||||
<data name="FailedToDisable2Fa" xml:space="preserve">
|
||||
<value>Failed to disable two-factor authentication.</value>
|
||||
<value>Error al desactivar la autenticación de dos factores.</value>
|
||||
<comment>Error message when 2FA disable fails</comment>
|
||||
</data>
|
||||
<data name="TwoFactorNotEnabled" xml:space="preserve">
|
||||
<value>Two-factor authentication is not enabled.</value>
|
||||
<value>La autenticación de dos factores no está activada.</value>
|
||||
<comment>Error message when 2FA is not enabled</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -60,43 +60,43 @@
|
||||
</resheader>
|
||||
<!-- Page title and breadcrumbs -->
|
||||
<data name="PageTitle" xml:space="preserve">
|
||||
<value>Enable two-factor authentication</value>
|
||||
<value>Habilitar la autenticación en dos pasos</value>
|
||||
<comment>Page title for the enable 2FA page</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbSecuritySettings" xml:space="preserve">
|
||||
<value>Security settings</value>
|
||||
<value>Ajustes de seguridad</value>
|
||||
<comment>Breadcrumb text for security settings</comment>
|
||||
</data>
|
||||
<data name="BreadcrumbEnable2Fa" xml:space="preserve">
|
||||
<value>Enable two-factor authentication</value>
|
||||
<value>Habilitar la autenticación en dos pasos</value>
|
||||
<comment>Breadcrumb text for enable 2FA</comment>
|
||||
</data>
|
||||
<!-- Page description -->
|
||||
<data name="PageDescription" xml:space="preserve">
|
||||
<value>Enable two-factor authentication to increase the security of your vaults.</value>
|
||||
<value>Habilitar autenticación de doble factor para aumentar la seguridad de sus bóvedas.</value>
|
||||
<comment>Description text explaining 2FA setup</comment>
|
||||
</data>
|
||||
<!-- Setup instructions -->
|
||||
<data name="QrCodeInstructions" xml:space="preserve">
|
||||
<value>Scan this QR code with your authenticator app or enter the following secret manually:</value>
|
||||
<value>Escanea este código QR con tu aplicación de autenticación o introduce el siguiente secreto manualmente:</value>
|
||||
<comment>Instructions for scanning QR code or entering secret</comment>
|
||||
</data>
|
||||
<!-- Form elements -->
|
||||
<data name="VerificationCodePlaceholder" xml:space="preserve">
|
||||
<value>Enter verification code</value>
|
||||
<value>Introduzca el código de verificación</value>
|
||||
<comment>Placeholder text for verification code input</comment>
|
||||
</data>
|
||||
<data name="VerifyAndEnableButton" xml:space="preserve">
|
||||
<value>Verify and Enable</value>
|
||||
<value>Verificar y Habilitar</value>
|
||||
<comment>Button text to verify and enable 2FA</comment>
|
||||
</data>
|
||||
<!-- Success and error messages -->
|
||||
<data name="TwoFactorEnabledSuccess" xml:space="preserve">
|
||||
<value>Two-factor authentication is now successfully enabled. On your next login you will need to enter your 2FA code.</value>
|
||||
<value>La autenticación de doble factor está habilitada con éxito. En su próximo inicio de sesión necesitará introducir su código 2FA.</value>
|
||||
<comment>Success message when 2FA is enabled</comment>
|
||||
</data>
|
||||
<data name="FailedToEnable2Fa" xml:space="preserve">
|
||||
<value>Failed to enable two-factor authentication.</value>
|
||||
<value>Error al habilitar la autenticación de dos factores.</value>
|
||||
<comment>Error message when 2FA setup fails</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -20,15 +20,15 @@
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<data name="PasswordGeneratorSettingsLabel">
|
||||
<value>Default password generator settings</value>
|
||||
<value>Configuración predeterminada del generador de contraseñas</value>
|
||||
<comment>Label for default password generator settings</comment>
|
||||
</data>
|
||||
<data name="ConfigureButton">
|
||||
<value>Configure</value>
|
||||
<value>Configurar</value>
|
||||
<comment>Button text to configure settings</comment>
|
||||
</data>
|
||||
<data name="PasswordGeneratorSettingsDescription">
|
||||
<value>Configure the default settings used when generating new passwords. These settings will be used for all new passwords unless overridden for specific entries.</value>
|
||||
<value>Configurar los ajustes predeterminados al generar nuevas contraseñas. Estas opciones se utilizarán para todas las contraseñas nuevas a menos que se sobreescriban para entradas específicas.</value>
|
||||
<comment>Description for password generator settings</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,31 +59,31 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="NoLogoText" xml:space="preserve">
|
||||
<value>No logo</value>
|
||||
<value>Sin logo</value>
|
||||
<comment>Text shown when service logo is not available</comment>
|
||||
</data>
|
||||
<data name="ImportFromServiceTitle" xml:space="preserve">
|
||||
<value>Import from {0}</value>
|
||||
<value>Importar desde {0}</value>
|
||||
<comment>Modal title for importing from a service. {0} is placeholder for service name</comment>
|
||||
</data>
|
||||
<data name="UploadExportFileText" xml:space="preserve">
|
||||
<value>Upload your {0} export file:</value>
|
||||
<value>Sube tu archivo de exportación {0}:</value>
|
||||
<comment>Text for file upload instruction. {0} is placeholder for service name</comment>
|
||||
</data>
|
||||
<data name="CancelButton" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
<value>Cancelar</value>
|
||||
<comment>Cancel button text</comment>
|
||||
</data>
|
||||
<data name="BackButton" xml:space="preserve">
|
||||
<value>Back</value>
|
||||
<value>Atrás</value>
|
||||
<comment>Back button text</comment>
|
||||
</data>
|
||||
<data name="NextButton" xml:space="preserve">
|
||||
<value>Next</value>
|
||||
<value>Siguiente</value>
|
||||
<comment>Next button text</comment>
|
||||
</data>
|
||||
<data name="ImportButton" xml:space="preserve">
|
||||
<value>Import</value>
|
||||
<value>Importar</value>
|
||||
<comment>Import button text</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -60,184 +60,184 @@
|
||||
</resheader>
|
||||
<!-- 1Password -->
|
||||
<data name="OnePasswordDescription" xml:space="preserve">
|
||||
<value>Import passwords from your 1Password vault</value>
|
||||
<value>Importar contraseñas de 1Password</value>
|
||||
<comment>Description for 1Password import service</comment>
|
||||
</data>
|
||||
<data name="OnePasswordInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your 1Password vault, you need to export it as a CSV file. You can do this by logging into your 1Password account in the 1Password 8 desktop app (Windows / MacOS / Linux), going to the 'File' menu and selecting 'Export' (to CSV).</value>
|
||||
<value>Para importar la bóveda de 1Password, necesita exportarla como un archivo CSV. Puede hacerlo iniciando sesión en su cuenta de 1Password en la aplicación de escritorio de 1Password 8 (Windows / MacOS / Linux), ir al menú 'Archivo' y seleccionar 'Exportar' (a CSV).</value>
|
||||
<comment>1Password export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="OnePasswordInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>1Password export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- Bitwarden -->
|
||||
<data name="BitwardenDescription" xml:space="preserve">
|
||||
<value>Import passwords from your Bitwarden vault</value>
|
||||
<value>Importar contraseñas de Bitwarden</value>
|
||||
<comment>Description for Bitwarden import service</comment>
|
||||
</data>
|
||||
<data name="BitwardenInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Bitwarden vault, you need to export it as a CSV file. You can do this by logging into your Bitwarden account, going to the 'Tools' menu and selecting 'Export vault' (to CSV).</value>
|
||||
<value>Para importar la bóveda de Bitwarden, necesita exportarla como un archivo CSV. Puede hacerlo iniciando sesión en su cuenta de Bitwarden, yendo al menú 'Herramientas' y seleccionando 'Exportar bóveda' (a CSV).</value>
|
||||
<comment>Bitwarden export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="BitwardenInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>Bitwarden export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- LastPass -->
|
||||
<data name="LastPassDescription" xml:space="preserve">
|
||||
<value>Import passwords from your LastPass vault</value>
|
||||
<value>Importar contraseñas de LastPass</value>
|
||||
<comment>Description for LastPass import service</comment>
|
||||
</data>
|
||||
<data name="LastPassInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your LastPass vault, you need to export it as a CSV file. You can do this by logging into your LastPass account, going to 'Advanced Options' in the left sidebar and selecting 'Export' > 'LastPass CSV File'.</value>
|
||||
<value>Para importar la bóveda de LastPass necesitas exportarla como un archivo CSV. Puede hacerlo iniciando sesión en su cuenta LastPass, yendo a 'Opciones avanzadas' en la barra lateral izquierda y seleccionando 'Exportar' > 'Archivo CSV LastPass'.</value>
|
||||
<comment>LastPass export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="LastPassInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>LastPass export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- Chrome -->
|
||||
<data name="ChromeDescription" xml:space="preserve">
|
||||
<value>Import passwords from your Chrome Password Manager</value>
|
||||
<value>Importar contraseñas de administrador de contraseñas de Chrome</value>
|
||||
<comment>Description for Chrome import service</comment>
|
||||
</data>
|
||||
<data name="ChromeInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Chrome Password Manager, you need to export it as a CSV file. You can do this by logging into your Chrome browser, going to the 'Settings' menu > 'Password and AutoFill' > 'Google Password Manager'. Then click on 'Export passwords'.</value>
|
||||
<value>Para importar su gestor de contraseñas de Chrome, necesita exportarlo como un archivo CSV. Puede hacerlo iniciando sesión en su navegador Chrome, yendo al menú 'Configuración' > 'Contraseña y AutoCompletar' > 'Administrador de contraseñas de Chrome'. Luego haga clic en 'Exportar contraseñas'.</value>
|
||||
<comment>Chrome export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="ChromeInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>Chrome export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- KeePass -->
|
||||
<data name="KeePassDescription" xml:space="preserve">
|
||||
<value>Import passwords from KeePass</value>
|
||||
<value>Importar contraseñas de KeePass</value>
|
||||
<comment>Description for KeePass import service</comment>
|
||||
</data>
|
||||
<data name="KeePassInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your KeePass vault, you need to export it as a CSV file. You can do this by going to the 'File' menu and selecting 'Export' (to CSV).</value>
|
||||
<value>Para importar la bóveda de KeePass es necesario exportarla como un archivo CSV. Puede hacerlo yendo al menú 'Archivo' y seleccionando 'Exportar' (a CSV).</value>
|
||||
<comment>KeePass export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="KeePassInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>KeePass export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- Generic CSV -->
|
||||
<data name="GenericCsvDescription" xml:space="preserve">
|
||||
<value>Import credentials using a template CSV format</value>
|
||||
<value>Importar credenciales usando una plantilla CSV</value>
|
||||
<comment>Description for Generic CSV import service</comment>
|
||||
</data>
|
||||
<data name="GenericCsvInstructionsPart1" xml:space="preserve">
|
||||
<value>Is the password manager you are using not supported? You can always import your credentials into AliasVault using a generic CSV template format instead.</value>
|
||||
<value>¿Gestor de contraseñas incompatible? Siempre puede importar sus credenciales a AliasVault utilizando una plantilla con formato CSV.</value>
|
||||
<comment>Generic CSV instructions part 1</comment>
|
||||
</data>
|
||||
<data name="GenericCsvStep1" xml:space="preserve">
|
||||
<value>Download the AliasVault Import CSV</value>
|
||||
<value>Descargar el CSV de importación de AliasVault</value>
|
||||
<comment>Generic CSV step 1</comment>
|
||||
</data>
|
||||
<data name="GenericCsvStep2" xml:space="preserve">
|
||||
<value>Open it in a spreadsheet program (Microsoft Excel, Google Sheets, etc.)</value>
|
||||
<value>Abrirlo en un programa de hoja de cálculo (Microsoft Excel, Google Sheets, etc.)</value>
|
||||
<comment>Generic CSV step 2</comment>
|
||||
</data>
|
||||
<data name="GenericCsvStep3" xml:space="preserve">
|
||||
<value>Fill in your credentials (replace the example data)</value>
|
||||
<value>Rellena tus credenciales (reemplazar los datos de ejemplo)</value>
|
||||
<comment>Generic CSV step 3</comment>
|
||||
</data>
|
||||
<data name="GenericCsvStep4" xml:space="preserve">
|
||||
<value>Save as CSV format and upload it below</value>
|
||||
<value>Guardar como formato CSV y subirlo más abajo</value>
|
||||
<comment>Generic CSV step 4</comment>
|
||||
</data>
|
||||
<data name="GenericCsvTemplateDownloadError" xml:space="preserve">
|
||||
<value>Failed to download CSV template. Please try again.</value>
|
||||
<value>Error al descargar la plantilla CSV. Por favor, inténtalo de nuevo.</value>
|
||||
<comment>Error message for template download failure</comment>
|
||||
</data>
|
||||
<!-- Firefox -->
|
||||
<data name="FirefoxDescription" xml:space="preserve">
|
||||
<value>Import passwords from your Firefox Password Manager</value>
|
||||
<value>Importar contraseñas del administrador de contraseñas de Firefox</value>
|
||||
<comment>Description for Firefox import service</comment>
|
||||
</data>
|
||||
<data name="FirefoxInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Firefox passwords, you need to export it as a CSV file. You can do this by opening your Firefox browser, going to menu > 'Passwords'. Then click on the menu icon in the top right corner and select 'Export passwords'.</value>
|
||||
<value>Para importar tus contraseñas de Firefox, necesitas exportarlas como un archivo CSV. Puedes hacerlo abriendo tu navegador Firefox, yendo al menú > 'contraseñas'. Luego haga clic en el icono del menú en la esquina superior derecha y seleccione 'Exportar contraseñas'.</value>
|
||||
<comment>Firefox export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="FirefoxInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>Firefox export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- Dashlane -->
|
||||
<data name="DashlaneDescription" xml:space="preserve">
|
||||
<value>Import passwords from your Dashlane account</value>
|
||||
<value>Importar contraseñas de Dashlane</value>
|
||||
<comment>Description for Dashlane import service</comment>
|
||||
</data>
|
||||
<data name="DashlaneInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Dashlane passwords, you need to export it as a CSV file. You can do this by logging into your Dashlane account, going to the 'Account' > 'Settings' menu and selecting 'Export to CSV'.</value>
|
||||
<value>Para importar sus contraseñas de Dashlane, necesita exportarlo como un archivo CSV. Puede hacerlo iniciando sesión en su cuenta de Dashlane, yendo al menú 'Cuenta' > 'Configuración' y seleccionando 'Exportar a CSV'.</value>
|
||||
<comment>Dashlane export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="DashlaneInstructionsPart2" xml:space="preserve">
|
||||
<value>Note: the .zip file you download will contain a "credentials.csv" file. You need to unzip the archive first, and then upload the "credentials.csv" CSV file below.</value>
|
||||
<value>Nota: El archivo .zip que descargue contendrá un archivo "credentials.csv". Necesita descomprimir primero el archivo, y luego subir el archivo CSV "credentials.csv" a continuación.</value>
|
||||
<comment>Dashlane export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- KeePassXC -->
|
||||
<data name="KeePassXCDescription" xml:space="preserve">
|
||||
<value>Import passwords from KeePassXC</value>
|
||||
<value>Importar contraseñas de KeePassXC</value>
|
||||
<comment>Description for KeePassXC import service</comment>
|
||||
</data>
|
||||
<data name="KeePassXCInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your KeePassXC vault, you need to export it as a CSV file. You can do this by going to the 'Database' menu and selecting 'Export' (CSV File).</value>
|
||||
<value>Para importar la bóveda de KeePassXC, debe exportarla como un archivo CSV. Puede hacer esto yendo al menú 'Base de datos' y seleccionando 'Exportar' (Archivo CSV).</value>
|
||||
<comment>KeePassXC export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="KeePassXCInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>KeePassXC export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- Proton Pass -->
|
||||
<data name="ProtonPassDescription" xml:space="preserve">
|
||||
<value>Import passwords from Proton Pass</value>
|
||||
<value>Importar contraseñas de Proton Pass</value>
|
||||
<comment>Description for Proton Pass import service</comment>
|
||||
</data>
|
||||
<data name="ProtonPassInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Proton Pass passwords, you need to export it as a CSV file. You can do this by logging into Proton Pass (web), clicking on the 'Settings' menu > 'Export' > 'File format: CSV'. Then click on 'Export'.</value>
|
||||
<value>Para importar las contraseñas de Proton Pass, necesita exportarlas como un archivo CSV. Puede hacerlo iniciando sesión en Proton Pass (web), haciendo clic en el menú 'Configuración' > 'Exportar' > 'Formato de archivo: CSV'. Luego haga clic en 'Exportar'.</value>
|
||||
<comment>Proton Pass export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="ProtonPassInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>Proton Pass export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- Strongbox -->
|
||||
<data name="StrongboxDescription" xml:space="preserve">
|
||||
<value>Import passwords from Strongbox</value>
|
||||
<value>Importar contraseñas de Strongbox</value>
|
||||
<comment>Description for Strongbox import service</comment>
|
||||
</data>
|
||||
<data name="StrongboxInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Strongbox vault, you need to export it as a CSV file. You can do this by going to the 'File' menu and selecting 'Export Database' (to CSV).</value>
|
||||
<value>Para importar la bóveda de Strongbox, necesita exportarla como un archivo CSV. Puede hacerlo yendo al menú 'Archivo' y seleccionando 'Exportar base de datos' (a CSV).</value>
|
||||
<comment>Strongbox export instructions part 1</comment>
|
||||
</data>
|
||||
<data name="StrongboxInstructionsPart2" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>Strongbox export instructions part 2</comment>
|
||||
</data>
|
||||
<!-- AliasVault -->
|
||||
<data name="AliasVaultDescription" xml:space="preserve">
|
||||
<value>Import passwords from another AliasVault server or manual back-up</value>
|
||||
<value>Importar contraseñas de otro servidor AliasVault o copia de seguridad manual</value>
|
||||
<comment>Description for AliasVault import service</comment>
|
||||
</data>
|
||||
<data name="AliasVaultInstructionsPart1" xml:space="preserve">
|
||||
<value>If you have a CSV file back-up of your AliasVault database (from a different AliasVault server), you can import it here.</value>
|
||||
<value>Si tiene una copia de seguridad en un archivo CSV de su base de datos AliasVault (desde un servidor AliasVault diferente), puede importarla aquí.</value>
|
||||
<comment>AliasVault import instructions</comment>
|
||||
</data>
|
||||
<!-- Dropbox -->
|
||||
<data name="DropboxDescription" xml:space="preserve">
|
||||
<value>Import passwords from Dropbox Passwords</value>
|
||||
<value>Importar contraseñas de Dropbox</value>
|
||||
<comment>Description for Dropbox import service</comment>
|
||||
</data>
|
||||
<data name="DropboxInstructionsPart1" xml:space="preserve">
|
||||
<value>In order to import your Dropbox Passwords, you need to export them as a CSV file. You can do this by opening Dropbox Passwords, going to 'Account' > 'Export' (to .CSV).</value>
|
||||
<value>Para importar sus contraseñas de Dropbox, necesita exportarlas como un archivo CSV. Puede hacerlo abriendo Dropbox Passwords, yendo a 'Cuenta' > 'Exportar' (a .CSV).</value>
|
||||
<comment>Dropbox export instructions part 1</comment>
|
||||
</data>
|
||||
<!-- Common text that can be reused -->
|
||||
<data name="UploadFileInstructionCommon" xml:space="preserve">
|
||||
<value>Once you have exported the file, you can upload it below.</value>
|
||||
<value>Una vez que haya exportado el archivo, puede subirlo a continuación.</value>
|
||||
<comment>Common instruction for file upload</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,15 +59,15 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Reset Vault</value>
|
||||
<value>Restablecer bóveda</value>
|
||||
<comment>Reset vault section title</comment>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>This option allows you to completely empty your vault while keeping your account and email aliases. Use this if you want to start fresh after importing data from another password manager or if you want to clear all existing credentials to start over.</value>
|
||||
<value>Esta opción le permite vaciar completamente su bóveda manteniendo su cuenta y alias de correo electrónico. Utilice esto si desea iniciar fresco después de importar datos de otro gestor de contraseñas o si desea borrar todas las credenciales existentes para empezar de nuevo.</value>
|
||||
<comment>Reset vault section description</comment>
|
||||
</data>
|
||||
<data name="ResetVaultButton" xml:space="preserve">
|
||||
<value>Reset vault</value>
|
||||
<value>Restablecer bóveda</value>
|
||||
<comment>Reset vault button</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -59,51 +59,51 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Change password generator settings</value>
|
||||
<value>Cambiar ajustes del generador de contraseñas</value>
|
||||
<comment>Modal title</comment>
|
||||
</data>
|
||||
<data name="PasswordLengthLabel" xml:space="preserve">
|
||||
<value>Password Length: {0}</value>
|
||||
<value>Longitud de contraseña: {0}</value>
|
||||
<comment>Label for password length slider. {0} is placeholder for current length</comment>
|
||||
</data>
|
||||
<data name="IncludeLowercaseLabel" xml:space="preserve">
|
||||
<value>Include lowercase letters (a-z)</value>
|
||||
<value>Incluye letras minúsculas (a-z)</value>
|
||||
<comment>Checkbox label for lowercase letters</comment>
|
||||
</data>
|
||||
<data name="IncludeUppercaseLabel" xml:space="preserve">
|
||||
<value>Include uppercase letters (A-Z)</value>
|
||||
<value>Incluye letras mayúsculas (A-Z)</value>
|
||||
<comment>Checkbox label for uppercase letters</comment>
|
||||
</data>
|
||||
<data name="IncludeNumbersLabel" xml:space="preserve">
|
||||
<value>Include numbers (0-9)</value>
|
||||
<value>Incluye números (0-9)</value>
|
||||
<comment>Checkbox label for numbers</comment>
|
||||
</data>
|
||||
<data name="IncludeSpecialCharsLabel" xml:space="preserve">
|
||||
<value>Include special characters (!@#$%^&*)</value>
|
||||
<value>Incluye caracteres especiales (!@#$%^&*)</value>
|
||||
<comment>Checkbox label for special characters</comment>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharsLabel" xml:space="preserve">
|
||||
<value>Avoid ambiguous characters (1, l, I, 0, O, etc.)</value>
|
||||
<value>Evitar caracteres ambiguos (1, l, I, 0, O, etc.)</value>
|
||||
<comment>Checkbox label for avoiding ambiguous characters</comment>
|
||||
</data>
|
||||
<data name="PreviewLabel" xml:space="preserve">
|
||||
<value>Preview</value>
|
||||
<value>Vista previa</value>
|
||||
<comment>Label for password preview section</comment>
|
||||
</data>
|
||||
<data name="CancelButton" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
<value>Cancelar</value>
|
||||
<comment>Cancel button text</comment>
|
||||
</data>
|
||||
<data name="UseJustOnceButton" xml:space="preserve">
|
||||
<value>Use Just Once</value>
|
||||
<value>Usar solo una vez</value>
|
||||
<comment>Button to use settings temporarily</comment>
|
||||
</data>
|
||||
<data name="SaveGloballyButton" xml:space="preserve">
|
||||
<value>Save Globally</value>
|
||||
<value>Guardar globalmente</value>
|
||||
<comment>Button to save settings globally</comment>
|
||||
</data>
|
||||
<data name="SettingsUpdatedMessage" xml:space="preserve">
|
||||
<value>Password generation settings updated globally.</value>
|
||||
<value>Ajustes de generación de contraseñas actualizados globalmente.</value>
|
||||
<comment>Success message when settings are saved</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,47 +59,47 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Active Sessions</value>
|
||||
<value>Sesiones Activas</value>
|
||||
<comment>Section title</comment>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Below is a list of devices where your account is currently logged in or has an active session. You can log out from any of these sessions here.</value>
|
||||
<value>A continuación se muestra una lista de dispositivos donde su cuenta está actualmente conectada o tiene una sesión activa. Puede cerrar sesión de cualquiera de estas sesiones aquí.</value>
|
||||
<comment>Description of active sessions</comment>
|
||||
</data>
|
||||
<data name="NoSessionsMessage" xml:space="preserve">
|
||||
<value>No active sessions found.</value>
|
||||
<value>No se encontraron sesiones activas.</value>
|
||||
<comment>Message when no active sessions are available</comment>
|
||||
</data>
|
||||
<data name="DeviceColumn" xml:space="preserve">
|
||||
<value>Device</value>
|
||||
<value>Dispositivo</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="LastActiveColumn" xml:space="preserve">
|
||||
<value>Last active</value>
|
||||
<value>Última actividad</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="ExpiresColumn" xml:space="preserve">
|
||||
<value>Expires</value>
|
||||
<value>Caduca</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="ActionColumn" xml:space="preserve">
|
||||
<value>Action</value>
|
||||
<value>Acción</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="RevokeButton" xml:space="preserve">
|
||||
<value>Revoke</value>
|
||||
<value>Revocar</value>
|
||||
<comment>Button to revoke session</comment>
|
||||
</data>
|
||||
<data name="RevokeSuccessMessage" xml:space="preserve">
|
||||
<value>Session revoked successfully.</value>
|
||||
<value>Sesión revocada correctamente.</value>
|
||||
<comment>Success message when session is revoked</comment>
|
||||
</data>
|
||||
<data name="RevokeErrorMessage" xml:space="preserve">
|
||||
<value>Failed to revoke session.</value>
|
||||
<value>Error al revocar la sesión.</value>
|
||||
<comment>Error message when session revocation fails</comment>
|
||||
</data>
|
||||
<data name="RevokeExceptionMessage" xml:space="preserve">
|
||||
<value>Failed to revoke session: {0}.</value>
|
||||
<value>Fallo al revocar la sesión: {0}.</value>
|
||||
<comment>Exception message when session revocation fails. {0} is placeholder for error details</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,15 +59,15 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Delete account</value>
|
||||
<value>Eliminar cuenta</value>
|
||||
<comment>Section title</comment>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Permanently delete your account and all associated data. This action cannot be undone.</value>
|
||||
<value>Elimina permanentemente tu cuenta y todos los datos asociados. Esta acción no se puede deshacer.</value>
|
||||
<comment>Warning description for account deletion</comment>
|
||||
</data>
|
||||
<data name="DeleteButton" xml:space="preserve">
|
||||
<value>Delete Account</value>
|
||||
<value>Eliminar cuenta</value>
|
||||
<comment>Button to delete account</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,15 +59,15 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Change master password</value>
|
||||
<value>Cambiar contraseña maestra</value>
|
||||
<comment>Section title</comment>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Changing your master password also changes the vault encryption keys. It is advised to periodically change your master password to keep your vaults secure.</value>
|
||||
<value>Cambiar su contraseña maestra también cambia las claves de cifrado de bóveda. Se recomienda cambiar periódicamente su contraseña maestra para mantener sus bóvedas seguras.</value>
|
||||
<comment>Description of password change</comment>
|
||||
</data>
|
||||
<data name="ChangePasswordButton" xml:space="preserve">
|
||||
<value>Change Password</value>
|
||||
<value>Cambiar contraseña</value>
|
||||
<comment>Button to change password</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,43 +59,43 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Passkey unlock</value>
|
||||
<value>Desbloqueo con llave de acceso</value>
|
||||
<comment>Title for passkey unlock section</comment>
|
||||
</data>
|
||||
<data name="EnabledDescription" xml:space="preserve">
|
||||
<value>Your master password is encrypted with the passkey PRF and stored locally. When you reload the AliasVault page or tab, you can unlock your vault with your passkey. If you wish to disable passkey unlock, you can do so with the button below. Your master password will still work for unlocking the vault.</value>
|
||||
<value>Su contraseña maestra se encripta con la llave PRF y se almacena local. Al recargar la página o pestaña de AliasVault, puede desbloquear su bóveda con su llave. Si desea deshabilitar el desbloqueo de contraseña, puede hacerlo con el botón de abajo. Su contraseña maestra seguirá funcionando para desbloquear la bóveda.</value>
|
||||
<comment>Description when passkey unlock is enabled</comment>
|
||||
</data>
|
||||
<data name="DisableButton" xml:space="preserve">
|
||||
<value>Disable Passkey Unlock</value>
|
||||
<value>Desactivar el desbloqueo con llave de acceso</value>
|
||||
<comment>Button to disable passkey unlock</comment>
|
||||
</data>
|
||||
<data name="DisabledDescription" xml:space="preserve">
|
||||
<value>By default, reloading the AliasVault page or tab requires you to enter your master password again. With a passkey, you can unlock your vault instantly. When enabled, your master password is locally encrypted using the passkey's PRF extension. Note: the passkey will only work for the current device and browser that you enable it on.</value>
|
||||
<value>Por defecto, recargar la página o pestaña de AliasVault requiere que vuelva a introducir su contraseña maestra. Con una llave de acceso, puede desbloquear la bóveda al instante. Cuando está habilitada, su contraseña maestra se cifrará localmente usando la extensión PRF de la contraseña. Nota: la llave de acceso sólo funcionará para el dispositivo actual y el navegador en el que la active.</value>
|
||||
<comment>Description when passkey unlock is disabled</comment>
|
||||
</data>
|
||||
<data name="ExperimentalWarning" xml:space="preserve">
|
||||
<value>This feature is currently supported by AliasVault browser extension and iOS app. Android support is coming soon. If you experience any issues, you can disable this feature at any time.</value>
|
||||
<value>Esta función está soportada actualmente por la extensión del navegador AliasVault y la aplicación iOS. El soporte para Android estará disponible pronto. Si experimenta algún problema, puede desactivar esta característica en cualquier momento.</value>
|
||||
<comment>Warning about feature compatibility</comment>
|
||||
</data>
|
||||
<data name="EnableButton" xml:space="preserve">
|
||||
<value>Enable Passkey Unlock</value>
|
||||
<value>Activar desbloqueo de llave</value>
|
||||
<comment>Button to enable passkey unlock</comment>
|
||||
</data>
|
||||
<data name="SuccessEnabledMessage" xml:space="preserve">
|
||||
<value>Passkey unlock is successfully enabled. The next time your vault is locked, you can unlock it with your created passkey.</value>
|
||||
<value>El desbloqueo con llave de acceso se ha habilitado con éxito. La próxima vez que su bóveda esté bloqueada, puede desbloquearla con su llave de acceso creada.</value>
|
||||
<comment>Success message when passkey unlock is enabled</comment>
|
||||
</data>
|
||||
<data name="SuccessDisabledMessage" xml:space="preserve">
|
||||
<value>Passkey unlock is successfully disabled.</value>
|
||||
<value>El desbloqueo con llave de acceso está desactivado correctamente.</value>
|
||||
<comment>Success message when passkey unlock is disabled</comment>
|
||||
</data>
|
||||
<data name="WebAuthnNotSupportedError" xml:space="preserve">
|
||||
<value>Your current browser does not support the WebAuthn PRF extension. Please try again with a different browser.</value>
|
||||
<value>Su navegador actual no soporta la extensión WebAuthn PRF. Por favor, inténtelo de nuevo con un navegador diferente.</value>
|
||||
<comment>Error when WebAuthn is not supported</comment>
|
||||
</data>
|
||||
<data name="EnableErrorMessage" xml:space="preserve">
|
||||
<value>An error occurred while trying to enable Quick Vault Unlock. Please try again (later).</value>
|
||||
<value>Ocurrió un error mientras se intentaba habilitar el desbloqueo rápido de la bóveda. Por favor, inténtalo de nuevo (más tarde).</value>
|
||||
<comment>Generic error message when enabling fails</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -59,47 +59,47 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Title" xml:space="preserve">
|
||||
<value>Recent Auth Logs</value>
|
||||
<value>Registros Auth recientes</value>
|
||||
<comment>Section title</comment>
|
||||
</data>
|
||||
<data name="Description" xml:space="preserve">
|
||||
<value>Below you can find an overview of recent login attempts to your account.</value>
|
||||
<value>A continuación puede encontrar un resumen de los intentos de inicio de sesión recientes en su cuenta.</value>
|
||||
<comment>Description of auth logs section</comment>
|
||||
</data>
|
||||
<data name="NoLogsMessage" xml:space="preserve">
|
||||
<value>No authentication logs found.</value>
|
||||
<value>No hay registros de autenticación.</value>
|
||||
<comment>Message when no auth logs are available</comment>
|
||||
</data>
|
||||
<data name="TimestampColumn" xml:space="preserve">
|
||||
<value>Timestamp</value>
|
||||
<value>Fecha y hora</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="EventTypeColumn" xml:space="preserve">
|
||||
<value>Event Type</value>
|
||||
<value>Tipo de evento</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="ClientColumn" xml:space="preserve">
|
||||
<value>Client</value>
|
||||
<value>Cliente</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="IpAddressColumn" xml:space="preserve">
|
||||
<value>IP Address</value>
|
||||
<value>Dirección IP</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="DeviceColumn" xml:space="preserve">
|
||||
<value>Device</value>
|
||||
<value>Dispositivo</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="SuccessColumn" xml:space="preserve">
|
||||
<value>Success</value>
|
||||
<value>Éxito</value>
|
||||
<comment>Table column header</comment>
|
||||
</data>
|
||||
<data name="SuccessStatus" xml:space="preserve">
|
||||
<value>Success</value>
|
||||
<value>Correcto</value>
|
||||
<comment>Status indicator for successful login</comment>
|
||||
</data>
|
||||
<data name="FailedStatus" xml:space="preserve">
|
||||
<value>Failed</value>
|
||||
<value>Fallo</value>
|
||||
<comment>Status indicator for failed login</comment>
|
||||
</data>
|
||||
</root>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user