Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 0 additions & 3 deletions apps/mobile/src/components/LanguageSelectControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,6 @@ export function LanguageSelectControl({
label={getLanguageLabel(lang)}
/>
))}

{/* Promotional placeholder — Hindi translations are not available yet. */}
<SelectItem value="hi-coming-soon" label="Hindi (हिन्दी) — SOON" disabled />
</NativeSelectScrollView>
</SelectContent>
</Select>
Expand Down
5 changes: 5 additions & 0 deletions apps/mobile/src/lib/i18n/translations/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,11 @@ export const ar: Translations = {
'cloud.safelyQueued': 'في قائمة انتظار آمنة',
'cloud.savingSyncedJournalDataOnThisDevice':
'جارٍ حفظ بيانات اليوميات المتزامنة على هذا الجهاز',
'cloud.setupElapsedSeconds': 'الوقت المنقضي: {seconds} ث',
'cloud.setupProgressHelp':
'يربط Tackbok هذا الجهاز ويبدأ المزامنة الأولى. قد تستغرق النسخ الاحتياطية الكبيرة والصور والملاحظات الصوتية وقتًا أطول.',
'cloud.setupTakingLonger':
'يستغرق هذا وقتًا أطول من المعتاد. تحقق من اتصالك بالإنترنت وأبقِ Tackbok مفتوحًا ليتمكن من المتابعة.',
'cloud.settingUpCloudSync': 'جارٍ إعداد المزامنة السحابية…',
'cloud.stepCurrentOfTotalInThisBatch': 'الخطوة {current} من {total} في هذه الدفعة',
'cloud.syncCompleted': 'اكتملت المزامنة',
Expand Down
5 changes: 5 additions & 0 deletions apps/mobile/src/lib/i18n/translations/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,11 @@ export const de: Translations = {
'cloud.safelyQueued': 'Sicher vorgemerkt',
'cloud.savingSyncedJournalDataOnThisDevice':
'Synchronisierte Journaldaten werden auf diesem Gerät gespeichert',
'cloud.setupElapsedSeconds': 'Vergangene Zeit: {seconds} s',
'cloud.setupProgressHelp':
'Tackbok verbindet dieses Gerät und startet die erste Synchronisierung. Große Backups, Fotos und Sprachnotizen können länger dauern.',
'cloud.setupTakingLonger':
'Das dauert länger als üblich. Prüfe deine Internetverbindung und lass Tackbok geöffnet, damit der Vorgang fortgesetzt werden kann.',
'cloud.settingUpCloudSync': 'Cloud-Synchronisierung wird eingerichtet…',
'cloud.stepCurrentOfTotalInThisBatch':
'Schritt {current} von {total} in diesem Durchlauf',
Expand Down
5 changes: 5 additions & 0 deletions apps/mobile/src/lib/i18n/translations/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -845,6 +845,11 @@ export const en = {
'cloud.safelyQueued': 'Safely queued',
'cloud.savingSyncedJournalDataOnThisDevice':
'Saving synced journal data on this device',
'cloud.setupElapsedSeconds': 'Elapsed time: {seconds} s',
'cloud.setupProgressHelp':
'Tackbok is connecting this device and starting the first sync. Large backups, photos, and voice notes can take longer.',
'cloud.setupTakingLonger':
'This is taking longer than usual. Check your internet connection and keep Tackbok open to let it continue.',
'cloud.settingUpCloudSync': 'Setting up cloud sync…',
'cloud.stepCurrentOfTotalInThisBatch': 'Step {current} of {total} in this batch',
'cloud.syncCompleted': 'Sync completed',
Expand Down
1,659 changes: 926 additions & 733 deletions apps/mobile/src/lib/i18n/translations/es.ts

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions apps/mobile/src/lib/i18n/translations/he.ts
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,11 @@ export const he: Translations = {
'cloud.restoring': 'משחזר…',
'cloud.safelyQueued': 'ממתין בבטחה',
'cloud.savingSyncedJournalDataOnThisDevice': 'שומר את נתוני היומן המסונכרנים במכשיר זה',
'cloud.setupElapsedSeconds': 'זמן שחלף: {seconds} שנ׳',
'cloud.setupProgressHelp':
'Tackbok מחבר את המכשיר הזה ומתחיל את הסנכרון הראשון. גיבויים גדולים, תמונות והקלטות קוליות עשויים להימשך זמן רב יותר.',
'cloud.setupTakingLonger':
'הפעולה נמשכת יותר מהרגיל. יש לבדוק את החיבור לאינטרנט ולהשאיר את Tackbok פתוח כדי לאפשר לה להמשיך.',
'cloud.settingUpCloudSync': 'מגדיר סנכרון בענן…',
'cloud.stepCurrentOfTotalInThisBatch': 'שלב {current} מתוך {total} באצווה זו',
'cloud.syncCompleted': 'הסנכרון הושלם',
Expand Down
5 changes: 5 additions & 0 deletions apps/mobile/src/lib/i18n/translations/hi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,11 @@ export const hi = {
'cloud.safelyQueued': 'सुरक्षित रूप से कतारबद्ध',
'cloud.savingSyncedJournalDataOnThisDevice':
'इस डिवाइस पर सिंक किए गए डायरी डेटा को सहेजा जा रहा है',
'cloud.setupElapsedSeconds': 'बीता समय: {seconds} सेकंड',
'cloud.setupProgressHelp':
'Tackbok इस डिवाइस को कनेक्ट कर रहा है और पहला सिंक शुरू कर रहा है। बड़े बैकअप, फ़ोटो और वॉइस नोट में अधिक समय लग सकता है।',
'cloud.setupTakingLonger':
'इसमें सामान्य से अधिक समय लग रहा है। अपना इंटरनेट कनेक्शन जाँचें और Tackbok खुला रखें ताकि यह जारी रह सके।',
'cloud.settingUpCloudSync': 'क्लाउड सिंक सेट किया जा रहा है...',
'cloud.stepCurrentOfTotalInThisBatch': 'इस बैच में {total} का चरण {current}',
'cloud.syncCompleted': 'सिंक पूरा हुआ',
Expand Down
13 changes: 12 additions & 1 deletion apps/mobile/src/lib/i18n/translations/runtime.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { translate } from './index';
import { languages, translate } from './index';
import { pluralMessages } from './plurals';
import { en } from './en';
import type { SupportedLocale, TranslationKey } from '../types';
Expand All @@ -13,6 +13,17 @@ jest.mock('./de', () => {
return { de: incomplete };
});

it.each(languages.map(({ code }) => code).filter((code) => code !== 'device'))(
'%s: interpolates elapsed restore time with localized numbers',
(locale) => {
const zero = translate(locale, 'cloud.setupElapsedSeconds', { seconds: 0 });
const later = translate(locale, 'cloud.setupElapsedSeconds', { seconds: 29 });
expect(zero).not.toMatch(/[{}]/);
expect(later).not.toMatch(/[{}]/);
expect(later).not.toBe(zero);
},
);

it('falls back to the English message rather than exposing an identifier', () => {
expect(translate('de', 'greeting.welcomeBack')).toBe('Welcome back');
expect(translate('de', 'nonexistent.key' as TranslationKey)).toBe('Unknown error');
Expand Down
Loading
Loading