Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4c73569
add i18n-ally configuration for localization support
dozro May 22, 2026
a4eb7a3
integrate localization for device verification setup messages
dozro May 22, 2026
1cacfd3
update device verification messages for localization support
dozro May 22, 2026
ea31f88
implement localization for room-related messages and typing indicators
dozro May 22, 2026
aa7c3ca
implement localization for various room-related components and messages
dozro May 23, 2026
c029fe1
formatting :p
dozro May 23, 2026
e58c2f7
implement language detection configuration for i18next
dozro May 23, 2026
7a0828f
implement localization for additional general and room-related messag…
dozro May 23, 2026
f8462bf
Update Crowdin configuration file
dozro May 23, 2026
c60e116
Update Crowdin configuration file
dozro May 23, 2026
c6721a0
Update Crowdin configuration file
dozro May 23, 2026
dd89ec8
Update Crowdin configuration file
dozro May 23, 2026
e687544
New translations en.json (French)
dozro May 23, 2026
d513dbd
New translations en.json (German)
dozro May 23, 2026
42ff1a1
New translations en.json (German)
dozro May 23, 2026
b3e56be
Merge pull request #1 from dozro/l10n_rye/feat/i18n3
dozro May 23, 2026
e27f53b
implement localization for room creation components and messages
dozro May 23, 2026
fcfb66c
implement localization for various settings and profile components
dozro May 23, 2026
ac68cf6
implement localization for EmojiBoard component and related labels
dozro May 29, 2026
c54c2bb
implement localization for settings and experimental features
dozro May 29, 2026
a566177
implement localization for General, KeyboardShortcuts, and Persona se…
dozro May 29, 2026
7d6d700
merge upstream
nushea Jul 15, 2026
136cfc4
make full romanian file, and delete fr and de files as i do not speak…
nushea Jul 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"recommendations": ["webpro.vscode-knip", "oxc.oxc-vscode"]
"recommendations": ["webpro.vscode-knip", "oxc.oxc-vscode", "lokalise.i18n-ally"]
}
10 changes: 10 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@
},
"nixEnvSelector.nixFile": "${workspaceFolder}/flake.nix",
"nixEnvSelector.useFlakes": true,
"i18n-ally.localesPaths": ["public/locales"],
"i18n-ally.dirStructure": "auto",
"i18n-ally.enabledFrameworks": ["react", "react-i18next"],
"i18n-ally.extract.keyMaxLength": 75,
"i18n-ally.extract.targetPickingStrategy": "most-similar",
"i18n-ally.keystyle": "nested",
"i18n-ally.extract.keygenStyle": "snake_case",
"i18n-ally.extract.ignoredByFiles": {
"src/app/components/DeviceVerificationSetup.tsx": ["Column"]
},
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"package.json": "pnpm-*.yaml, yarn.lock, package-lock.json, .npmrc, .nvmrc, .node-version",
Expand Down
3 changes: 3 additions & 0 deletions crowdin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
files:
- source: /public/locales/en.json
translation: /public/locales/%two_letters_code%.json
7 changes: 7 additions & 0 deletions i18next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default {
locales: ['en', 'ro'],
extract: {
input: 'src/**/*.tsx',
output: 'public/locales/{{language}}/{{namespace}}.json',
},
};
7 changes: 0 additions & 7 deletions public/locales/de.json

This file was deleted.

269 changes: 269 additions & 0 deletions public/locales/en.json

Large diffs are not rendered by default.

273 changes: 273 additions & 0 deletions public/locales/ro.json

Large diffs are not rendered by default.

17 changes: 9 additions & 8 deletions src/app/components/AccountDataEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { useTextAreaCodeEditor } from '$hooks/useTextAreaCodeEditor';
import { Page, PageHeader } from './page';
import { SequenceCard } from './sequence-card';
import { TextViewerContent } from './text-viewer';
import { t } from 'i18next';

const EDITOR_INTENT_SPACE_COUNT = 2;

Expand Down Expand Up @@ -121,7 +122,7 @@ function AccountDataEdit({
aria-disabled={submitting}
>
<Box shrink="No" direction="Column" gap="100">
<Text size="L400">Account Data</Text>
<Text size="L400">{t('DevTools.account_data')}</Text>
<Box gap="300">
<Box grow="Yes" direction="Column">
<Input
Expand All @@ -142,7 +143,7 @@ function AccountDataEdit({
disabled={submitting}
before={submitting && <Spinner variant="Primary" fill="Solid" size="300" />}
>
<Text size="B400">Save</Text>
<Text size="B400">{t('General.save')}</Text>
</Button>
<Button
variant="Secondary"
Expand All @@ -153,7 +154,7 @@ function AccountDataEdit({
onClick={onCancel}
disabled={submitting}
>
<Text size="B400">Cancel</Text>
<Text size="B400">{t('General.cancel')}</Text>
</Button>
</Box>

Expand All @@ -165,7 +166,7 @@ function AccountDataEdit({
</Box>
<Box grow="Yes" direction="Column" gap="100">
<Box shrink="No">
<Text size="L400">JSON Content</Text>
<Text size="L400">{t('DevTools.json_content')}</Text>
</Box>
<TextAreaComponent
ref={textAreaRef}
Expand Down Expand Up @@ -208,7 +209,7 @@ function AccountDataView({ type, defaultContent, onEdit }: AccountDataViewProps)
>
<Box shrink="No" gap="300" alignItems="End">
<Box grow="Yes" direction="Column" gap="100">
<Text size="L400">Account Data</Text>
<Text size="L400">{t('DevTools.account_data')}</Text>
<Input
variant="SurfaceVariant"
size="400"
Expand All @@ -219,11 +220,11 @@ function AccountDataView({ type, defaultContent, onEdit }: AccountDataViewProps)
/>
</Box>
<Button variant="Secondary" size="400" radii="300" onClick={onEdit}>
<Text size="B400">Edit</Text>
<Text size="B400">{t('General.edit')}</Text>
</Button>
</Box>
<Box grow="Yes" direction="Column" gap="100">
<Text size="L400">JSON Content</Text>
<Text size="L400">{t('DevTools.json_content')}</Text>
<SequenceCard variant="SurfaceVariant">
<Scroll visibility="Always" size="300" hideTrack>
<TextViewerContent
Expand Down Expand Up @@ -290,7 +291,7 @@ export function AccountDataEditor({
onClick={requestClose}
before={sizedIcon(ArrowLeft, '100')}
>
<Text size="T300">Developer Tools</Text>
<Text size="T300">{t('DevTools.developer_tools')}</Text>
</Chip>
</Box>
<Box shrink="No">
Expand Down
53 changes: 35 additions & 18 deletions src/app/components/DeviceVerification.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
} from '$hooks/useVerificationRequest';
import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';
import { ContainerColor } from '$styles/ContainerColor.css';
import { t } from 'i18next';

const DialogHeaderStyles: CSSProperties = {
padding: `0 ${config.space.S200} 0 ${config.space.S400}`,
Expand All @@ -50,7 +51,7 @@ function VerificationUnexpected({ message, onClose }: VerificationUnexpectedProp
<Box direction="Column" gap="400">
<Text>{message}</Text>
<Button variant="Secondary" fill="Soft" onClick={onClose}>
<Text size="B400">Close</Text>
<Text size="B400">{t('General.close')}</Text>
</Button>
</Box>
);
Expand All @@ -59,8 +60,10 @@ function VerificationUnexpected({ message, onClose }: VerificationUnexpectedProp
function VerificationWaitAccept() {
return (
<Box direction="Column" gap="400">
<Text>Please accept the request from other device.</Text>
<WaitingMessage message="Waiting for request to be accepted..." />
<Text>{t('Settings.device_verification.please_accept_the_request_from_other_device')}</Text>
<WaitingMessage
message={t('Settings.device_verification.waiting_for_request_to_be_accepted')}
/>
</Box>
);
}
Expand All @@ -74,15 +77,17 @@ function VerificationAccept({ onAccept }: VerificationAcceptProps) {
const accepting = acceptState.status === AsyncStatus.Loading;
return (
<Box direction="Column" gap="400">
<Text>Click accept to start the verification process.</Text>
<Text>
{t('Settings.device_verification.click_accept_to_start_the_verification_process')}
</Text>
<Button
variant="Primary"
fill="Solid"
onClick={accept}
before={accepting && <Spinner size="100" variant="Primary" fill="Solid" />}
disabled={accepting}
>
<Text size="B400">Accept</Text>
<Text size="B400">{t('General.accept')}</Text>
</Button>
</Box>
);
Expand All @@ -91,8 +96,10 @@ function VerificationAccept({ onAccept }: VerificationAcceptProps) {
function VerificationWaitStart() {
return (
<Box direction="Column" gap="400">
<Text>Verification request has been accepted.</Text>
<WaitingMessage message="Waiting for the response from other device..." />
<Text>{t('Settings.device_verification.verification_request_has_been_accepted')}</Text>
<WaitingMessage
message={t('Settings.device_verification.waiting_for_the_response_from_other_device')}
/>
</Box>
);
}
Expand All @@ -107,7 +114,9 @@ function AutoVerificationStart({ onStart }: VerificationStartProps) {

return (
<Box direction="Column" gap="400">
<WaitingMessage message="Starting verification using emoji comparison..." />
<WaitingMessage
message={t('Settings.device_verification.starting_verification_using_emoji_comparison')}
/>
</Box>
);
}
Expand All @@ -129,7 +138,11 @@ function CompareEmoji({ sasData }: { sasData: ShowSasCallbacks }) {

return (
<Box direction="Column" gap="400">
<Text>Confirm the emoji below are displayed on both devices, in the same order:</Text>
<Text>
{t(
'Settings.device_verification.confirm_the_emoji_below_are_displayed_on_both_devices_in_the_same_order'
)}
</Text>
<Box
className={ContainerColor({ variant: 'SurfaceVariant' })}
style={{
Expand All @@ -155,15 +168,15 @@ function CompareEmoji({ sasData }: { sasData: ShowSasCallbacks }) {
disabled={confirming}
before={confirming && <Spinner size="100" variant="Primary" />}
>
<Text size="B400">They Match</Text>
<Text size="B400">{t('Settings.device_verification.they_match')}</Text>
</Button>
<Button
variant="Primary"
fill="Soft"
onClick={() => sasData.mismatch()}
disabled={confirming}
>
<Text size="B400">Do not Match</Text>
<Text size="B400">{t('Settings.device_verification.do_not_match')}</Text>
</Button>
</Box>
</Box>
Expand All @@ -190,7 +203,9 @@ function SasVerification({ verifier, onCancel }: SasVerificationProps) {

return (
<Box direction="Column" gap="400">
<WaitingMessage message="Starting verification using emoji comparison..." />
<WaitingMessage
message={t('Settings.device_verification.starting_verification_using_emoji_comparison')}
/>
</Box>
);
}
Expand All @@ -202,10 +217,10 @@ function VerificationDone({ onExit }: VerificationDoneProps) {
return (
<Box direction="Column" gap="400">
<div>
<Text>Your device is verified.</Text>
<Text>{t('Settings.device_verification.your_device_is_verified')}</Text>
</div>
<Button variant="Primary" fill="Solid" onClick={onExit}>
<Text size="B400">Okay</Text>
<Text size="B400">{t('General.okay')}</Text>
</Button>
</Box>
);
Expand All @@ -217,9 +232,9 @@ type VerificationCanceledProps = {
function VerificationCanceled({ onClose }: VerificationCanceledProps) {
return (
<Box direction="Column" gap="400">
<Text>Verification has been canceled.</Text>
<Text>{t('Settings.device_verification.verification_has_been_canceled')}</Text>
<Button variant="Secondary" fill="Soft" onClick={onClose}>
<Text size="B400">Close</Text>
<Text size="B400">{t('General.close')}</Text>
</Button>
</Box>
);
Expand Down Expand Up @@ -269,7 +284,7 @@ export function DeviceVerification({ request, onExit }: DeviceVerificationProps)
<Dialog variant="Surface">
<Header style={DialogHeaderStyles} variant="Surface" size="500">
<Box grow="Yes">
<Text size="H4">Device Verification</Text>
<Text size="H4">{t('Settings.device_verification.device_verification')}</Text>
</Box>
<IconButton size="300" radii="300" onClick={handleCancel}>
{composerIcon(X)}
Expand All @@ -293,7 +308,9 @@ export function DeviceVerification({ request, onExit }: DeviceVerificationProps)
<SasVerification verifier={request.verifier} onCancel={handleCancel} />
) : (
<VerificationUnexpected
message="Unexpected Error! Verification is started but verifier is missing."
message={t(
'Settings.device_verification.unexpected_error_verification_is_started_but_verifier_is_missing'
)}
onClose={handleCancel}
/>
))}
Expand Down
Loading
Loading