diff --git a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx index e91c44e542..de4c7f3f33 100644 --- a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx +++ b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx @@ -10,8 +10,10 @@ import { BlurBar } from '@/components/ui/blur-bar'; import { Text } from '@/components/ui/text'; import { FEATURE_FLAG_QUICK_CHAT, useFeatureFlag } from '@/lib/analytics/posthog'; import { PROFILE_TAB_ROOT } from '@/lib/finding-detail-back'; +import { useLiveAgentSessions } from '@/lib/hooks/use-agent-sessions'; import { useKiloClawTabVisible } from '@/lib/hooks/use-kiloclaw-tab-visible'; import { useThemeColors } from '@/lib/hooks/use-theme-colors'; +import { useOrganization } from '@/lib/organization-context'; import { getEffectiveTabBarHeight, getTabBarIconSize, @@ -75,6 +77,15 @@ export default function TabsLayout() { const tabFlags = { showKiloClaw: showKiloClawTab, showQuickChat: showQuickChatTab }; const tabCount = visibleTabCount(showKiloClawTab, showQuickChatTab); const { t } = useTranslation(); + const { organizationId, isLoaded: orgLoaded } = useOrganization(); + const { activeSessions, isLoading, isError } = useLiveAgentSessions({ + organizationId, + enabled: orgLoaded, + }); + const liveCount = + orgLoaded && !isLoading && !isError && activeSessions.length > 0 + ? activeSessions.length + : undefined; // If the flag flips off while the Chat tab is focused, its `href` becomes // null but the route is still mounted — move to Home instead. @@ -163,8 +174,11 @@ export default function TabsLayout() { name="(2_agents)" options={{ title: t('tabs.agents'), + tabBarBadge: liveCount, tabBarAccessibilityLabel: tabAccessibilityLabel( - t('tabs.agents'), + liveCount + ? `${t('tabs.agents')}, ${t('agents.liveCount', { count: liveCount })}` + : t('tabs.agents'), tabBarPosition('agents', tabFlags) ?? 2, tabCount ), diff --git a/apps/mobile/src/components/agents/agents-tab-badge.mounted.test.tsx b/apps/mobile/src/components/agents/agents-tab-badge.mounted.test.tsx new file mode 100644 index 0000000000..f939c3f10b --- /dev/null +++ b/apps/mobile/src/components/agents/agents-tab-badge.mounted.test.tsx @@ -0,0 +1,321 @@ +/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer mounts the React Native tree without a DOM. */ +import { createElement, Fragment, type ReactNode } from 'react'; +import { QueryClientProvider } from '@tanstack/react-query'; +import { act, type ReactTestInstance } from 'react-test-renderer'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import TabsLayout from '@/app/(app)/(tabs)/_layout'; +import { buildActiveSessionsTrayInput } from '@/lib/active-sessions-live'; +import { type ActiveSession } from '@/lib/hooks/use-agent-sessions'; +import { createTestQueryClient, renderWithProviders, waitFor } from '@/test/render-with-providers'; +import { AgentSessionListScreen } from './session-list-screen'; + +const organization = vi.hoisted(() => ({ organizationId: null as string | null, isLoaded: true })); +const fetchSessions = vi.hoisted(() => vi.fn<() => Promise<{ sessions: ActiveSession[] }>>()); + +vi.mock('@/lib/trpc', () => ({ + useTRPC: () => ({ + activeSessions: { + list: { + queryKey: (input: unknown) => [['activeSessions', 'list'], { input, type: 'query' }], + queryOptions: (input: unknown, options: object) => ({ + queryKey: [['activeSessions', 'list'], { input, type: 'query' }], + queryFn: fetchSessions, + ...options, + }), + }, + }, + }), +})); +vi.mock('@/lib/organization-context', () => ({ useOrganization: () => organization })); +vi.mock('@/lib/hooks/use-user-web-connection-state', () => ({ + useUserWebConnectionState: () => false, +})); +vi.mock('@/lib/active-sessions-live-sync', () => ({ + refreshActiveSessionsNow: vi.fn().mockResolvedValue(false), +})); +vi.mock('expo-router', () => ({ + Tabs: Object.assign((props: { children: ReactNode }) => createElement('Tabs', props), { + Screen: 'TabScreen', + }), + usePathname: () => '/', + useSegments: () => ['(app)', '(tabs)', '(0_home)'], + useRouter: () => ({ replace: vi.fn() }), + useNavigation: () => ({ isFocused: () => false }), + useFocusEffect: () => undefined, + useScrollToTop: () => undefined, +})); +vi.mock('expo-haptics', () => ({ selectionAsync: vi.fn() })); +vi.mock('expo-secure-store', () => ({ getItemAsync: vi.fn().mockResolvedValue(null) })); +vi.mock('@/lib/auth/account-metadata-write', () => ({ + setAccountMetadata: vi.fn().mockResolvedValue(undefined), +})); +vi.mock('sonner-native', () => ({ toast: { error: vi.fn() } })); +vi.mock('react-native', () => ({ + Platform: { OS: 'ios' }, + AppState: { addEventListener: () => ({ remove: () => undefined }) }, + InteractionManager: { runAfterInteractions: vi.fn() }, + View: 'View', + FlatList: 'FlatList', + Pressable: 'Pressable', + RefreshControl: 'RefreshControl', + TextInput: 'TextInput', + useWindowDimensions: () => ({ fontScale: 1 }), +})); +vi.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({ bottom: 0 }) })); +vi.mock('@/components/ui/icons', () => ({ + Bot: 'Bot', + Plus: 'Plus', + House: 'House', + MessageCircle: 'MessageCircle', + MessageSquare: 'MessageSquare', + UserRound: 'UserRound', + Search: 'Search', + SlidersHorizontal: 'SlidersHorizontal', +})); +vi.mock('@/components/ui/blur-bar', () => ({ BlurBar: 'BlurBar' })); +vi.mock('@/components/ui/text', () => ({ Text: 'Text' })); +vi.mock('@/components/ui/button', () => ({ Button: 'Button' })); +vi.mock('@/components/ui/skeleton', () => ({ Skeleton: 'Skeleton' })); +vi.mock('@/components/empty-state', () => ({ EmptyState: 'EmptyState' })); +vi.mock('@/components/query-error', () => ({ QueryError: 'QueryError' })); +vi.mock('@/components/screen-header', () => ({ ScreenHeader: 'ScreenHeader' })); +vi.mock('@/components/agents/remote-session-row', () => ({ RemoteSessionRow: 'RemoteSessionRow' })); +vi.mock('@/components/agents/session-list-content', () => ({ FAB_MARGIN: 0, FAB_SIZE: 0 })); +vi.mock('@/components/agents/use-agent-session-navigator', () => ({ + useAgentSessionNavigator: () => vi.fn(), +})); +vi.mock('@/lib/a11y/announcing-toast', () => ({ announcingToast: { error: vi.fn() } })); +vi.mock('@/lib/hooks/use-theme-colors', () => ({ + useThemeColors: () => ({ foreground: '#000000', mutedForeground: '#666666' }), +})); +vi.mock('@/lib/analytics/posthog', () => ({ + FEATURE_FLAG_QUICK_CHAT: 'quick-chat', + useFeatureFlag: () => false, +})); +vi.mock('@/lib/hooks/use-kiloclaw-tab-visible', () => ({ useKiloClawTabVisible: () => false })); + +type Mount = Awaited>; +const mounts: Mount[] = []; + +function key(organizationId: string | null = null) { + return [ + ['activeSessions', 'list'], + { input: buildActiveSessionsTrayInput(organizationId), type: 'query' }, + ]; +} + +function sessions(count: number, organizationId: string | null = null): ActiveSession[] { + return Array.from({ length: count }, (_, index) => ({ + id: `${organizationId ?? 'personal'}-${index}`, + connectionId: 'cli', + title: `Session ${index}`, + status: 'busy', + organizationId, + })); +} + +function CountSurfaces() { + return createElement( + Fragment, + null, + createElement(TabsLayout), + createElement(AgentSessionListScreen) + ); +} + +async function mount(queryClient = createTestQueryClient()) { + const result = await renderWithProviders(createElement(CountSurfaces), { queryClient }); + mounts.push(result); + return result; +} + +function isHostType(item: ReactTestInstance, type: string) { + return typeof item.type === 'string' && item.type === type; +} + +function node(renderer: Mount['renderer'], type: string) { + return renderer.root.find(item => isHostType(item, type)); +} + +function agentsOptions(renderer: Mount['renderer']) { + return renderer.root.find( + item => isHostType(item, 'TabScreen') && item.props.name === '(2_agents)' + ).props.options as { title: string; tabBarBadge?: number; tabBarAccessibilityLabel: string }; +} + +function expectCounts(renderer: Mount['renderer'], count?: number, label?: string) { + expect(node(renderer, 'ScreenHeader').props.eyebrow).toBe(label); + const options = agentsOptions(renderer); + expect(options.tabBarBadge).toBe(count); + expect(options.title).toBe('Agents'); + expect(options.tabBarAccessibilityLabel).toContain('Agents'); + expect(options.tabBarAccessibilityLabel).toContain('2 of 3'); + if (label) { + expect(options.tabBarAccessibilityLabel).toContain(label); + } else { + expect(options.tabBarAccessibilityLabel).not.toContain('LIVE'); + } +} + +function rerender({ renderer, queryClient }: Mount) { + act(() => { + renderer.update( + createElement(QueryClientProvider, { client: queryClient }, createElement(CountSurfaces)) + ); + }); +} + +describe('Agents live count surfaces', () => { + beforeEach(() => { + (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + organization.organizationId = null; + organization.isLoaded = true; + fetchSessions.mockReset(); + fetchSessions.mockReturnValue(new Promise(() => undefined)); + }); + + afterEach(() => { + for (const result of mounts) { + result.unmount(); + } + mounts.length = 0; + }); + + it.each([ + { count: 1, label: '1 LIVE' }, + { count: 3, label: '3 LIVE' }, + { count: 4, label: '4 LIVE' }, + { count: 12, label: '12 LIVE' }, + ])( + 'shares the active cache and updates to $count while Home has focus', + async ({ count, label }) => { + const queryClient = createTestQueryClient(); + queryClient.setQueryData(key(), { sessions: [] }); + const { renderer } = await mount(queryClient); + expectCounts(renderer); + expect(queryClient.getQueryCache().getAll()).toHaveLength(1); + expect(queryClient.getQueryCache().find({ queryKey: key() })?.getObserversCount()).toBe(2); + + act(() => { + queryClient.setQueryData(key(), { + sessions: [ + ...sessions(count), + ...sessions(2, 'other-org'), + { id: 'unenriched', connectionId: 'cli', title: 'Unknown owner', status: 'busy' }, + ], + }); + }); + await waitFor(() => agentsOptions(renderer).tabBarBadge === count); + expectCounts(renderer, count, label); + + act(() => { + queryClient.setQueryData(key(), { sessions: [] }); + }); + await waitFor(() => agentsOptions(renderer).tabBarBadge === undefined); + expectCounts(renderer); + } + ); + + it('hides counts while the initial live query loads', async () => { + const { renderer, queryClient } = await mount(); + expect(queryClient.getQueryState(key())?.fetchStatus).toBe('fetching'); + expectCounts(renderer); + }); + + it('hides cached counts and disables fetching until the organization loads', async () => { + organization.isLoaded = false; + const queryClient = createTestQueryClient(); + queryClient.setQueryData(key(), { sessions: sessions(3) }, { updatedAt: 0 }); + const result = await mount(queryClient); + expectCounts(result.renderer); + expect(queryClient.getQueryState(key())?.fetchStatus).toBe('idle'); + + fetchSessions.mockResolvedValue({ sessions: sessions(4) }); + organization.isLoaded = true; + rerender(result); + await waitFor(() => agentsOptions(result.renderer).tabBarBadge === 4); + expectCounts(result.renderer, 4, '4 LIVE'); + }); + + it('hides counts after a fetch failure and restores them through Retry', async () => { + fetchSessions.mockRejectedValue(new TypeError('Network request failed')); + const { renderer } = await mount(); + await waitFor(() => renderer.root.findAll(item => isHostType(item, 'QueryError')).length === 1); + expectCounts(renderer); + + fetchSessions.mockResolvedValue({ sessions: sessions(1) }); + const retry = node(renderer, 'QueryError').props.onRetry as () => void; + act(retry); + await waitFor(() => agentsOptions(renderer).tabBarBadge === 1); + expectCounts(renderer, 1, '1 LIVE'); + }); + + it('hides counts but retains cached rows after refetch failure, then recovers through refresh', async () => { + const queryClient = createTestQueryClient(); + const cachedRows = sessions(3); + queryClient.setQueryData(key(), { sessions: cachedRows }); + const { renderer } = await mount(queryClient); + expectCounts(renderer, 3, '3 LIVE'); + fetchSessions.mockRejectedValue(new TypeError('Network request failed')); + await act(async () => { + await queryClient.refetchQueries({ queryKey: key() }); + }); + await waitFor(() => agentsOptions(renderer).tabBarBadge === undefined); + expectCounts(renderer); + expect(node(renderer, 'FlatList').props.data).toEqual(expect.arrayContaining(cachedRows)); + expect(node(renderer, 'FlatList').props.data).toHaveLength(3); + expect(renderer.root.findAll(item => isHostType(item, 'QueryError'))).toHaveLength(0); + + fetchSessions.mockResolvedValue({ sessions: sessions(4) }); + const refreshControl = node(renderer, 'FlatList').props.refreshControl as { + props: { onRefresh: () => void }; + }; + act(refreshControl.props.onRefresh); + await waitFor(() => agentsOptions(renderer).tabBarBadge === 4); + expectCounts(renderer, 4, '4 LIVE'); + }); + + it('never carries the previous organization count through loading or authorization failure', async () => { + organization.organizationId = 'org-a'; + const queryClient = createTestQueryClient(); + queryClient.setQueryData(key('org-a'), { sessions: sessions(4, 'org-a') }); + const result = await mount(queryClient); + expectCounts(result.renderer, 4, '4 LIVE'); + + const pending = Promise.withResolvers<{ sessions: ActiveSession[] }>(); + fetchSessions.mockReturnValue(pending.promise); + organization.organizationId = 'org-b'; + rerender(result); + expectCounts(result.renderer); + expect(queryClient.getQueryState(key('org-b'))?.fetchStatus).toBe('fetching'); + act(() => { + pending.reject(Object.assign(new Error('Unauthorized'), { data: { code: 'UNAUTHORIZED' } })); + }); + await waitFor( + () => result.renderer.root.findAll(item => isHostType(item, 'QueryError')).length === 1 + ); + expectCounts(result.renderer); + + act(() => { + queryClient.setQueryData(key('org-a'), { sessions: sessions(12, 'org-a') }); + queryClient.setQueryData(key('org-b'), { + sessions: [...sessions(1, 'org-b'), ...sessions(4, 'org-a')], + }); + }); + await waitFor(() => agentsOptions(result.renderer).tabBarBadge === 1); + expectCounts(result.renderer, 1, '1 LIVE'); + expect( + queryClient + .getQueryCache() + .find({ queryKey: key('org-a') }) + ?.getObserversCount() + ).toBe(0); + expect( + queryClient + .getQueryCache() + .find({ queryKey: key('org-b') }) + ?.getObserversCount() + ).toBe(2); + }); +}); diff --git a/apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx b/apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx index 791452aea0..4430fc9bc1 100644 --- a/apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx +++ b/apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx @@ -87,7 +87,12 @@ vi.mock('@tanstack/react-query', () => ({ })); vi.mock('react-i18next', () => ({ useTranslation: () => ({ - t: (key: string, options?: { label: string }) => (options ? `${key}: ${options.label}` : key), + t: (key: string, options?: { count?: number; label?: string }) => { + if (key === 'agents.liveCount' && options?.count !== undefined) { + return `${options.count} LIVE`; + } + return options?.label !== undefined ? `${key}: ${options.label}` : key; + }, }), })); vi.mock('@/i18n', () => ({ @@ -206,11 +211,14 @@ async function renderScreen(): Promise { type HeaderElement = { type: string; props: Record }; -function headerRightOf(renderer: MountedRenderer) { - const header = renderer.root.find( +function headerOf(renderer: MountedRenderer) { + return renderer.root.find( node => typeof node.type === 'string' && (node.type as string) === 'ScreenHeader' ); - return header.props.headerRight as HeaderElement; +} + +function headerRightOf(renderer: MountedRenderer) { + return headerOf(renderer).props.headerRight as HeaderElement; } function headerActionsOf(renderer: MountedRenderer): HeaderElement[] { @@ -663,6 +671,35 @@ describe('AgentSessionListScreen live tab', () => { ).toHaveLength(1); }); + it.each([ + { count: 1, label: '1 LIVE' }, + { count: 3, label: '3 LIVE' }, + { count: 4, label: '4 LIVE' }, + { count: 12, label: '12 LIVE' }, + ])('shows $label above Agents for the full live list', async ({ count, label }) => { + sessionListState.activeSessions = Array.from({ length: count }, (_, index) => ({ + id: `session-${index}`, + organizationId: null, + })); + const renderer = await renderScreen(); + + expect(headerOf(renderer).props.eyebrow).toBe(label); + expect(headerOf(renderer).props.title).toBe('tabs.agents'); + }); + + it.each([ + { state: 'loading', isLoading: true, orgLoaded: true }, + { state: 'unknown organization', isLoading: false, orgLoaded: false }, + ])('hides a cached count during $state', async ({ isLoading, orgLoaded }) => { + sessionListState.activeSessions = [{ id: 'a1', organizationId: null }]; + sessionListState.isLoading = isLoading; + orgState.isLoaded = orgLoaded; + const renderer = await renderScreen(); + + expect(headerOf(renderer).props.eyebrow).toBeUndefined(); + expect(findTypeCount(renderer, 'FlatList')).toBe(1); + }); + it('treats a not-loaded org as loading so the empty state cannot flash', async () => { orgState.isLoaded = false; sessionListState.isLoading = false; diff --git a/apps/mobile/src/components/agents/session-list-screen.tsx b/apps/mobile/src/components/agents/session-list-screen.tsx index 5e8942696d..64762c2cc3 100644 --- a/apps/mobile/src/components/agents/session-list-screen.tsx +++ b/apps/mobile/src/components/agents/session-list-screen.tsx @@ -276,6 +276,11 @@ export function AgentSessionListScreen() { ({ vi.mock('@/lib/organization-context', () => ({ useOrganization: () => ({ organizationId: organizationId.value, isLoaded: orgLoaded.value }), })); +vi.mock('@/lib/hooks/use-agent-sessions', () => ({ + useLiveAgentSessions: () => ({ activeSessions: [], isLoading: false, isError: false }), +})); vi.mock('@/lib/hooks/use-current-user-id', () => ({ useCurrentUserId: () => ({ userId: 'u-1', diff --git a/apps/mobile/src/i18n/agents-live-count.test.ts b/apps/mobile/src/i18n/agents-live-count.test.ts new file mode 100644 index 0000000000..7505b0efa0 --- /dev/null +++ b/apps/mobile/src/i18n/agents-live-count.test.ts @@ -0,0 +1,29 @@ +import { createInstance } from 'i18next'; +import { describe, expect, it } from 'vitest'; + +import en from './locales/en.json'; + +const i18n = createInstance(); +await i18n.init({ + resources: { en: { translation: en } }, + lng: 'en', + fallbackLng: 'en', + compatibilityJSON: 'v4', + interpolation: { escapeValue: false }, + initAsync: false, + returnNull: false, +}); + +describe('agents.liveCount', () => { + it.each([ + { count: 1, text: '1 LIVE', key: 'agents.liveCount_one' }, + { count: 3, text: '3 LIVE', key: 'agents.liveCount_other' }, + { count: 4, text: '4 LIVE', key: 'agents.liveCount_other' }, + { count: 12, text: '12 LIVE', key: 'agents.liveCount_other' }, + ])('resolves $count through $key', ({ count, text, key }) => { + expect(i18n.t('agents.liveCount', { count, returnDetails: true })).toMatchObject({ + res: text, + exactUsedKey: key, + }); + }); +}); diff --git a/apps/mobile/src/i18n/locales/af.json b/apps/mobile/src/i18n/locales/af.json index 9515eb9a6f..51ac943ccf 100644 --- a/apps/mobile/src/i18n/locales/af.json +++ b/apps/mobile/src/i18n/locales/af.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sessie beëindig", "remoteSpawnRetryable": "Kon nie die instansie bereik nie — dit het moontlik ontkoppel.", "remoteSpawnNonRetryable": "Die instansie kon nie die sessie begin nie — kontroleer die masjien of werk die CLI op.", - "remoteSpawnInstanceDisconnected": "Die gekose instansie het ontkoppel. Begin 'n sessie op Cloud Agent of kies 'n ander instansie." + "remoteSpawnInstanceDisconnected": "Die gekose instansie het ontkoppel. Begin 'n sessie op Cloud Agent of kies 'n ander instansie.", + "liveCount_one": "{{count}} LEWEND", + "liveCount_other": "{{count}} LEWEND" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/am.json b/apps/mobile/src/i18n/locales/am.json index c87dd43ef4..8cdcb5cbc0 100644 --- a/apps/mobile/src/i18n/locales/am.json +++ b/apps/mobile/src/i18n/locales/am.json @@ -2114,7 +2114,9 @@ "sessionExited": "ክፍለ ጊዜው ወጥቷል", "remoteSpawnRetryable": "እንደገና መድረስ አልተቻለም — ተቋርጦ ሊሆን ይችላል።", "remoteSpawnNonRetryable": "ክፍለ ጊዜውን መጀመር አልተሳካም — ማሽኑን ያረጋግጡ ወይም CLI ን ያዘምኑ።", - "remoteSpawnInstanceDisconnected": "የተመረጠው እንደጠየቀ አካል ተቋርጧል። በCloud Agent ላይ ክፍለ ጊዜ ይጀምሩ ወይም ሌላ እንደጠየቀ ይምረጡ።" + "remoteSpawnInstanceDisconnected": "የተመረጠው እንደጠየቀ አካል ተቋርጧል። በCloud Agent ላይ ክፍለ ጊዜ ይጀምሩ ወይም ሌላ እንደጠየቀ ይምረጡ።", + "liveCount_one": "{{count}} ቀጥታ", + "liveCount_other": "{{count}} ቀጥታ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ar.json b/apps/mobile/src/i18n/locales/ar.json index 99d32a2ad0..b8dca5e799 100644 --- a/apps/mobile/src/i18n/locales/ar.json +++ b/apps/mobile/src/i18n/locales/ar.json @@ -1692,7 +1692,13 @@ "sessionExited": "انتهت الجلسة", "remoteSpawnRetryable": "تعذّر الوصول إلى المثيل — ربما انقطع الاتصال.", "remoteSpawnNonRetryable": "فشل المثيل في بدء الجلسة — تحقق من الجهاز أو حدّث CLI.", - "remoteSpawnInstanceDisconnected": "انقطع الاتصال بالمثيل المحدد. ابدأ جلسة على Cloud Agent أو اختر مثيلًا آخر." + "remoteSpawnInstanceDisconnected": "انقطع الاتصال بالمثيل المحدد. ابدأ جلسة على Cloud Agent أو اختر مثيلًا آخر.", + "liveCount_one": "{{count}} مباشر", + "liveCount_other": "{{count}} مباشر", + "liveCount_zero": "{{count}} مباشر", + "liveCount_two": "{{count}} مباشر", + "liveCount_few": "{{count}} مباشر", + "liveCount_many": "{{count}} مباشر" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/az.json b/apps/mobile/src/i18n/locales/az.json index f13a200b7c..322f432699 100644 --- a/apps/mobile/src/i18n/locales/az.json +++ b/apps/mobile/src/i18n/locales/az.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sessiya başa çatdı", "remoteSpawnRetryable": "İnstansa çatmaq mümkün olmadı — o, əlaqəsi kəsilmiş ola bilər.", "remoteSpawnNonRetryable": "İnstans sessiyanı başlada bilmədi — maşını yoxlayın və ya CLI-ni yeniləyin.", - "remoteSpawnInstanceDisconnected": "Seçilmiş instansın əlaqəsi kəsildi. Cloud Agent-də sessiya başladın və ya başqa instans seçin." + "remoteSpawnInstanceDisconnected": "Seçilmiş instansın əlaqəsi kəsildi. Cloud Agent-də sessiya başladın və ya başqa instans seçin.", + "liveCount_one": "{{count}} CANLI", + "liveCount_other": "{{count}} CANLI" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/be.json b/apps/mobile/src/i18n/locales/be.json index 3b181d2a7a..e2bb9b2758 100644 --- a/apps/mobile/src/i18n/locales/be.json +++ b/apps/mobile/src/i18n/locales/be.json @@ -2144,7 +2144,11 @@ "sessionExited": "Сеанс завершаны", "remoteSpawnRetryable": "Не ўдалося злучыцца з інстансам — магчыма, ён адключыўся.", "remoteSpawnNonRetryable": "Інстанс не змог запусціць сеанс — праверце машыну або абнавіце CLI.", - "remoteSpawnInstanceDisconnected": "Выбраны інстанс адключыўся. Запусціце сеанс у Cloud Agent або абярыце іншы інстанс." + "remoteSpawnInstanceDisconnected": "Выбраны інстанс адключыўся. Запусціце сеанс у Cloud Agent або абярыце іншы інстанс.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE", + "liveCount_few": "{{count}} LIVE", + "liveCount_many": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/bg.json b/apps/mobile/src/i18n/locales/bg.json index 3c6fdb73b1..28c4d9e149 100644 --- a/apps/mobile/src/i18n/locales/bg.json +++ b/apps/mobile/src/i18n/locales/bg.json @@ -2114,7 +2114,9 @@ "sessionExited": "Сесията е прекратена", "remoteSpawnRetryable": "Не може да се достигне инстанцията — вероятно се е прекъснала връзката.", "remoteSpawnNonRetryable": "Инстанцията не успя да стартира сесията — проверете машината или актуализирайте CLI.", - "remoteSpawnInstanceDisconnected": "Избраната инстанция се прекъсна. Стартирайте сесия в Cloud Agent или изберете друга инстанция." + "remoteSpawnInstanceDisconnected": "Избраната инстанция се прекъсна. Стартирайте сесия в Cloud Agent или изберете друга инстанция.", + "liveCount_one": "{{count}} НА ЖИВО", + "liveCount_other": "{{count}} НА ЖИВО" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/bn.json b/apps/mobile/src/i18n/locales/bn.json index 649ac61d1a..f92262eab2 100644 --- a/apps/mobile/src/i18n/locales/bn.json +++ b/apps/mobile/src/i18n/locales/bn.json @@ -2114,7 +2114,9 @@ "sessionExited": "সেশন শেষ হয়েছে", "remoteSpawnRetryable": "ইনস্ট্যান্সে পৌঁছানো যায়নি — এটি সংযোগ বিচ্ছিন্ন হতে পারে।", "remoteSpawnNonRetryable": "ইনস্ট্যান্সটি সেশন শুরু করতে ব্যর্থ হয়েছে — মেশিনটি পরীক্ষা করুন বা CLI আপডেট করুন।", - "remoteSpawnInstanceDisconnected": "নির্বাচিত ইনস্ট্যান্সটি সংযোগ বিচ্ছিন্ন হয়েছে। Cloud Agent-এ একটি সেশন শুরু করুন বা অন্য একটি ইনস্ট্যান্স বেছে নিন।" + "remoteSpawnInstanceDisconnected": "নির্বাচিত ইনস্ট্যান্সটি সংযোগ বিচ্ছিন্ন হয়েছে। Cloud Agent-এ একটি সেশন শুরু করুন বা অন্য একটি ইনস্ট্যান্স বেছে নিন।", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/bs.json b/apps/mobile/src/i18n/locales/bs.json index 5440306f54..b012fc67b1 100644 --- a/apps/mobile/src/i18n/locales/bs.json +++ b/apps/mobile/src/i18n/locales/bs.json @@ -2129,7 +2129,10 @@ "sessionExited": "Sesija je završena", "remoteSpawnRetryable": "Nismo mogli doći do instance — možda se odspojila.", "remoteSpawnNonRetryable": "Instanca nije uspjela pokrenuti sesiju — provjerite mašinu ili ažurirajte CLI.", - "remoteSpawnInstanceDisconnected": "Odabrana instanca se odspojila. Pokrenite sesiju na Cloud Agent-u ili odaberite drugu instancu." + "remoteSpawnInstanceDisconnected": "Odabrana instanca se odspojila. Pokrenite sesiju na Cloud Agent-u ili odaberite drugu instancu.", + "liveCount_one": "{{count}} UŽIVO", + "liveCount_other": "{{count}} UŽIVO", + "liveCount_few": "{{count}} UŽIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ca.json b/apps/mobile/src/i18n/locales/ca.json index 0f05eca86c..2b8b54fdd3 100644 --- a/apps/mobile/src/i18n/locales/ca.json +++ b/apps/mobile/src/i18n/locales/ca.json @@ -2129,7 +2129,10 @@ "sessionExited": "La sessió ha finalitzat", "remoteSpawnRetryable": "No s'ha pogut arribar a la instància: potser s'ha desconnectat.", "remoteSpawnNonRetryable": "La instància no ha pogut iniciar la sessió: comproveu la màquina o actualitzeu la CLI.", - "remoteSpawnInstanceDisconnected": "La instància seleccionada s'ha desconnectat. Inicieu una sessió a Cloud Agent o trieu una altra instància." + "remoteSpawnInstanceDisconnected": "La instància seleccionada s'ha desconnectat. Inicieu una sessió a Cloud Agent o trieu una altra instància.", + "liveCount_one": "{{count}} EN DIRECTE", + "liveCount_other": "{{count}} EN DIRECTE", + "liveCount_many": "{{count}} EN DIRECTE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ckb.json b/apps/mobile/src/i18n/locales/ckb.json index da057add7b..dea8f78f4a 100644 --- a/apps/mobile/src/i18n/locales/ckb.json +++ b/apps/mobile/src/i18n/locales/ckb.json @@ -2114,7 +2114,9 @@ "sessionExited": "سێشن دەرچوو", "remoteSpawnRetryable": "نەگەیشتینە نموونەکە — لەوانەیە پەیوەندییەکە پچڕابێت.", "remoteSpawnNonRetryable": "نموونەکە نەیتوانی دانیشتنەکە دەستپێبکات — ئامێرەکە بپشکنە یان CLI نوێ بکەرەوە.", - "remoteSpawnInstanceDisconnected": "نموونەی هەڵبژێردراو پەیوەندییەکەی پچڕا. لە Cloud Agent دانیشتنێک دەستپێبکە یان نموونەیەکی دیکە هەڵبژێرە." + "remoteSpawnInstanceDisconnected": "نموونەی هەڵبژێردراو پەیوەندییەکەی پچڕا. لە Cloud Agent دانیشتنێک دەستپێبکە یان نموونەیەکی دیکە هەڵبژێرە.", + "liveCount_one": "{{count}} ڕاستەوخۆ", + "liveCount_other": "{{count}} ڕاستەوخۆ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/cs.json b/apps/mobile/src/i18n/locales/cs.json index 3193ea3383..0354d5e282 100644 --- a/apps/mobile/src/i18n/locales/cs.json +++ b/apps/mobile/src/i18n/locales/cs.json @@ -2144,7 +2144,11 @@ "sessionExited": "Relace ukončena", "remoteSpawnRetryable": "Instanci se nepodařilo dosáhnout — mohla se odpojit.", "remoteSpawnNonRetryable": "Instanci se nepodařilo spustit relaci — zkontrolujte stroj nebo aktualizujte CLI.", - "remoteSpawnInstanceDisconnected": "Vybraná instance se odpojila. Spusťte relaci na Cloud Agent nebo vyberte jinou instanci." + "remoteSpawnInstanceDisconnected": "Vybraná instance se odpojila. Spusťte relaci na Cloud Agent nebo vyberte jinou instanci.", + "liveCount_one": "{{count}} ŽIVĚ", + "liveCount_other": "{{count}} ŽIVĚ", + "liveCount_few": "{{count}} ŽIVĚ", + "liveCount_many": "{{count}} ŽIVĚ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/cy.json b/apps/mobile/src/i18n/locales/cy.json index 7693c2aeea..9cd27e03e3 100644 --- a/apps/mobile/src/i18n/locales/cy.json +++ b/apps/mobile/src/i18n/locales/cy.json @@ -2174,7 +2174,13 @@ "sessionExited": "Wedi gadael y sesiwn", "remoteSpawnRetryable": "Ni ellid cyrraedd yr enghraifft — efallai iddi ddatgysylltu.", "remoteSpawnNonRetryable": "Methodd yr enghraifft â chychwyn y sesiwn — gwiriwch y peiriant neu diweddarwch y CLI.", - "remoteSpawnInstanceDisconnected": "Datgysylltodd yr enghraifft a ddewiswyd. Cychwynnwch sesiwn ar Cloud Agent neu dewiswch enghraifft arall." + "remoteSpawnInstanceDisconnected": "Datgysylltodd yr enghraifft a ddewiswyd. Cychwynnwch sesiwn ar Cloud Agent neu dewiswch enghraifft arall.", + "liveCount_one": "{{count}} BYW", + "liveCount_other": "{{count}} BYW", + "liveCount_zero": "{{count}} BYW", + "liveCount_two": "{{count}} BYW", + "liveCount_few": "{{count}} BYW", + "liveCount_many": "{{count}} BYW" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/da.json b/apps/mobile/src/i18n/locales/da.json index 100fab6614..363cd62d26 100644 --- a/apps/mobile/src/i18n/locales/da.json +++ b/apps/mobile/src/i18n/locales/da.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sessionen blev afsluttet", "remoteSpawnRetryable": "Kunne ikke nå instansen — den er måske blevet afbrudt.", "remoteSpawnNonRetryable": "Instansen kunne ikke starte sessionen — kontrollér maskinen eller opdater CLI'en.", - "remoteSpawnInstanceDisconnected": "Den valgte instans blev afbrudt. Start en session på Cloud Agent, eller vælg en anden instans." + "remoteSpawnInstanceDisconnected": "Den valgte instans blev afbrudt. Start en session på Cloud Agent, eller vælg en anden instans.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/de.json b/apps/mobile/src/i18n/locales/de.json index feafc02b7b..73ff88a722 100644 --- a/apps/mobile/src/i18n/locales/de.json +++ b/apps/mobile/src/i18n/locales/de.json @@ -1660,7 +1660,9 @@ "sessionExited": "Sitzung beendet", "remoteSpawnRetryable": "Die Instanz konnte nicht erreicht werden – sie wurde möglicherweise getrennt.", "remoteSpawnNonRetryable": "Die Instanz konnte die Sitzung nicht starten – überprüfe die Maschine oder aktualisiere die CLI.", - "remoteSpawnInstanceDisconnected": "Die ausgewählte Instanz wurde getrennt. Starte eine Sitzung auf Cloud Agent oder wähle eine andere Instanz." + "remoteSpawnInstanceDisconnected": "Die ausgewählte Instanz wurde getrennt. Starte eine Sitzung auf Cloud Agent oder wähle eine andere Instanz.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/el.json b/apps/mobile/src/i18n/locales/el.json index 8c5e2ba16f..c1ff111cf1 100644 --- a/apps/mobile/src/i18n/locales/el.json +++ b/apps/mobile/src/i18n/locales/el.json @@ -2114,7 +2114,9 @@ "sessionExited": "Η συνεδρία τερματίστηκε", "remoteSpawnRetryable": "Δεν ήταν δυνατή η πρόσβαση στην παρουσία — μπορεί να αποσυνδέθηκε.", "remoteSpawnNonRetryable": "Η παρουσία απέτυχε να ξεκινήσει τη συνεδρία — ελέγξτε τη μηχανή ή ενημερώστε το CLI.", - "remoteSpawnInstanceDisconnected": "Η επιλεγμένη παρουσία αποσυνδέθηκε. Ξεκινήστε μια συνεδρία στο Cloud Agent ή επιλέξτε άλλη παρουσία." + "remoteSpawnInstanceDisconnected": "Η επιλεγμένη παρουσία αποσυνδέθηκε. Ξεκινήστε μια συνεδρία στο Cloud Agent ή επιλέξτε άλλη παρουσία.", + "liveCount_one": "{{count}} ΖΩΝΤΑΝΑ", + "liveCount_other": "{{count}} ΖΩΝΤΑΝΑ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/en.json b/apps/mobile/src/i18n/locales/en.json index 373297d84f..a0122fff78 100644 --- a/apps/mobile/src/i18n/locales/en.json +++ b/apps/mobile/src/i18n/locales/en.json @@ -2067,6 +2067,8 @@ } }, "agents": { + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE", "search": { "searching": "Searching", "searchSessions": "Search sessions", diff --git a/apps/mobile/src/i18n/locales/es.json b/apps/mobile/src/i18n/locales/es.json index 92c6dc6aa2..9d94c0eafe 100644 --- a/apps/mobile/src/i18n/locales/es.json +++ b/apps/mobile/src/i18n/locales/es.json @@ -1668,7 +1668,10 @@ "sessionExited": "La sesión finalizó", "remoteSpawnRetryable": "No se pudo conectar con la instancia: es posible que se haya desconectado.", "remoteSpawnNonRetryable": "La instancia no pudo iniciar la sesión: revisa la máquina o actualiza la CLI.", - "remoteSpawnInstanceDisconnected": "La instancia seleccionada se desconectó. Inicia una sesión en Cloud Agent o elige otra instancia." + "remoteSpawnInstanceDisconnected": "La instancia seleccionada se desconectó. Inicia una sesión en Cloud Agent o elige otra instancia.", + "liveCount_one": "{{count}} EN VIVO", + "liveCount_other": "{{count}} EN VIVO", + "liveCount_many": "{{count}} EN VIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/et.json b/apps/mobile/src/i18n/locales/et.json index 5b48d287ce..196c791c6a 100644 --- a/apps/mobile/src/i18n/locales/et.json +++ b/apps/mobile/src/i18n/locales/et.json @@ -2114,7 +2114,9 @@ "sessionExited": "Seanss lõpetatud", "remoteSpawnRetryable": "Ei õnnestunud instantsini jõuda — see võis ühenduse katkestada.", "remoteSpawnNonRetryable": "Instants ei suutnud seanssi alustada — kontrolli masinat või uuenda CLI-d.", - "remoteSpawnInstanceDisconnected": "Valitud instants lõpetas ühenduse. Alusta seanss Cloud Agent'is või vali mõni teine instants." + "remoteSpawnInstanceDisconnected": "Valitud instants lõpetas ühenduse. Alusta seanss Cloud Agent'is või vali mõni teine instants.", + "liveCount_one": "{{count}} OTSE", + "liveCount_other": "{{count}} OTSE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/eu.json b/apps/mobile/src/i18n/locales/eu.json index b16c2a3de3..e5d2d0b205 100644 --- a/apps/mobile/src/i18n/locales/eu.json +++ b/apps/mobile/src/i18n/locales/eu.json @@ -2114,7 +2114,9 @@ "sessionExited": "Saioa itxi da", "remoteSpawnRetryable": "Ezin izan da instantziara iritsi; baliteke deskonektatuta egotea.", "remoteSpawnNonRetryable": "Instantziak ezin izan du saioa hasi; egiaztatu makina edo eguneratu CLI-a.", - "remoteSpawnInstanceDisconnected": "Hautatutako instantzia deskonektatu da. Hasi saioa Cloud Agent-en edo aukeratu beste instantzia bat." + "remoteSpawnInstanceDisconnected": "Hautatutako instantzia deskonektatu da. Hasi saioa Cloud Agent-en edo aukeratu beste instantzia bat.", + "liveCount_one": "{{count}} ZUZENEAN", + "liveCount_other": "{{count}} ZUZENEAN" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/fa.json b/apps/mobile/src/i18n/locales/fa.json index 1e46ec9b7c..410fb6d53a 100644 --- a/apps/mobile/src/i18n/locales/fa.json +++ b/apps/mobile/src/i18n/locales/fa.json @@ -2114,7 +2114,9 @@ "sessionExited": "جلسه خاتمه یافت", "remoteSpawnRetryable": "امکان دسترسی به نمونه وجود نداشت — شاید قطع شده باشد.", "remoteSpawnNonRetryable": "نمونه نتوانست جلسه را شروع کند — دستگاه را بررسی کنید یا CLI را بهروزرسانی کنید.", - "remoteSpawnInstanceDisconnected": "نمونه انتخابی قطع شد. یک جلسه در Cloud Agent شروع کنید یا نمونه دیگری انتخاب کنید." + "remoteSpawnInstanceDisconnected": "نمونه انتخابی قطع شد. یک جلسه در Cloud Agent شروع کنید یا نمونه دیگری انتخاب کنید.", + "liveCount_one": "{{count}} زنده", + "liveCount_other": "{{count}} زنده" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/fi.json b/apps/mobile/src/i18n/locales/fi.json index e8b5347b82..47136950d2 100644 --- a/apps/mobile/src/i18n/locales/fi.json +++ b/apps/mobile/src/i18n/locales/fi.json @@ -2114,7 +2114,9 @@ "sessionExited": "Istunto päättyi", "remoteSpawnRetryable": "Yhteyttä instanssiin ei saatu — se on voinut katketa.", "remoteSpawnNonRetryable": "Instanssi ei käynnistänyt istuntoa — tarkista kone tai päivitä CLI.", - "remoteSpawnInstanceDisconnected": "Valittu instanssi katkaisi yhteyden. Aloita istunto Cloud Agentissa tai valitse toinen instanssi." + "remoteSpawnInstanceDisconnected": "Valittu instanssi katkaisi yhteyden. Aloita istunto Cloud Agentissa tai valitse toinen instanssi.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/fil.json b/apps/mobile/src/i18n/locales/fil.json index 78a64d5a1c..beec47710f 100644 --- a/apps/mobile/src/i18n/locales/fil.json +++ b/apps/mobile/src/i18n/locales/fil.json @@ -2114,7 +2114,9 @@ "sessionExited": "Lumabas sa session", "remoteSpawnRetryable": "Hindi maabot ang instance — maaaring nadiskonekta ito.", "remoteSpawnNonRetryable": "Nabigong simulan ang session ng instance — suriin ang machine o i-update ang CLI.", - "remoteSpawnInstanceDisconnected": "Nadiskonekta ang napiling instance. Magsimula ng session sa Cloud Agent o pumili ng ibang instance." + "remoteSpawnInstanceDisconnected": "Nadiskonekta ang napiling instance. Magsimula ng session sa Cloud Agent o pumili ng ibang instance.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/fr.json b/apps/mobile/src/i18n/locales/fr.json index 43ada592e8..817f520e3e 100644 --- a/apps/mobile/src/i18n/locales/fr.json +++ b/apps/mobile/src/i18n/locales/fr.json @@ -2534,7 +2534,10 @@ "sessionExited": "Session terminée", "remoteSpawnRetryable": "Impossible d'atteindre l'instance — elle s'est peut-être déconnectée.", "remoteSpawnNonRetryable": "L'instance n'a pas pu démarrer la session — vérifiez la machine ou mettez à jour le CLI.", - "remoteSpawnInstanceDisconnected": "L'instance sélectionnée s'est déconnectée. Démarrez une session sur Cloud Agent ou choisissez une autre instance." + "remoteSpawnInstanceDisconnected": "L'instance sélectionnée s'est déconnectée. Démarrez une session sur Cloud Agent ou choisissez une autre instance.", + "liveCount_one": "{{count}} EN DIRECT", + "liveCount_other": "{{count}} EN DIRECT", + "liveCount_many": "{{count}} EN DIRECT" }, "monoScrollBlock": { "contentTruncated": "Contenu tronqué", diff --git a/apps/mobile/src/i18n/locales/ga.json b/apps/mobile/src/i18n/locales/ga.json index 519e3fcc4d..388c77826c 100644 --- a/apps/mobile/src/i18n/locales/ga.json +++ b/apps/mobile/src/i18n/locales/ga.json @@ -2159,7 +2159,12 @@ "sessionExited": "Scoir an seisiún", "remoteSpawnRetryable": "Níorbh fhéidir an t-instance a bhaint amach — seans gur dícheanglaíodh é.", "remoteSpawnNonRetryable": "Theip ar an instance an seisiún a thosú — seiceáil an meaisín nó nuashonraigh an CLI.", - "remoteSpawnInstanceDisconnected": "Dícheanglaíodh an instance roghnaithe. Tosaigh seisiún ar Cloud Agent nó roghnaigh instance eile." + "remoteSpawnInstanceDisconnected": "Dícheanglaíodh an instance roghnaithe. Tosaigh seisiún ar Cloud Agent nó roghnaigh instance eile.", + "liveCount_one": "{{count}} BEO", + "liveCount_other": "{{count}} BEO", + "liveCount_two": "{{count}} BEO", + "liveCount_few": "{{count}} BEO", + "liveCount_many": "{{count}} BEO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/gl.json b/apps/mobile/src/i18n/locales/gl.json index 15e388c03a..6dcbed0ad1 100644 --- a/apps/mobile/src/i18n/locales/gl.json +++ b/apps/mobile/src/i18n/locales/gl.json @@ -2114,7 +2114,9 @@ "sessionExited": "A sesión saíu", "remoteSpawnRetryable": "Non se puido alcanzar a instancia; é posible que se desconectase.", "remoteSpawnNonRetryable": "A instancia non puido iniciar a sesión; comprobe a máquina ou actualice a CLI.", - "remoteSpawnInstanceDisconnected": "A instancia seleccionada desconectouse. Inicie unha sesión en Cloud Agent ou elixa outra instancia." + "remoteSpawnInstanceDisconnected": "A instancia seleccionada desconectouse. Inicie unha sesión en Cloud Agent ou elixa outra instancia.", + "liveCount_one": "{{count}} EN DIRECTO", + "liveCount_other": "{{count}} EN DIRECTO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/gu.json b/apps/mobile/src/i18n/locales/gu.json index ae2219aa8d..880367df8f 100644 --- a/apps/mobile/src/i18n/locales/gu.json +++ b/apps/mobile/src/i18n/locales/gu.json @@ -2114,7 +2114,9 @@ "sessionExited": "સત્ર બહાર નીકળ્યું", "remoteSpawnRetryable": "ઇન્સ્ટન્સ સુધી પહોંચી શકાયું નહીં — તે ડિસ્કનેક્ટ થયું હોઈ શકે છે.", "remoteSpawnNonRetryable": "ઇન્સ્ટન્સ સત્ર શરૂ કરવામાં નિષ્ફળ ગયું — મશીન તપાસો અથવા CLI અપડેટ કરો.", - "remoteSpawnInstanceDisconnected": "પસંદ કરેલ ઇન્સ્ટન્સ ડિસ્કનેક્ટ થયું. Cloud Agent પર સત્ર શરૂ કરો અથવા બીજું ઇન્સ્ટન્સ પસંદ કરો." + "remoteSpawnInstanceDisconnected": "પસંદ કરેલ ઇન્સ્ટન્સ ડિસ્કનેક્ટ થયું. Cloud Agent પર સત્ર શરૂ કરો અથવા બીજું ઇન્સ્ટન્સ પસંદ કરો.", + "liveCount_one": "{{count}} લાઇવ", + "liveCount_other": "{{count}} લાઇવ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ha.json b/apps/mobile/src/i18n/locales/ha.json index 2d8364258a..28f50836c5 100644 --- a/apps/mobile/src/i18n/locales/ha.json +++ b/apps/mobile/src/i18n/locales/ha.json @@ -2114,7 +2114,9 @@ "sessionExited": "Zaman ya fita", "remoteSpawnRetryable": "An kasa isa ga instance — yana iya zama an yanke.", "remoteSpawnNonRetryable": "Instance ta kasa fara zaman — duba na'urar ko sabunta CLI.", - "remoteSpawnInstanceDisconnected": "Instance da aka zaɓa ta yanke. Fara zama a Cloud Agent ko zaɓi wata instance." + "remoteSpawnInstanceDisconnected": "Instance da aka zaɓa ta yanke. Fara zama a Cloud Agent ko zaɓi wata instance.", + "liveCount_one": "{{count}} RAYA", + "liveCount_other": "{{count}} RAYA" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/he.json b/apps/mobile/src/i18n/locales/he.json index b4e57ccd67..95bfef7076 100644 --- a/apps/mobile/src/i18n/locales/he.json +++ b/apps/mobile/src/i18n/locales/he.json @@ -1668,7 +1668,10 @@ "sessionExited": "ההפעלה הסתיימה", "remoteSpawnRetryable": "לא ניתן היה ליצור קשר עם המופע — ייתכן שהחיבור נותק.", "remoteSpawnNonRetryable": "המופע לא הצליח להפעיל את הסשן — בדוק את המחשב או עדכן את ה-CLI.", - "remoteSpawnInstanceDisconnected": "המופע שנבחר נותק. התחל סשן ב-Cloud Agent או בחר מופע אחר." + "remoteSpawnInstanceDisconnected": "המופע שנבחר נותק. התחל סשן ב-Cloud Agent או בחר מופע אחר.", + "liveCount_one": "{{count}} חי", + "liveCount_other": "{{count}} חי", + "liveCount_two": "{{count}} חי" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/hi.json b/apps/mobile/src/i18n/locales/hi.json index 7a208b4904..730979b5d5 100644 --- a/apps/mobile/src/i18n/locales/hi.json +++ b/apps/mobile/src/i18n/locales/hi.json @@ -1660,7 +1660,9 @@ "sessionExited": "सत्र समाप्त हो गया", "remoteSpawnRetryable": "इंस्टेंस तक नहीं पहुँचा जा सका — हो सकता है वह डिस्कनेक्ट हो गया हो।", "remoteSpawnNonRetryable": "इंस्टेंस सत्र शुरू करने में विफल रहा — मशीन जाँचें या CLI अपडेट करें।", - "remoteSpawnInstanceDisconnected": "चयनित इंस्टेंस डिस्कनेक्ट हो गया। Cloud Agent पर सत्र शुरू करें या दूसरा इंस्टेंस चुनें।" + "remoteSpawnInstanceDisconnected": "चयनित इंस्टेंस डिस्कनेक्ट हो गया। Cloud Agent पर सत्र शुरू करें या दूसरा इंस्टेंस चुनें।", + "liveCount_one": "{{count}} लाइव", + "liveCount_other": "{{count}} लाइव" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/hr.json b/apps/mobile/src/i18n/locales/hr.json index a8b584fae7..1c02bb407a 100644 --- a/apps/mobile/src/i18n/locales/hr.json +++ b/apps/mobile/src/i18n/locales/hr.json @@ -2129,7 +2129,10 @@ "sessionExited": "Sesija je završena", "remoteSpawnRetryable": "Nije moguće doći do instance — možda se prekinula veza.", "remoteSpawnNonRetryable": "Instanca nije uspjela pokrenuti sesiju — provjerite stroj ili ažurirajte CLI.", - "remoteSpawnInstanceDisconnected": "Odabrana instanca se prekinula. Pokrenite sesiju na Cloud Agent ili odaberite drugu instancu." + "remoteSpawnInstanceDisconnected": "Odabrana instanca se prekinula. Pokrenite sesiju na Cloud Agent ili odaberite drugu instancu.", + "liveCount_one": "{{count}} UŽIVO", + "liveCount_other": "{{count}} UŽIVO", + "liveCount_few": "{{count}} UŽIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ht.json b/apps/mobile/src/i18n/locales/ht.json index f0f9de80b6..15f66cab4a 100644 --- a/apps/mobile/src/i18n/locales/ht.json +++ b/apps/mobile/src/i18n/locales/ht.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sesyon an soti", "remoteSpawnRetryable": "Pa t kapab rive jwenn enstans lan — li ka te dekonekte.", "remoteSpawnNonRetryable": "Enstans lan echwe pou kòmanse sesyon an — tcheke machin lan oswa mete ajou CLI la.", - "remoteSpawnInstanceDisconnected": "Enstans chwazi a dekonekte. Kòmanse yon sesyon sou Cloud Agent oswa chwazi yon lòt enstans." + "remoteSpawnInstanceDisconnected": "Enstans chwazi a dekonekte. Kòmanse yon sesyon sou Cloud Agent oswa chwazi yon lòt enstans.", + "liveCount_one": "{{count}} AN DIRÈK", + "liveCount_other": "{{count}} AN DIRÈK" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/hu.json b/apps/mobile/src/i18n/locales/hu.json index ed273e9ce6..a9c79dbb91 100644 --- a/apps/mobile/src/i18n/locales/hu.json +++ b/apps/mobile/src/i18n/locales/hu.json @@ -2114,7 +2114,9 @@ "sessionExited": "A munkamenet kilépett", "remoteSpawnRetryable": "Nem sikerült elérni a példányt — lehet, hogy megszakadt a kapcsolat.", "remoteSpawnNonRetryable": "A példány nem tudta elindítani a munkamenetet — ellenőrizze a gépet vagy frissítse a CLI-t.", - "remoteSpawnInstanceDisconnected": "A kiválasztott példány megszakadt. Indítson munkamenetet a Cloud Agenten, vagy válasszon másik példányt." + "remoteSpawnInstanceDisconnected": "A kiválasztott példány megszakadt. Indítson munkamenetet a Cloud Agenten, vagy válasszon másik példányt.", + "liveCount_one": "{{count}} ÉLŐ", + "liveCount_other": "{{count}} ÉLŐ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/hy.json b/apps/mobile/src/i18n/locales/hy.json index 0469ab2490..f0cd6d1e33 100644 --- a/apps/mobile/src/i18n/locales/hy.json +++ b/apps/mobile/src/i18n/locales/hy.json @@ -2114,7 +2114,9 @@ "sessionExited": "Նիստն ավարտվել է", "remoteSpawnRetryable": "Չհաջողվեց կապվել օրինակի հետ. հնարավոր է՝ այն անջատվել է:", "remoteSpawnNonRetryable": "Օրինակը չկարողացավ սկսել նիստը. ստուգեք մեքենան կամ թարմացրեք CLI-ն:", - "remoteSpawnInstanceDisconnected": "Ընտրված օրինակն անջատվել է: Սկսեք նիստ Cloud Agent-ում կամ ընտրեք այլ օրինակ:" + "remoteSpawnInstanceDisconnected": "Ընտրված օրինակն անջատվել է: Սկսեք նիստ Cloud Agent-ում կամ ընտրեք այլ օրինակ:", + "liveCount_one": "{{count}} ՈՒՂԻՂ", + "liveCount_other": "{{count}} ՈՒՂԻՂ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/id.json b/apps/mobile/src/i18n/locales/id.json index 7100f21f14..80e76b6779 100644 --- a/apps/mobile/src/i18n/locales/id.json +++ b/apps/mobile/src/i18n/locales/id.json @@ -1660,7 +1660,9 @@ "sessionExited": "Sesi berakhir", "remoteSpawnRetryable": "Tidak dapat menjangkau instance — mungkin telah terputus.", "remoteSpawnNonRetryable": "Instance gagal memulai sesi — periksa mesin atau perbarui CLI.", - "remoteSpawnInstanceDisconnected": "Instance yang dipilih terputus. Mulai sesi di Cloud Agent atau pilih instance lain." + "remoteSpawnInstanceDisconnected": "Instance yang dipilih terputus. Mulai sesi di Cloud Agent atau pilih instance lain.", + "liveCount_one": "{{count}} LANGSUNG", + "liveCount_other": "{{count}} LANGSUNG" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ig.json b/apps/mobile/src/i18n/locales/ig.json index cda9728b44..be50eb46d3 100644 --- a/apps/mobile/src/i18n/locales/ig.json +++ b/apps/mobile/src/i18n/locales/ig.json @@ -2114,7 +2114,9 @@ "sessionExited": "Oge nnọkọ kwụsịrị", "remoteSpawnRetryable": "Enweghị ike iru ebe a na-akpọ — o nwere ike ịkpụpụla.", "remoteSpawnNonRetryable": "Ụlọ ọrụ ahụ adịghị ebido oge nnọkọ — lelee igwe ma ọ bụ melite CLI.", - "remoteSpawnInstanceDisconnected": "Ebe a họpụtara ịkpụpụla. Malite oge nnọkọ na Cloud Agent ma ọ bụ họrọ ebe ọzọ." + "remoteSpawnInstanceDisconnected": "Ebe a họpụtara ịkpụpụla. Malite oge nnọkọ na Cloud Agent ma ọ bụ họrọ ebe ọzọ.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/is.json b/apps/mobile/src/i18n/locales/is.json index f728c618fc..b976c3e699 100644 --- a/apps/mobile/src/i18n/locales/is.json +++ b/apps/mobile/src/i18n/locales/is.json @@ -2114,7 +2114,9 @@ "sessionExited": "Lotu lokið", "remoteSpawnRetryable": "Náði ekki til eintaksins — það gæti hafa tengst af.", "remoteSpawnNonRetryable": "Eintakið náði ekki að ræsa lotuna — athugaðu vélina eða uppfærðu CLI.", - "remoteSpawnInstanceDisconnected": "Valið eintak tengdist af. Byrjaðu lotu á Cloud Agent eða veldu annað eintak." + "remoteSpawnInstanceDisconnected": "Valið eintak tengdist af. Byrjaðu lotu á Cloud Agent eða veldu annað eintak.", + "liveCount_one": "{{count}} BEIN", + "liveCount_other": "{{count}} BEIN" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/it.json b/apps/mobile/src/i18n/locales/it.json index 4acacd2fca..64ec194450 100644 --- a/apps/mobile/src/i18n/locales/it.json +++ b/apps/mobile/src/i18n/locales/it.json @@ -1650,7 +1650,10 @@ "sessionExited": "Sessione terminata", "remoteSpawnRetryable": "Impossibile raggiungere l'istanza: potrebbe essersi disconnessa.", "remoteSpawnNonRetryable": "L'istanza non è riuscita ad avviare la sessione: controlla la macchina o aggiorna la CLI.", - "remoteSpawnInstanceDisconnected": "L'istanza selezionata si è disconnessa. Avvia una sessione su Cloud Agent oppure scegli un'altra istanza." + "remoteSpawnInstanceDisconnected": "L'istanza selezionata si è disconnessa. Avvia una sessione su Cloud Agent oppure scegli un'altra istanza.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE", + "liveCount_many": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ja.json b/apps/mobile/src/i18n/locales/ja.json index 90ffbfa6d7..2f791ef278 100644 --- a/apps/mobile/src/i18n/locales/ja.json +++ b/apps/mobile/src/i18n/locales/ja.json @@ -1660,7 +1660,9 @@ "sessionExited": "セッションが終了しました", "remoteSpawnRetryable": "インスタンスに到達できませんでした。接続が切断された可能性があります。", "remoteSpawnNonRetryable": "インスタンスがセッションの開始に失敗しました。マシンを確認するか、CLI を更新してください。", - "remoteSpawnInstanceDisconnected": "選択したインスタンスが切断されました。Cloud Agent でセッションを開始するか、別のインスタンスを選択してください。" + "remoteSpawnInstanceDisconnected": "選択したインスタンスが切断されました。Cloud Agent でセッションを開始するか、別のインスタンスを選択してください。", + "liveCount_one": "{{count}} ライブ", + "liveCount_other": "{{count}} ライブ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ka.json b/apps/mobile/src/i18n/locales/ka.json index a5c524b4e0..9e50418987 100644 --- a/apps/mobile/src/i18n/locales/ka.json +++ b/apps/mobile/src/i18n/locales/ka.json @@ -2114,7 +2114,9 @@ "sessionExited": "სესია დასრულდა", "remoteSpawnRetryable": "ინსტანციასთან დაკავშირება ვერ მოხერხდა — შესაძლოა გათიშული იყოს.", "remoteSpawnNonRetryable": "ინსტანციამ ვერ დაიწყო სესია — შეამოწმეთ მანქანა ან განაახლეთ CLI.", - "remoteSpawnInstanceDisconnected": "არჩეული ინსტანცია გათიშდა. დაიწყეთ სესია Cloud Agent-ზე ან აირჩიეთ სხვა ინსტანცია." + "remoteSpawnInstanceDisconnected": "არჩეული ინსტანცია გათიშდა. დაიწყეთ სესია Cloud Agent-ზე ან აირჩიეთ სხვა ინსტანცია.", + "liveCount_one": "{{count}} პირდაპირი", + "liveCount_other": "{{count}} პირდაპირი" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/kk.json b/apps/mobile/src/i18n/locales/kk.json index ac04244b07..dfe249575b 100644 --- a/apps/mobile/src/i18n/locales/kk.json +++ b/apps/mobile/src/i18n/locales/kk.json @@ -2114,7 +2114,9 @@ "sessionExited": "Сессия аяқталды", "remoteSpawnRetryable": "Инстансқа жете алмадық — ол ажыраған болуы мүмкін.", "remoteSpawnNonRetryable": "Инстанс сессияны бастай алмады — машинаны тексеріңіз немесе CLI жаңартыңыз.", - "remoteSpawnInstanceDisconnected": "Таңдалған инстанс ажырады. Cloud Agent сайтында сессияны бастаңыз немесе басқа инстансты таңдаңыз." + "remoteSpawnInstanceDisconnected": "Таңдалған инстанс ажырады. Cloud Agent сайтында сессияны бастаңыз немесе басқа инстансты таңдаңыз.", + "liveCount_one": "{{count}} ТІКІ", + "liveCount_other": "{{count}} ТІКІ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/km.json b/apps/mobile/src/i18n/locales/km.json index ccc7cfe811..6e22c53fba 100644 --- a/apps/mobile/src/i18n/locales/km.json +++ b/apps/mobile/src/i18n/locales/km.json @@ -2114,7 +2114,9 @@ "sessionExited": "វគ្គបានចាកចេញ", "remoteSpawnRetryable": "មិនអាចទៅដល់ instance បានទេ — វាអាចត្រូវបានផ្ដាច់។", "remoteSpawnNonRetryable": "instance បរាជ័យក្នុងការចាប់ផ្ដើមវគ្គ — ពិនិត្យម៉ាស៊ីន ឬធ្វើបច្ចុប្បន្នភាព CLI។", - "remoteSpawnInstanceDisconnected": "instance ដែលបានជ្រើសរើសត្រូវបានផ្ដាច់។ ចាប់ផ្ដើមវគ្គនៅលើ Cloud Agent ឬជ្រើសរើស instance ផ្សេងទៀត។" + "remoteSpawnInstanceDisconnected": "instance ដែលបានជ្រើសរើសត្រូវបានផ្ដាច់។ ចាប់ផ្ដើមវគ្គនៅលើ Cloud Agent ឬជ្រើសរើស instance ផ្សេងទៀត។", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/kn.json b/apps/mobile/src/i18n/locales/kn.json index 7f0745cedd..de0355eb45 100644 --- a/apps/mobile/src/i18n/locales/kn.json +++ b/apps/mobile/src/i18n/locales/kn.json @@ -2114,7 +2114,9 @@ "sessionExited": "ಸೆಶನ್ ನಿರ್ಗಮಿಸಿದೆ", "remoteSpawnRetryable": "ಇನ್ಸ್ಟೆನ್ಸ್ ಅನ್ನು ತಲುಪಲಾಗಲಿಲ್ಲ — ಅದು ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿರಬಹುದು.", "remoteSpawnNonRetryable": "ಇನ್ಸ್ಟೆನ್ಸ್ ಸೆಶನ್ ಪ್ರಾರಂಭಿಸಲು ವಿಫಲವಾಗಿದೆ — ಯಂತ್ರವನ್ನು ಪರಿಶೀಲಿಸಿ ಅಥವಾ CLI ಅನ್ನು ನವೀಕರಿಸಿ.", - "remoteSpawnInstanceDisconnected": "ಆಯ್ಕೆಮಾಡಿದ ಇನ್ಸ್ಟೆನ್ಸ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ. Cloud Agent ನಲ್ಲಿ ಸೆಶನ್ ಪ್ರಾರಂಭಿಸಿ ಅಥವಾ ಮತ್ತೊಂದು ಇನ್ಸ್ಟೆನ್ಸ್ ಆಯ್ಕೆಮಾಡಿ." + "remoteSpawnInstanceDisconnected": "ಆಯ್ಕೆಮಾಡಿದ ಇನ್ಸ್ಟೆನ್ಸ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ. Cloud Agent ನಲ್ಲಿ ಸೆಶನ್ ಪ್ರಾರಂಭಿಸಿ ಅಥವಾ ಮತ್ತೊಂದು ಇನ್ಸ್ಟೆನ್ಸ್ ಆಯ್ಕೆಮಾಡಿ.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ko.json b/apps/mobile/src/i18n/locales/ko.json index 0d5b64647c..1467c18387 100644 --- a/apps/mobile/src/i18n/locales/ko.json +++ b/apps/mobile/src/i18n/locales/ko.json @@ -1660,7 +1660,9 @@ "sessionExited": "세션이 종료되었습니다", "remoteSpawnRetryable": "인스턴스에 연결할 수 없습니다. 연결이 끊어졌을 수 있습니다.", "remoteSpawnNonRetryable": "인스턴스가 세션을 시작하지 못했습니다. 머신을 확인하거나 CLI를 업데이트하세요.", - "remoteSpawnInstanceDisconnected": "선택한 인스턴스가 연결이 끊어졌습니다. Cloud Agent에서 세션을 시작하거나 다른 인스턴스를 선택하세요." + "remoteSpawnInstanceDisconnected": "선택한 인스턴스가 연결이 끊어졌습니다. Cloud Agent에서 세션을 시작하거나 다른 인스턴스를 선택하세요.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/lo.json b/apps/mobile/src/i18n/locales/lo.json index 5bcf8c6d54..f6de49c589 100644 --- a/apps/mobile/src/i18n/locales/lo.json +++ b/apps/mobile/src/i18n/locales/lo.json @@ -2114,7 +2114,9 @@ "sessionExited": "ເຊດຊັນອອກແລ້ວ", "remoteSpawnRetryable": "ບໍ່ສາມາດເຂົ້າເຖິງ instance ໄດ້ — ມັນອາດຈະຕັດການເຊື່ອມຕໍ່.", "remoteSpawnNonRetryable": "instance ລົ້ມເຫຼວໃນການເລີ່ມເຊດຊັນ — ກວດເຄື່ອງ ຫຼື ອັບເດດ CLI.", - "remoteSpawnInstanceDisconnected": "instance ທີ່ເລືອກໄດ້ຕັດການເຊື່ອມຕໍ່. ເລີ່ມເຊດຊັນໃນ Cloud Agent ຫຼື ເລືອກ instance ອື່ນ." + "remoteSpawnInstanceDisconnected": "instance ທີ່ເລືອກໄດ້ຕັດການເຊື່ອມຕໍ່. ເລີ່ມເຊດຊັນໃນ Cloud Agent ຫຼື ເລືອກ instance ອື່ນ.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/lt.json b/apps/mobile/src/i18n/locales/lt.json index dab120750a..3a5dd8224c 100644 --- a/apps/mobile/src/i18n/locales/lt.json +++ b/apps/mobile/src/i18n/locales/lt.json @@ -2144,7 +2144,11 @@ "sessionExited": "Sesija baigta", "remoteSpawnRetryable": "Nepavyko pasiekti egzemplioriaus — jis galėjo atsijungti.", "remoteSpawnNonRetryable": "Egzemplioriui nepavyko pradėti sesijos — patikrinkite įrenginį arba atnaujinkite CLI.", - "remoteSpawnInstanceDisconnected": "Pasirinktas egzempliorius atsijungė. Pradėkite sesiją „Cloud Agent“ arba pasirinkite kitą egzempliorių." + "remoteSpawnInstanceDisconnected": "Pasirinktas egzempliorius atsijungė. Pradėkite sesiją „Cloud Agent“ arba pasirinkite kitą egzempliorių.", + "liveCount_one": "{{count}} TIESIOGIAI", + "liveCount_other": "{{count}} TIESIOGIAI", + "liveCount_few": "{{count}} TIESIOGIAI", + "liveCount_many": "{{count}} TIESIOGIAI" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/lv.json b/apps/mobile/src/i18n/locales/lv.json index a7e5ef7f37..dfe878be29 100644 --- a/apps/mobile/src/i18n/locales/lv.json +++ b/apps/mobile/src/i18n/locales/lv.json @@ -2129,7 +2129,10 @@ "sessionExited": "Sesija beidzās", "remoteSpawnRetryable": "Nevarēja sasniegt instanci — tā, iespējams, ir atvienojusies.", "remoteSpawnNonRetryable": "Instancei neizdevās sākt sesiju — pārbaudiet iekārtu vai atjauniniet CLI.", - "remoteSpawnInstanceDisconnected": "Atlasītā instance atvienojās. Sāciet sesiju Cloud Agent vai izvēlieties citu instanci." + "remoteSpawnInstanceDisconnected": "Atlasītā instance atvienojās. Sāciet sesiju Cloud Agent vai izvēlieties citu instanci.", + "liveCount_one": "{{count}} TIŠRAIDĒ", + "liveCount_other": "{{count}} TIŠRAIDĒ", + "liveCount_zero": "{{count}} TIŠRAIDĒ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/mg.json b/apps/mobile/src/i18n/locales/mg.json index 4ccbcbc03b..2b205bd921 100644 --- a/apps/mobile/src/i18n/locales/mg.json +++ b/apps/mobile/src/i18n/locales/mg.json @@ -2114,7 +2114,9 @@ "sessionExited": "Nifarana ny session", "remoteSpawnRetryable": "Tsy tratra ilay fitaovana — mety ho tapaka ny fifandraisana.", "remoteSpawnNonRetryable": "Tsy nahomby ny fanombohan'ny sessio tamin'ilay fitaovana — jereo ny milina na havaozy ny CLI.", - "remoteSpawnInstanceDisconnected": "Tapaka ny fitaovana voafidy. Atombohy sessio amin'ny Cloud Agent na fidio fitaovana hafa." + "remoteSpawnInstanceDisconnected": "Tapaka ny fitaovana voafidy. Atombohy sessio amin'ny Cloud Agent na fidio fitaovana hafa.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/mi.json b/apps/mobile/src/i18n/locales/mi.json index a026f73ce3..ae00413554 100644 --- a/apps/mobile/src/i18n/locales/mi.json +++ b/apps/mobile/src/i18n/locales/mi.json @@ -2114,7 +2114,9 @@ "sessionExited": "Kua puta te wātū", "remoteSpawnRetryable": "Kāore i taea te tae ki te wātū — kua motu pea tana hononga.", "remoteSpawnNonRetryable": "Kāore i tīmata te wātū i te wātū — tirohia te mīhini, ka whakahōu rānei i te CLI.", - "remoteSpawnInstanceDisconnected": "Kua motu te hononga o te wātū kua tīpakona. Tīmatahia he wātū ki runga i te Cloud Agent, tīpakoa rānei tētahi atu wātū." + "remoteSpawnInstanceDisconnected": "Kua motu te hononga o te wātū kua tīpakona. Tīmatahia he wātū ki runga i te Cloud Agent, tīpakoa rānei tētahi atu wātū.", + "liveCount_one": "{{count}} ORA", + "liveCount_other": "{{count}} ORA" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/mk.json b/apps/mobile/src/i18n/locales/mk.json index e76ecba9a4..c47190fe0c 100644 --- a/apps/mobile/src/i18n/locales/mk.json +++ b/apps/mobile/src/i18n/locales/mk.json @@ -2114,7 +2114,9 @@ "sessionExited": "Сесијата е затворена", "remoteSpawnRetryable": "Не можеше да се пристапи до инстанцата — можеби се исклучи.", "remoteSpawnNonRetryable": "Инстанцата не успеа да ја започне сесијата — проверете ја машината или ажурирајте го CLI.", - "remoteSpawnInstanceDisconnected": "Избраната инстанца се исклучи. Започнете сесија на Cloud Agent или изберете друга инстанца." + "remoteSpawnInstanceDisconnected": "Избраната инстанца се исклучи. Започнете сесија на Cloud Agent или изберете друга инстанца.", + "liveCount_one": "{{count}} ВОЖИВО", + "liveCount_other": "{{count}} ВОЖИВО" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ml.json b/apps/mobile/src/i18n/locales/ml.json index 4a5b474e3a..d236172af5 100644 --- a/apps/mobile/src/i18n/locales/ml.json +++ b/apps/mobile/src/i18n/locales/ml.json @@ -2114,7 +2114,9 @@ "sessionExited": "സെഷൻ പുറത്തുകടന്നു", "remoteSpawnRetryable": "ഇൻസ്റ്റൻസിൽ എത്താൻ കഴിഞ്ഞില്ല — ഇത് വിച്ഛേദിക്കപ്പെട്ടിരിക്കാം.", "remoteSpawnNonRetryable": "സെഷൻ ആരംഭിക്കുന്നതിൽ ഇൻസ്റ്റൻസ് പരാജയപ്പെട്ടു — മെഷീൻ പരിശോധിക്കുക അല്ലെങ്കിൽ CLI അപ്ഡേറ്റ് ചെയ്യുക.", - "remoteSpawnInstanceDisconnected": "തിരഞ്ഞെടുത്ത ഇൻസ്റ്റൻസ് വിച്ഛേദിക്കപ്പെട്ടു. Cloud Agent-ൽ ഒരു സെഷൻ ആരംഭിക്കുക അല്ലെങ്കിൽ മറ്റൊരു ഇൻസ്റ്റൻസ് തിരഞ്ഞെടുക്കുക." + "remoteSpawnInstanceDisconnected": "തിരഞ്ഞെടുത്ത ഇൻസ്റ്റൻസ് വിച്ഛേദിക്കപ്പെട്ടു. Cloud Agent-ൽ ഒരു സെഷൻ ആരംഭിക്കുക അല്ലെങ്കിൽ മറ്റൊരു ഇൻസ്റ്റൻസ് തിരഞ്ഞെടുക്കുക.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/mn.json b/apps/mobile/src/i18n/locales/mn.json index b731e3c62f..32762b7c3d 100644 --- a/apps/mobile/src/i18n/locales/mn.json +++ b/apps/mobile/src/i18n/locales/mn.json @@ -2114,7 +2114,9 @@ "sessionExited": "Сесс гарсан", "remoteSpawnRetryable": "Инстанц руу холбогдож чадсангүй — салсан байж магадгүй.", "remoteSpawnNonRetryable": "Инстанц сессийг эхлүүлж чадсангүй — машинаа шалга эсвэл CLI-г шинэчил.", - "remoteSpawnInstanceDisconnected": "Сонгосон инстанц салсан. Cloud Agent дээр сесс эхлүүл эсвэл өөр инстанц сонго." + "remoteSpawnInstanceDisconnected": "Сонгосон инстанц салсан. Cloud Agent дээр сесс эхлүүл эсвэл өөр инстанц сонго.", + "liveCount_one": "{{count}} ШУУД", + "liveCount_other": "{{count}} ШУУД" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/mr.json b/apps/mobile/src/i18n/locales/mr.json index 984ed37d89..4eba1445bf 100644 --- a/apps/mobile/src/i18n/locales/mr.json +++ b/apps/mobile/src/i18n/locales/mr.json @@ -2114,7 +2114,9 @@ "sessionExited": "सत्र बाहेर पडले", "remoteSpawnRetryable": "उदाहरणापर्यंत पोहोचता आले नाही — ते डिस्कनेक्ट झाले असावे.", "remoteSpawnNonRetryable": "उदाहरण सत्र सुरू करू शकले नाही — मशीन तपासा किंवा CLI अद्यतनित करा.", - "remoteSpawnInstanceDisconnected": "निवडलेले उदाहरण डिस्कनेक्ट झाले. Cloud Agent वर सत्र सुरू करा किंवा दुसरे उदाहरण निवडा." + "remoteSpawnInstanceDisconnected": "निवडलेले उदाहरण डिस्कनेक्ट झाले. Cloud Agent वर सत्र सुरू करा किंवा दुसरे उदाहरण निवडा.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ms.json b/apps/mobile/src/i18n/locales/ms.json index 64bcedf3c2..52c1b74136 100644 --- a/apps/mobile/src/i18n/locales/ms.json +++ b/apps/mobile/src/i18n/locales/ms.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sesi ditamatkan", "remoteSpawnRetryable": "Tidak dapat mencapai instance — ia mungkin telah terputus sambungan.", "remoteSpawnNonRetryable": "Instance gagal memulakan sesi — semak mesin atau kemas kini CLI.", - "remoteSpawnInstanceDisconnected": "Instance yang dipilih terputus sambungan. Mulakan sesi pada Cloud Agent atau pilih instance lain." + "remoteSpawnInstanceDisconnected": "Instance yang dipilih terputus sambungan. Mulakan sesi pada Cloud Agent atau pilih instance lain.", + "liveCount_one": "{{count}} LANGSUNG", + "liveCount_other": "{{count}} LANGSUNG" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/mt.json b/apps/mobile/src/i18n/locales/mt.json index 869446fd6e..ed58303a06 100644 --- a/apps/mobile/src/i18n/locales/mt.json +++ b/apps/mobile/src/i18n/locales/mt.json @@ -2159,7 +2159,12 @@ "sessionExited": "Is-sessjoni spiċċat", "remoteSpawnRetryable": "Ma stajniex nilħqu l-istanza — jista' jkun li skonnettjat.", "remoteSpawnNonRetryable": "L-istanza ma rnexxiliex tibda s-sessjoni — iċċekkja l-magna jew aġġorna l-CLI.", - "remoteSpawnInstanceDisconnected": "L-istanza magħżula skonnettjat. Ibda sessjoni fuq Cloud Agent jew agħżel istanza oħra." + "remoteSpawnInstanceDisconnected": "L-istanza magħżula skonnettjat. Ibda sessjoni fuq Cloud Agent jew agħżel istanza oħra.", + "liveCount_one": "{{count}} DIRETT", + "liveCount_other": "{{count}} DIRETT", + "liveCount_two": "{{count}} DIRETT", + "liveCount_few": "{{count}} DIRETT", + "liveCount_many": "{{count}} DIRETT" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/my.json b/apps/mobile/src/i18n/locales/my.json index f5e2a9d33d..b82a47c281 100644 --- a/apps/mobile/src/i18n/locales/my.json +++ b/apps/mobile/src/i18n/locales/my.json @@ -2114,7 +2114,9 @@ "sessionExited": "စက်ရှင် ထွက်သွားသည်", "remoteSpawnRetryable": "အင်​စတ​န်း​စ သို့ မရောက်​ရှိ​နိုင်​ပါ — ၎င်း ချိတ်​ဆက်​မှု ပြတ်​တောက်​နေ​သည်​ ဖြစ်​နိုင်​သည်​။", "remoteSpawnNonRetryable": "အင်​စတ​န်း​စ သည် ဆက်​ရှင် စတင်​မှု မအောင်မြင်​ပါ — စက် ကို စစ်​ဆေး​ပါ သို့​မဟုတ် CLI ကို အပ်​ဒိတ်​လုပ်​ပါ​။", - "remoteSpawnInstanceDisconnected": "ရွေး​ထား​သော အင်​စတ​န်း​စ ချိတ်​ဆက်​မှု ပြတ်​သွား​သည်​။ Cloud Agent တွင် ဆက်​ရှင် တစ်​ခု စတင်​ပါ သို့​မဟုတ် အခြား အင်​စတ​န်း​စ တစ်​ခု ရွေး​ပါ​။" + "remoteSpawnInstanceDisconnected": "ရွေး​ထား​သော အင်​စတ​န်း​စ ချိတ်​ဆက်​မှု ပြတ်​သွား​သည်​။ Cloud Agent တွင် ဆက်​ရှင် တစ်​ခု စတင်​ပါ သို့​မဟုတ် အခြား အင်​စတ​န်း​စ တစ်​ခု ရွေး​ပါ​။", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/nb.json b/apps/mobile/src/i18n/locales/nb.json index bf393c30d4..2dce73db73 100644 --- a/apps/mobile/src/i18n/locales/nb.json +++ b/apps/mobile/src/i18n/locales/nb.json @@ -2114,7 +2114,9 @@ "sessionExited": "Økten ble avsluttet", "remoteSpawnRetryable": "Kunne ikke nå forekomsten — den kan ha mistet tilkoblingen.", "remoteSpawnNonRetryable": "Forekomsten klarte ikke å starte økten — kontroller maskinen eller oppdater CLI-en.", - "remoteSpawnInstanceDisconnected": "Den valgte forekomsten mistet tilkoblingen. Start en økt på Cloud Agent eller velg en annen forekomst." + "remoteSpawnInstanceDisconnected": "Den valgte forekomsten mistet tilkoblingen. Start en økt på Cloud Agent eller velg en annen forekomst.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ne.json b/apps/mobile/src/i18n/locales/ne.json index c9eed3ba3b..8cbfcaf822 100644 --- a/apps/mobile/src/i18n/locales/ne.json +++ b/apps/mobile/src/i18n/locales/ne.json @@ -2114,7 +2114,9 @@ "sessionExited": "सत्र बाहिरियो", "remoteSpawnRetryable": "इन्स्ट्यान्समा पुग्न सकिएन — यो विच्छेद भएको हुन सक्छ।", "remoteSpawnNonRetryable": "इन्स्ट्यान्सले सत्र सुरु गर्न असफल भयो — मेसिन जाँच्नुहोस् वा CLI अपडेट गर्नुहोस्।", - "remoteSpawnInstanceDisconnected": "चयन गरिएको इन्स्ट्यान्स विच्छेद भयो। Cloud Agent मा सत्र सुरु गर्नुहोस् वा अर्को इन्स्ट्यान्स छान्नुहोस्।" + "remoteSpawnInstanceDisconnected": "चयन गरिएको इन्स्ट्यान्स विच्छेद भयो। Cloud Agent मा सत्र सुरु गर्नुहोस् वा अर्को इन्स्ट्यान्स छान्नुहोस्।", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/nl.json b/apps/mobile/src/i18n/locales/nl.json index 3bafa55b39..6aebc1194e 100644 --- a/apps/mobile/src/i18n/locales/nl.json +++ b/apps/mobile/src/i18n/locales/nl.json @@ -1660,7 +1660,9 @@ "sessionExited": "Sessie beëindigd", "remoteSpawnRetryable": "De instantie is niet bereikbaar — deze is mogelijk verbroken.", "remoteSpawnNonRetryable": "De instantie kon de sessie niet starten — controleer de machine of werk de CLI bij.", - "remoteSpawnInstanceDisconnected": "De geselecteerde instantie is verbroken. Start een sessie op Cloud Agent of kies een andere instantie." + "remoteSpawnInstanceDisconnected": "De geselecteerde instantie is verbroken. Start een sessie op Cloud Agent of kies een andere instantie.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/om.json b/apps/mobile/src/i18n/locales/om.json index 63746d31b3..8dddaa2ed1 100644 --- a/apps/mobile/src/i18n/locales/om.json +++ b/apps/mobile/src/i18n/locales/om.json @@ -2114,7 +2114,9 @@ "sessionExited": "Xalayyiin bahe", "remoteSpawnRetryable": "Instance bira ga'uu hin dandeenye — addaan citee ta'a.", "remoteSpawnNonRetryable": "Instance sessi jalqabuun hin milkaa'in — meeshaa sakatta'i ykn CLI haaromsi.", - "remoteSpawnInstanceDisconnected": "Instance filatame addaan citeera. Sessa Cloud Agent irratti jalqabi ykn instance biraa filadhu." + "remoteSpawnInstanceDisconnected": "Instance filatame addaan citeera. Sessa Cloud Agent irratti jalqabi ykn instance biraa filadhu.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/or.json b/apps/mobile/src/i18n/locales/or.json index b943be831c..7421bca0ac 100644 --- a/apps/mobile/src/i18n/locales/or.json +++ b/apps/mobile/src/i18n/locales/or.json @@ -2114,7 +2114,9 @@ "sessionExited": "ସେସନ୍ ବାହାରିଛି", "remoteSpawnRetryable": "ଇନ୍‌ସ୍ଟାନ୍ସରେ ପହଞ୍ଚି ପାରିଲୁ ନାହିଁ — ଏହା ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହୋଇଥାଇପାରେ।", "remoteSpawnNonRetryable": "ଇନ୍‌ସ୍ଟାନ୍ସ ସେସନ୍ ଆରମ୍ଭ କରିବାରେ ବିଫଳ ହେଲା — ମେସିନ୍ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା CLI ଅପଡେଟ୍ କରନ୍ତୁ।", - "remoteSpawnInstanceDisconnected": "ଚୟନ କରାଯାଇଥିବା ଇନ୍‌ସ୍ଟାନ୍ସ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହୋଇଛି। Cloud Agent ରେ ଏକ ସେସନ୍ ଆରମ୍ଭ କରନ୍ତୁ କିମ୍ବା ଅନ୍ୟ ଇନ୍‌ସ୍ଟାନ୍ସ ବାଛନ୍ତୁ।" + "remoteSpawnInstanceDisconnected": "ଚୟନ କରାଯାଇଥିବା ଇନ୍‌ସ୍ଟାନ୍ସ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହୋଇଛି। Cloud Agent ରେ ଏକ ସେସନ୍ ଆରମ୍ଭ କରନ୍ତୁ କିମ୍ବା ଅନ୍ୟ ଇନ୍‌ସ୍ଟାନ୍ସ ବାଛନ୍ତୁ।", + "liveCount_one": "{{count}} ଲାଇଭ୍", + "liveCount_other": "{{count}} ଲାଇଭ୍" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/pa.json b/apps/mobile/src/i18n/locales/pa.json index 1b02489313..02117886f3 100644 --- a/apps/mobile/src/i18n/locales/pa.json +++ b/apps/mobile/src/i18n/locales/pa.json @@ -2114,7 +2114,9 @@ "sessionExited": "ਸੈਸ਼ਨ ਬੰਦ ਹੋਇਆ", "remoteSpawnRetryable": "ਇੰਸਟੈਂਸ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਿਆ — ਇਹ ਡਿਸਕਨੈਕਟ ਹੋ ਸਕਦਾ ਹੈ।", "remoteSpawnNonRetryable": "ਇੰਸਟੈਂਸ ਸੈਸ਼ਨ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ — ਮਸ਼ੀਨ ਜਾਂਚੋ ਜਾਂ CLI ਅੱਪਡੇਟ ਕਰੋ।", - "remoteSpawnInstanceDisconnected": "ਚੁਣਿਆ ਗਿਆ ਇੰਸਟੈਂਸ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ। Cloud Agent 'ਤੇ ਸੈਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ ਜਾਂ ਕੋਈ ਹੋਰ ਇੰਸਟੈਂਸ ਚੁਣੋ।" + "remoteSpawnInstanceDisconnected": "ਚੁਣਿਆ ਗਿਆ ਇੰਸਟੈਂਸ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ। Cloud Agent 'ਤੇ ਸੈਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ ਜਾਂ ਕੋਈ ਹੋਰ ਇੰਸਟੈਂਸ ਚੁਣੋ।", + "liveCount_one": "{{count}} ਲਾਈਵ", + "liveCount_other": "{{count}} ਲਾਈਵ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/pl.json b/apps/mobile/src/i18n/locales/pl.json index 49542de959..018301af78 100644 --- a/apps/mobile/src/i18n/locales/pl.json +++ b/apps/mobile/src/i18n/locales/pl.json @@ -1676,7 +1676,11 @@ "sessionExited": "Sesja zakończona", "remoteSpawnRetryable": "Nie udało się połączyć z instancją — mogła się rozłączyć.", "remoteSpawnNonRetryable": "Instancja nie uruchomiła sesji — sprawdź maszynę lub zaktualizuj CLI.", - "remoteSpawnInstanceDisconnected": "Wybrana instancja się rozłączyła. Uruchom sesję na Cloud Agent lub wybierz inną instancję." + "remoteSpawnInstanceDisconnected": "Wybrana instancja się rozłączyła. Uruchom sesję na Cloud Agent lub wybierz inną instancję.", + "liveCount_one": "{{count}} NA ŻYWO", + "liveCount_other": "{{count}} NA ŻYWO", + "liveCount_few": "{{count}} NA ŻYWO", + "liveCount_many": "{{count}} NA ŻYWO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ps.json b/apps/mobile/src/i18n/locales/ps.json index 8d5292eef8..3877cba742 100644 --- a/apps/mobile/src/i18n/locales/ps.json +++ b/apps/mobile/src/i18n/locales/ps.json @@ -2114,7 +2114,9 @@ "sessionExited": "ناسته پای ته ورسېده", "remoteSpawnRetryable": "انسټنس ته رسېدل ممکن نه وو — کېدای شي قطع شوی وي.", "remoteSpawnNonRetryable": "انسټنس ناسته پیلولو کې پاتې راغی — ماشین وګورئ یا CLI تازه کړئ.", - "remoteSpawnInstanceDisconnected": "ټاکل شوی انسټنس قطع شو. په Cloud Agent کې ناسته پیل کړئ یا بل انسټنس غوره کړئ." + "remoteSpawnInstanceDisconnected": "ټاکل شوی انسټنس قطع شو. په Cloud Agent کې ناسته پیل کړئ یا بل انسټنس غوره کړئ.", + "liveCount_one": "{{count}} ژوندۍ", + "liveCount_other": "{{count}} ژوندۍ" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/pt-BR.json b/apps/mobile/src/i18n/locales/pt-BR.json index e2facccca0..6b23367df4 100644 --- a/apps/mobile/src/i18n/locales/pt-BR.json +++ b/apps/mobile/src/i18n/locales/pt-BR.json @@ -1650,7 +1650,10 @@ "sessionExited": "Sessão encerrada", "remoteSpawnRetryable": "Não foi possível acessar a instância — ela pode ter se desconectado.", "remoteSpawnNonRetryable": "A instância não conseguiu iniciar a sessão — verifique a máquina ou atualize a CLI.", - "remoteSpawnInstanceDisconnected": "A instância selecionada se desconectou. Inicie uma sessão no Cloud Agent ou escolha outra instância." + "remoteSpawnInstanceDisconnected": "A instância selecionada se desconectou. Inicie uma sessão no Cloud Agent ou escolha outra instância.", + "liveCount_one": "{{count}} AO VIVO", + "liveCount_other": "{{count}} AO VIVO", + "liveCount_many": "{{count}} AO VIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/pt.json b/apps/mobile/src/i18n/locales/pt.json index 4f35119b34..525a413cdc 100644 --- a/apps/mobile/src/i18n/locales/pt.json +++ b/apps/mobile/src/i18n/locales/pt.json @@ -2129,7 +2129,10 @@ "sessionExited": "Sessão terminada", "remoteSpawnRetryable": "Não foi possível aceder à instância — pode ter sido desligada.", "remoteSpawnNonRetryable": "A instância não conseguiu iniciar a sessão — verifique a máquina ou atualize a CLI.", - "remoteSpawnInstanceDisconnected": "A instância selecionada foi desligada. Inicie uma sessão no Cloud Agent ou escolha outra instância." + "remoteSpawnInstanceDisconnected": "A instância selecionada foi desligada. Inicie uma sessão no Cloud Agent ou escolha outra instância.", + "liveCount_one": "{{count}} AO VIVO", + "liveCount_other": "{{count}} AO VIVO", + "liveCount_many": "{{count}} AO VIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ro.json b/apps/mobile/src/i18n/locales/ro.json index 5f6530677a..e7a85696de 100644 --- a/apps/mobile/src/i18n/locales/ro.json +++ b/apps/mobile/src/i18n/locales/ro.json @@ -2129,7 +2129,10 @@ "sessionExited": "Sesiunea a fost închisă", "remoteSpawnRetryable": "Nu s-a putut ajunge la instanță — este posibil să se fi deconectat.", "remoteSpawnNonRetryable": "Instanța nu a reușit să pornească sesiunea — verifică mașina sau actualizează CLI-ul.", - "remoteSpawnInstanceDisconnected": "Instanța selectată s-a deconectat. Pornește o sesiune pe Cloud Agent sau alege altă instanță." + "remoteSpawnInstanceDisconnected": "Instanța selectată s-a deconectat. Pornește o sesiune pe Cloud Agent sau alege altă instanță.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE", + "liveCount_few": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ru.json b/apps/mobile/src/i18n/locales/ru.json index 3edc51cb69..b361635e30 100644 --- a/apps/mobile/src/i18n/locales/ru.json +++ b/apps/mobile/src/i18n/locales/ru.json @@ -1676,7 +1676,11 @@ "sessionExited": "Сеанс завершён", "remoteSpawnRetryable": "Не удалось подключиться к экземпляру — возможно, он отключился.", "remoteSpawnNonRetryable": "Экземпляр не смог запустить сеанс — проверьте машину или обновите CLI.", - "remoteSpawnInstanceDisconnected": "Выбранный экземпляр отключился. Запустите сеанс в Cloud Agent или выберите другой экземпляр." + "remoteSpawnInstanceDisconnected": "Выбранный экземпляр отключился. Запустите сеанс в Cloud Agent или выберите другой экземпляр.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE", + "liveCount_few": "{{count}} LIVE", + "liveCount_many": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/si.json b/apps/mobile/src/i18n/locales/si.json index ee66aa94c1..337d25023f 100644 --- a/apps/mobile/src/i18n/locales/si.json +++ b/apps/mobile/src/i18n/locales/si.json @@ -2114,7 +2114,9 @@ "sessionExited": "සැසියෙන් ඉවත් විය", "remoteSpawnRetryable": "අවස්ථාවට ළඟා විය නොහැකි විය — එය විසන්ධි වන්නට පුළුවන.", "remoteSpawnNonRetryable": "සැසිය ආරම්භ කිරීමට අවස්ථාව අසමත් විය — යන්ත්රය පරීක්ෂා කරන්න හෝ CLI යාවත්කාලීන කරන්න.", - "remoteSpawnInstanceDisconnected": "තෝරාගත් අවස්ථාව විසන්ධි විය. Cloud Agent හි සැසියක් ආරම්භ කරන්න හෝ වෙනත් අවස්ථාවක් තෝරන්න." + "remoteSpawnInstanceDisconnected": "තෝරාගත් අවස්ථාව විසන්ධි විය. Cloud Agent හි සැසියක් ආරම්භ කරන්න හෝ වෙනත් අවස්ථාවක් තෝරන්න.", + "liveCount_one": "{{count}} සජීවී", + "liveCount_other": "{{count}} සජීවී" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/sk.json b/apps/mobile/src/i18n/locales/sk.json index a73ee583bd..34061d7078 100644 --- a/apps/mobile/src/i18n/locales/sk.json +++ b/apps/mobile/src/i18n/locales/sk.json @@ -2144,7 +2144,11 @@ "sessionExited": "Sedenie ukončené", "remoteSpawnRetryable": "Nedá sa dosiahnuť inštancia — možno sa odpojila.", "remoteSpawnNonRetryable": "Inštancia nedokázala spustiť reláciu — skontrolujte zariadenie alebo aktualizujte CLI.", - "remoteSpawnInstanceDisconnected": "Vybraná inštancia sa odpojila. Spustite reláciu na Cloud Agent alebo vyberte inú inštanciu." + "remoteSpawnInstanceDisconnected": "Vybraná inštancia sa odpojila. Spustite reláciu na Cloud Agent alebo vyberte inú inštanciu.", + "liveCount_one": "{{count}} NAŽIVO", + "liveCount_other": "{{count}} NAŽIVO", + "liveCount_few": "{{count}} NAŽIVO", + "liveCount_many": "{{count}} NAŽIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/sl.json b/apps/mobile/src/i18n/locales/sl.json index 71c784c1d9..9e1570304b 100644 --- a/apps/mobile/src/i18n/locales/sl.json +++ b/apps/mobile/src/i18n/locales/sl.json @@ -2144,7 +2144,11 @@ "sessionExited": "Seja je končana", "remoteSpawnRetryable": "Instance ni bilo mogoče doseči — morda se je odklopila.", "remoteSpawnNonRetryable": "Instance ni uspela zagnati seje — preverite stroj ali posodobite CLI.", - "remoteSpawnInstanceDisconnected": "Izbrana instanca se je odklopila. Začnite sejo na Cloud Agent ali izberite drugo instanco." + "remoteSpawnInstanceDisconnected": "Izbrana instanca se je odklopila. Začnite sejo na Cloud Agent ali izberite drugo instanco.", + "liveCount_one": "{{count}} V ŽIVO", + "liveCount_other": "{{count}} V ŽIVO", + "liveCount_two": "{{count}} V ŽIVO", + "liveCount_few": "{{count}} V ŽIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/so.json b/apps/mobile/src/i18n/locales/so.json index af83de7b6c..9e2b7bb5d5 100644 --- a/apps/mobile/src/i18n/locales/so.json +++ b/apps/mobile/src/i18n/locales/so.json @@ -2114,7 +2114,9 @@ "sessionExited": "Kalfadhi ayaa ka baxay", "remoteSpawnRetryable": "Lama gaadhin kolkuu ahaa — waxaa laga yaabaa inuu ka xidhmo.", "remoteSpawnNonRetryable": "Kolkuu ayaa ku guuldareystay inuu bilaabo kalfadhiga — hubi mishiinka ama cusbooneysii CLI-ga.", - "remoteSpawnInstanceDisconnected": "Kolkuu la xulay ayaa ka xidhmo. Ku bilow kalfadhi Cloud Agent ama dooro kolkuu kale." + "remoteSpawnInstanceDisconnected": "Kolkuu la xulay ayaa ka xidhmo. Ku bilow kalfadhi Cloud Agent ama dooro kolkuu kale.", + "liveCount_one": "{{count}} TOOS AH", + "liveCount_other": "{{count}} TOOS AH" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/sq.json b/apps/mobile/src/i18n/locales/sq.json index 4888d55ada..83e0afcf70 100644 --- a/apps/mobile/src/i18n/locales/sq.json +++ b/apps/mobile/src/i18n/locales/sq.json @@ -2114,7 +2114,9 @@ "sessionExited": "Seanca u mbyll", "remoteSpawnRetryable": "Nuk mund të arrihej instanca — mund të jetë shkëputur.", "remoteSpawnNonRetryable": "Instanca nuk arriti të nisë sesionin — kontrolloni makinën ose përditësoni CLI-në.", - "remoteSpawnInstanceDisconnected": "Instanca e zgjedhur u shkëput. Nisni një sesion në Cloud Agent ose zgjidhni një instancë tjetër." + "remoteSpawnInstanceDisconnected": "Instanca e zgjedhur u shkëput. Nisni një sesion në Cloud Agent ose zgjidhni një instancë tjetër.", + "liveCount_one": "{{count}} DREJTPËRDREJT", + "liveCount_other": "{{count}} DREJTPËRDREJT" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/sr.json b/apps/mobile/src/i18n/locales/sr.json index 2f8ff5cd7d..8d3f0613a7 100644 --- a/apps/mobile/src/i18n/locales/sr.json +++ b/apps/mobile/src/i18n/locales/sr.json @@ -2129,7 +2129,10 @@ "sessionExited": "Sesija je završena", "remoteSpawnRetryable": "Nije bilo moguće doći do instance — možda se isključila.", "remoteSpawnNonRetryable": "Instance nije uspela da pokrene sesiju — proverite mašinu ili ažurirajte CLI.", - "remoteSpawnInstanceDisconnected": "Izabrana instanca se isključila. Pokrenite sesiju na Cloud Agent-u ili izaberite drugu instancu." + "remoteSpawnInstanceDisconnected": "Izabrana instanca se isključila. Pokrenite sesiju na Cloud Agent-u ili izaberite drugu instancu.", + "liveCount_one": "{{count}} UŽIVO", + "liveCount_other": "{{count}} UŽIVO", + "liveCount_few": "{{count}} UŽIVO" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/sv.json b/apps/mobile/src/i18n/locales/sv.json index 95fe3bc7c5..61fa3e7c6b 100644 --- a/apps/mobile/src/i18n/locales/sv.json +++ b/apps/mobile/src/i18n/locales/sv.json @@ -2114,7 +2114,9 @@ "sessionExited": "Session avslutad", "remoteSpawnRetryable": "Kunde inte nå instansen – den kan ha kopplats från.", "remoteSpawnNonRetryable": "Instansen kunde inte starta sessionen – kontrollera maskinen eller uppdatera CLI:n.", - "remoteSpawnInstanceDisconnected": "Den valda instansen kopplades från. Starta en session på Cloud Agent eller välj en annan instans." + "remoteSpawnInstanceDisconnected": "Den valda instansen kopplades från. Starta en session på Cloud Agent eller välj en annan instans.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/sw.json b/apps/mobile/src/i18n/locales/sw.json index 232117af9e..9c8962d80b 100644 --- a/apps/mobile/src/i18n/locales/sw.json +++ b/apps/mobile/src/i18n/locales/sw.json @@ -2114,7 +2114,9 @@ "sessionExited": "Kikao kimetoka", "remoteSpawnRetryable": "Hatukuweza kufikia kisa — huenda kimekatika.", "remoteSpawnNonRetryable": "Kisa kilishindwa kuanzisha kikao — angalia mashine au sasisha CLI.", - "remoteSpawnInstanceDisconnected": "Kisa ulichochagua kimekatika. Anzisha kikao kwenye Cloud Agent au chagua kisa kingine." + "remoteSpawnInstanceDisconnected": "Kisa ulichochagua kimekatika. Anzisha kikao kwenye Cloud Agent au chagua kisa kingine.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ta.json b/apps/mobile/src/i18n/locales/ta.json index aa65d502d2..bac759eee1 100644 --- a/apps/mobile/src/i18n/locales/ta.json +++ b/apps/mobile/src/i18n/locales/ta.json @@ -2114,7 +2114,9 @@ "sessionExited": "அமர்வு வெளியேறியது", "remoteSpawnRetryable": "இன்ஸ்டன்ஸை அணுக முடியவில்லை — அது துண்டிக்கப்பட்டிருக்கலாம்.", "remoteSpawnNonRetryable": "இன்ஸ்டன்ஸால் அமர்வைத் தொடங்க முடியவில்லை — கணினியைச் சரிபார்க்கவும் அல்லது CLI-ஐப் புதுப்பிக்கவும்.", - "remoteSpawnInstanceDisconnected": "தேர்ந்தெடுத்த இன்ஸ்டன்ஸ் துண்டிக்கப்பட்டது. Cloud Agent-ல் அமர்வைத் தொடங்கவும் அல்லது வேறு இன்ஸ்டன்ஸைத் தேர்ந்தெடுக்கவும்." + "remoteSpawnInstanceDisconnected": "தேர்ந்தெடுத்த இன்ஸ்டன்ஸ் துண்டிக்கப்பட்டது. Cloud Agent-ல் அமர்வைத் தொடங்கவும் அல்லது வேறு இன்ஸ்டன்ஸைத் தேர்ந்தெடுக்கவும்.", + "liveCount_one": "{{count}} நேரலை", + "liveCount_other": "{{count}} நேரலை" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/te.json b/apps/mobile/src/i18n/locales/te.json index 5096dc975e..3b82282f9d 100644 --- a/apps/mobile/src/i18n/locales/te.json +++ b/apps/mobile/src/i18n/locales/te.json @@ -2114,7 +2114,9 @@ "sessionExited": "సెషన్ నిష్క్రమించింది", "remoteSpawnRetryable": "ఇన్స్టాన్స్ను చేరుకోలేకపోయాం — అది డిస్కనెక్ట్ అయి ఉండవచ్చు.", "remoteSpawnNonRetryable": "ఇన్స్టాన్స్ సెషన్ను ప్రారంభించడంలో విఫలమైంది — యంత్రాన్ని తనిఖీ చేయండి లేదా CLIని నవీకరించండి.", - "remoteSpawnInstanceDisconnected": "ఎంచుకున్న ఇన్స్టాన్స్ డిస్కనెక్ట్ అయింది. Cloud Agentలో సెషన్ను ప్రారంభించండి లేదా మరొక ఇన్స్టాన్స్ను ఎంచుకోండి." + "remoteSpawnInstanceDisconnected": "ఎంచుకున్న ఇన్స్టాన్స్ డిస్కనెక్ట్ అయింది. Cloud Agentలో సెషన్ను ప్రారంభించండి లేదా మరొక ఇన్స్టాన్స్ను ఎంచుకోండి.", + "liveCount_one": "{{count}} ప్రత్యక్ష", + "liveCount_other": "{{count}} ప్రత్యక్ష" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/th.json b/apps/mobile/src/i18n/locales/th.json index 410438c77a..4f761609e1 100644 --- a/apps/mobile/src/i18n/locales/th.json +++ b/apps/mobile/src/i18n/locales/th.json @@ -2114,7 +2114,9 @@ "sessionExited": "ออกจากเซสชันแล้ว", "remoteSpawnRetryable": "ไม่สามารถเข้าถึงอินสแตนซ์ได้ — อาจตัดการเชื่อมต่อแล้ว", "remoteSpawnNonRetryable": "อินสแตนซ์ไม่สามารถเริ่มเซสชันได้ — ตรวจสอบเครื่องหรืออัปเดต CLI", - "remoteSpawnInstanceDisconnected": "อินสแตนซ์ที่เลือกตัดการเชื่อมต่อแล้ว เริ่มเซสชันบน Cloud Agent หรือเลือกอินสแตนซ์อื่น" + "remoteSpawnInstanceDisconnected": "อินสแตนซ์ที่เลือกตัดการเชื่อมต่อแล้ว เริ่มเซสชันบน Cloud Agent หรือเลือกอินสแตนซ์อื่น", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/tr.json b/apps/mobile/src/i18n/locales/tr.json index 6660308c09..368a08b474 100644 --- a/apps/mobile/src/i18n/locales/tr.json +++ b/apps/mobile/src/i18n/locales/tr.json @@ -1660,7 +1660,9 @@ "sessionExited": "Oturumdan çıkıldı", "remoteSpawnRetryable": "Örneğe ulaşılamadı — bağlantısı kesilmiş olabilir.", "remoteSpawnNonRetryable": "Örnek oturumu başlatamadı — makineyi kontrol edin veya CLI'yı güncelleyin.", - "remoteSpawnInstanceDisconnected": "Seçili örnek bağlantısı kesildi. Cloud Agent'ta bir oturum başlatın veya başka bir örnek seçin." + "remoteSpawnInstanceDisconnected": "Seçili örnek bağlantısı kesildi. Cloud Agent'ta bir oturum başlatın veya başka bir örnek seçin.", + "liveCount_one": "{{count}} CANLI", + "liveCount_other": "{{count}} CANLI" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/uk.json b/apps/mobile/src/i18n/locales/uk.json index 5b402dbc8e..ae523cdaba 100644 --- a/apps/mobile/src/i18n/locales/uk.json +++ b/apps/mobile/src/i18n/locales/uk.json @@ -1676,7 +1676,11 @@ "sessionExited": "Сесію завершено", "remoteSpawnRetryable": "Не вдалося з’єднатися з екземпляром — можливо, його відключено.", "remoteSpawnNonRetryable": "Не вдалося запустити сесію на екземплярі — перевірте машину або оновіть CLI.", - "remoteSpawnInstanceDisconnected": "Вибраний екземпляр відключився. Почніть сесію на Cloud Agent або виберіть інший екземпляр." + "remoteSpawnInstanceDisconnected": "Вибраний екземпляр відключився. Почніть сесію на Cloud Agent або виберіть інший екземпляр.", + "liveCount_one": "{{count}} НАЖИВО", + "liveCount_other": "{{count}} НАЖИВО", + "liveCount_few": "{{count}} НАЖИВО", + "liveCount_many": "{{count}} НАЖИВО" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/ur.json b/apps/mobile/src/i18n/locales/ur.json index 58271c23bd..92920e7329 100644 --- a/apps/mobile/src/i18n/locales/ur.json +++ b/apps/mobile/src/i18n/locales/ur.json @@ -2114,7 +2114,9 @@ "sessionExited": "سیشن ختم ہو گیا", "remoteSpawnRetryable": "انسٹینس تک رسائی نہیں ہو سکی — شاید یہ منقطع ہو گیا ہے۔", "remoteSpawnNonRetryable": "انسٹینس سیشن شروع کرنے میں ناکام رہا — مشین چیک کریں یا CLI اپ ڈیٹ کریں۔", - "remoteSpawnInstanceDisconnected": "منتخب انسٹینس منقطع ہو گیا۔ Cloud Agent پر سیشن شروع کریں یا کوئی اور انسٹینس منتخب کریں۔" + "remoteSpawnInstanceDisconnected": "منتخب انسٹینس منقطع ہو گیا۔ Cloud Agent پر سیشن شروع کریں یا کوئی اور انسٹینس منتخب کریں۔", + "liveCount_one": "{{count}} لائیو", + "liveCount_other": "{{count}} لائیو" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/uz.json b/apps/mobile/src/i18n/locales/uz.json index 8d3df2d8c7..afb3f4ef91 100644 --- a/apps/mobile/src/i18n/locales/uz.json +++ b/apps/mobile/src/i18n/locales/uz.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sessiya tugadi", "remoteSpawnRetryable": "Ishlab chiquvchi muhitga yetib bo‘lmadi — u uzilgan bo‘lishi mumkin.", "remoteSpawnNonRetryable": "Ishlab chiquvchi muhit sessiyani ishga tushira olmadi — mashinani tekshiring yoki CLI versiyasini yangilang.", - "remoteSpawnInstanceDisconnected": "Tanlangan ishlab chiquvchi muhit uzildi. Cloud Agent-da sessiya boshlang yoki boshqa muhitni tanlang." + "remoteSpawnInstanceDisconnected": "Tanlangan ishlab chiquvchi muhit uzildi. Cloud Agent-da sessiya boshlang yoki boshqa muhitni tanlang.", + "liveCount_one": "{{count}} JO'N", + "liveCount_other": "{{count}} JO'N" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/vi.json b/apps/mobile/src/i18n/locales/vi.json index c104d60ba3..7c8baa9ae6 100644 --- a/apps/mobile/src/i18n/locales/vi.json +++ b/apps/mobile/src/i18n/locales/vi.json @@ -1660,7 +1660,9 @@ "sessionExited": "Phiên đã thoát", "remoteSpawnRetryable": "Không thể kết nối tới phiên bản — có thể nó đã ngắt kết nối.", "remoteSpawnNonRetryable": "Phiên bản không khởi động được phiên — hãy kiểm tra máy hoặc cập nhật CLI.", - "remoteSpawnInstanceDisconnected": "Phiên bản đã chọn bị ngắt kết nối. Hãy bắt đầu phiên trên Cloud Agent hoặc chọn phiên bản khác." + "remoteSpawnInstanceDisconnected": "Phiên bản đã chọn bị ngắt kết nối. Hãy bắt đầu phiên trên Cloud Agent hoặc chọn phiên bản khác.", + "liveCount_one": "{{count}} TRỰC TIẾP", + "liveCount_other": "{{count}} TRỰC TIẾP" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/yo.json b/apps/mobile/src/i18n/locales/yo.json index e6e61e2106..6dd6b2b9a6 100644 --- a/apps/mobile/src/i18n/locales/yo.json +++ b/apps/mobile/src/i18n/locales/yo.json @@ -2114,7 +2114,9 @@ "sessionExited": "Sẹ́ṣiọ́n ti jáde", "remoteSpawnRetryable": "Kò lè dé ọ̀dọ̀ instance — ó lè ti já kúrò ní ọ̀nà.", "remoteSpawnNonRetryable": "Instance kùnà láti bẹ̀rẹ̀ sẹ́ṣiọ́n — ṣàyẹ̀wò ẹ̀rọ náà tàbí mú CLI ṣòfin.", - "remoteSpawnInstanceDisconnected": "Instance tí wọ́n yàn ti já kúrò ní ọ̀nà. Bẹ̀rẹ̀ sẹ́ṣiọ́n kan lórí Cloud Agent tàbí yan instance mìíràn." + "remoteSpawnInstanceDisconnected": "Instance tí wọ́n yàn ti já kúrò ní ọ̀nà. Bẹ̀rẹ̀ sẹ́ṣiọ́n kan lórí Cloud Agent tàbí yan instance mìíràn.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/zh-Hans.json b/apps/mobile/src/i18n/locales/zh-Hans.json index a4683e1f34..a806659f2d 100644 --- a/apps/mobile/src/i18n/locales/zh-Hans.json +++ b/apps/mobile/src/i18n/locales/zh-Hans.json @@ -1660,7 +1660,9 @@ "sessionExited": "会话已退出", "remoteSpawnRetryable": "无法连接到实例——它可能已断开。", "remoteSpawnNonRetryable": "实例未能启动会话——请检查机器或更新 CLI。", - "remoteSpawnInstanceDisconnected": "所选实例已断开。请在 Cloud Agent 上启动会话,或选择其他实例。" + "remoteSpawnInstanceDisconnected": "所选实例已断开。请在 Cloud Agent 上启动会话,或选择其他实例。", + "liveCount_one": "{{count}} 实时", + "liveCount_other": "{{count}} 实时" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/zh-Hant.json b/apps/mobile/src/i18n/locales/zh-Hant.json index 4ce2c8afb4..f01e55358a 100644 --- a/apps/mobile/src/i18n/locales/zh-Hant.json +++ b/apps/mobile/src/i18n/locales/zh-Hant.json @@ -1660,7 +1660,9 @@ "sessionExited": "工作階段已結束", "remoteSpawnRetryable": "無法連線到該執行個體 — 它可能已斷線。", "remoteSpawnNonRetryable": "該執行個體無法啟動工作階段 — 請檢查機器或更新 CLI。", - "remoteSpawnInstanceDisconnected": "選取的執行個體已斷線。請在 Cloud Agent 上開始工作階段,或選擇其他執行個體。" + "remoteSpawnInstanceDisconnected": "選取的執行個體已斷線。請在 Cloud Agent 上開始工作階段,或選擇其他執行個體。", + "liveCount_one": "{{count}} 即時", + "liveCount_other": "{{count}} 即時" }, "agentChat": { "session": { diff --git a/apps/mobile/src/i18n/locales/zu.json b/apps/mobile/src/i18n/locales/zu.json index 3558449570..8439ab8af5 100644 --- a/apps/mobile/src/i18n/locales/zu.json +++ b/apps/mobile/src/i18n/locales/zu.json @@ -2114,7 +2114,9 @@ "sessionExited": "Iseshini iphumile", "remoteSpawnRetryable": "Asikwazanga ukufinyelela isibonelo — kungenzeka sinqanyulwe.", "remoteSpawnNonRetryable": "Isibonelo sehlulekile ukuqala iseshini — hlola umshini noma ubuyekeze i-CLI.", - "remoteSpawnInstanceDisconnected": "Isibonelo esikhethiwe sinqanyulwe. Qala iseshini ku-Cloud Agent noma ukhethe esinye isibonelo." + "remoteSpawnInstanceDisconnected": "Isibonelo esikhethiwe sinqanyulwe. Qala iseshini ku-Cloud Agent noma ukhethe esinye isibonelo.", + "liveCount_one": "{{count}} LIVE", + "liveCount_other": "{{count}} LIVE" }, "agentChat": { "session": { diff --git a/dev/local/mobile-workflow.test.ts b/dev/local/mobile-workflow.test.ts index 240712a1c1..6a4ee6da7d 100644 --- a/dev/local/mobile-workflow.test.ts +++ b/dev/local/mobile-workflow.test.ts @@ -16,7 +16,7 @@ test('tab layout derives accessibility labels from the visible tab count', () => ); assert.match( layout, - /tabBarAccessibilityLabel: tabAccessibilityLabel\(\s*t\('tabs\.agents'\),\s*tabBarPosition\('agents', tabFlags\) \?\? 2,\s*tabCount\s*\)/ + /tabBarAccessibilityLabel: tabAccessibilityLabel\(\s*liveCount\s*\?\s*`\$\{t\('tabs\.agents'\)\}, \$\{t\('agents\.liveCount', \{ count: liveCount \}\)\}`\s*:\s*t\('tabs\.agents'\),\s*tabBarPosition\('agents', tabFlags\) \?\? 2,\s*tabCount\s*\)/ ); assert.match( layout, diff --git a/tools/i18n/check-catalogs.mjs b/tools/i18n/check-catalogs.mjs index 65b1298181..f40e6c4849 100644 --- a/tools/i18n/check-catalogs.mjs +++ b/tools/i18n/check-catalogs.mjs @@ -567,7 +567,7 @@ for (const catalog of CATALOGS) { if (catalog.checkUsage) { const { called, referenced } = scanSource(); for (const key of called) { - if (!english.has(key)) { + if (!english.has(key) && !englishFamilies.has(key)) { fail(`${catalog.name}: source uses "${key}", which en.json does not define`); } } diff --git a/tools/i18n/check-catalogs.test.mjs b/tools/i18n/check-catalogs.test.mjs new file mode 100644 index 0000000000..353c14dbde --- /dev/null +++ b/tools/i18n/check-catalogs.test.mjs @@ -0,0 +1,164 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { copyFileSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join } from 'node:path'; +import test from 'node:test'; + +const ENGLISH = { + agents: { + title: 'Agents', + liveCount_one: '{{count}} live session', + liveCount_other: '{{count}} live sessions', + }, +}; +const TRANSLATED = { + agents: { + title: 'Localized agents', + liveCount_one: '{{count}} localized session', + liveCount_few: '{{count}} localized sessions (few)', + liveCount_many: '{{count}} localized sessions (many)', + liveCount_other: '{{count}} localized sessions', + }, +}; +const SOURCE = "t('agents.title');\nt('agents.liveCount', { count: 2 });"; + +function runChecker(context, { english = ENGLISH, translated = TRANSLATED, source = SOURCE } = {}) { + const root = mkdtempSync(join(tmpdir(), 'check-catalogs-')); + context.after(() => rmSync(root, { recursive: true, force: true })); + + const files = { + 'apps/mobile/src/i18n/languages.ts': "export const SUPPORTED_LANGUAGES = ['en', 'ru'];", + 'apps/mobile/src/example.ts': source, + 'apps/mobile/src/i18n/locales/en.json': JSON.stringify(english), + 'apps/mobile/src/i18n/locales/ru.json': JSON.stringify(translated), + 'packages/notifications/src/locales/en.json': '{}', + 'packages/notifications/src/locales/ru.json': '{}', + }; + for (const [path, content] of Object.entries(files)) { + const file = join(root, path); + mkdirSync(dirname(file), { recursive: true }); + writeFileSync(file, content); + } + + // Preserve the real command and its import.meta.url-based repository layout. + const toolDir = join(root, 'tools/i18n'); + mkdirSync(toolDir, { recursive: true }); + for (const name of ['check-catalogs.mjs', 'wording-exceptions.json']) { + copyFileSync(new URL(`./${name}`, import.meta.url), join(toolDir, name)); + } + const result = spawnSync(process.execPath, [join(toolDir, 'check-catalogs.mjs')], { + cwd: root, + encoding: 'utf8', + timeout: 10_000, + }); + assert.ifError(result.error); + return result; +} + +for (const callee of ['t', 'i18n.t']) { + test(`accepts a plural base called through ${callee} with English siblings`, context => { + const result = runChecker(context, { + source: `t('agents.title');\n${callee}('agents.liveCount', { count: 2 });`, + }); + assert.equal(result.status, 0, result.stderr); + assert.equal(result.stderr, ''); + assert.match(result.stdout, /check-catalogs: 2 languages, every catalog matches en\.json/); + }); +} + +test('accepts an exact source key without plural siblings', context => { + const result = runChecker(context, { + english: { agents: { title: 'Agents' } }, + translated: { agents: { title: 'Localized agents' } }, + source: "t('agents.title');", + }); + assert.equal(result.status, 0, result.stderr); + assert.equal(result.stderr, ''); +}); + +for (const [name, call, key] of [ + ['a missing unrelated source key', "t('profile.missing');", 'profile.missing'], + ['a nonexistent plural family', "t('agents.missingCount', { count: 2 });", 'agents.missingCount'], +]) { + test(`rejects ${name}`, context => { + const result = runChecker(context, { source: `${SOURCE}\n${call}` }); + assert.equal(result.status, 1, result.stderr); + assert.ok( + result.stderr.includes(`mobile: source uses "${key}", which en.json does not define`) + ); + }); +} + +test('rejects a missing translated English key', context => { + const translated = { agents: { ...TRANSLATED.agents } }; + delete translated.agents.title; + const result = runChecker(context, { translated }); + assert.equal(result.status, 1, result.stderr); + assert.match(result.stderr, /mobile\/ru: missing key "agents\.title"/); +}); + +test('rejects a missing required locale plural category', context => { + const translated = { agents: { ...TRANSLATED.agents } }; + delete translated.agents.liveCount_few; + const result = runChecker(context, { translated }); + assert.equal(result.status, 1, result.stderr); + assert.match( + result.stderr, + /mobile\/ru: plural family "agents\.liveCount" lacks the few category of ru/ + ); +}); + +test('rejects an unused English exact key', context => { + const result = runChecker(context, { source: "t('agents.liveCount', { count: 2 });" }); + assert.equal(result.status, 1, result.stderr); + assert.match( + result.stderr, + /mobile: en\.json defines "agents\.title", which no source file uses/ + ); +}); + +test('rejects unused English plural siblings', context => { + const result = runChecker(context, { source: "t('agents.title');" }); + assert.equal(result.status, 1, result.stderr); + assert.match( + result.stderr, + /mobile: en\.json defines "agents\.liveCount_one", which no source file uses/ + ); + assert.match( + result.stderr, + /mobile: en\.json defines "agents\.liveCount_other", which no source file uses/ + ); +}); + +test('rejects an empty translated value', context => { + const result = runChecker(context, { + translated: { agents: { ...TRANSLATED.agents, title: '' } }, + }); + assert.equal(result.status, 1, result.stderr); + assert.match(result.stderr, /mobile\/ru: "agents\.title" is empty/); +}); + +test('rejects changed placeholders in an English plural sibling', context => { + const result = runChecker(context, { + translated: { agents: { ...TRANSLATED.agents, liveCount_one: '{{total}} localized session' } }, + }); + assert.equal(result.status, 1, result.stderr); + assert.match( + result.stderr, + /mobile\/ru: "agents\.liveCount_one" placeholders differ from English \(count\)/ + ); +}); + +test('rejects unknown placeholders in a locale-specific plural category', context => { + const result = runChecker(context, { + translated: { + agents: { ...TRANSLATED.agents, liveCount_few: '{{total}} localized sessions (few)' }, + }, + }); + assert.equal(result.status, 1, result.stderr); + assert.match( + result.stderr, + /mobile\/ru: "agents\.liveCount_few" uses placeholder \{\{total\}\}, which the English family does not/ + ); +});