Skip to content
Merged
Show file tree
Hide file tree
Changes from 96 commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
7beb6ed
fix(mobile): correct de translations for UI context
iscekic Sep 4, 2026
bb7e7d0
fix(mobile): correct fr translations for UI context
iscekic Sep 4, 2026
a37177b
fix(mobile): correct es translations for UI context
iscekic Sep 4, 2026
bcb1bb9
fix(mobile): correct pt-BR translations for UI context
iscekic Sep 4, 2026
d2a3d43
fix(mobile): correct pt translations for UI context
iscekic Sep 4, 2026
1d18f21
fix(mobile): correct it translations for UI context
iscekic Sep 4, 2026
fa9b47d
fix(mobile): correct nl translations for UI context
iscekic Sep 4, 2026
4b80b16
fix(mobile): correct ja translations for UI context
iscekic Sep 4, 2026
00675c0
fix(mobile): correct ko translations for UI context
iscekic Sep 4, 2026
4dc49e8
fix(mobile): correct zh-Hans translations for UI context
iscekic Sep 4, 2026
12de4b6
fix(mobile): correct zh-Hant translations for UI context
iscekic Sep 4, 2026
33a8cde
fix(mobile): correct ru translations for UI context
iscekic Sep 4, 2026
7af6f44
fix(mobile): correct pl translations for UI context
iscekic Sep 4, 2026
884ce83
fix(mobile): correct tr translations for UI context
iscekic Sep 4, 2026
5db9023
fix(mobile): correct id translations for UI context
iscekic Sep 4, 2026
269c287
fix(mobile): correct hi translations for UI context
iscekic Sep 4, 2026
dc4a509
fix(mobile): correct ar translations for UI context
iscekic Sep 4, 2026
88d08d9
fix(mobile): correct vi translations for UI context
iscekic Sep 4, 2026
e9bb9bb
fix(mobile): correct th translations for UI context
iscekic Sep 4, 2026
e78616b
fix(mobile): correct uk translations for UI context
iscekic Sep 4, 2026
0063a4d
fix(mobile): correct af translations for UI context
iscekic Sep 4, 2026
a124600
fix(mobile): correct sq translations for UI context
iscekic Sep 4, 2026
5039597
fix(mobile): correct hy translations for UI context
iscekic Sep 4, 2026
0d24a58
fix(mobile): correct am translations for UI context
iscekic Sep 4, 2026
7ad60cd
fix(mobile): correct az translations for UI context
iscekic Sep 4, 2026
b904239
fix(mobile): correct eu translations for UI context
iscekic Sep 4, 2026
3cbe43d
fix(mobile): correct be translations for UI context
iscekic Sep 4, 2026
20afbc8
fix(mobile): correct bn translations for UI context
iscekic Sep 4, 2026
1f53321
fix(mobile): correct bs translations for UI context
iscekic Sep 4, 2026
e34ff50
fix(mobile): correct bg translations for UI context
iscekic Sep 4, 2026
f8b9825
fix(mobile): correct ca translations for UI context
iscekic Sep 4, 2026
ffdfdee
fix(mobile): correct my translations for UI context
iscekic Sep 4, 2026
e355c87
fix(mobile): correct hr translations for UI context
iscekic Sep 4, 2026
4ac9c4a
fix(mobile): correct cs translations for UI context
iscekic Sep 4, 2026
5e9aa90
fix(mobile): correct da translations for UI context
iscekic Sep 4, 2026
4eeec78
fix(mobile): correct et translations for UI context
iscekic Sep 4, 2026
6d785a7
fix(mobile): correct fil translations for UI context
iscekic Sep 4, 2026
19ad37d
fix(mobile): correct fi translations for UI context
iscekic Sep 4, 2026
8da7e53
fix(mobile): correct gl translations for UI context
iscekic Sep 4, 2026
7a00452
fix(mobile): correct ka translations for UI context
iscekic Sep 4, 2026
0482431
fix(mobile): correct el translations for UI context
iscekic Sep 4, 2026
6570601
fix(mobile): correct gu translations for UI context
iscekic Sep 4, 2026
868dd25
fix(mobile): correct ht translations for UI context
iscekic Sep 4, 2026
3d9b0dc
fix(mobile): correct ha translations for UI context
iscekic Sep 4, 2026
5197d08
fix(mobile): correct he translations for UI context
iscekic Sep 4, 2026
122f04e
fix(mobile): correct hu translations for UI context
iscekic Sep 4, 2026
8c59adb
fix(mobile): correct is translations for UI context
iscekic Sep 4, 2026
881f373
fix(mobile): correct ig translations for UI context
iscekic Sep 4, 2026
a3d1012
fix(mobile): correct ga translations for UI context
iscekic Sep 4, 2026
9c5c822
fix(mobile): correct kk translations for UI context
iscekic Sep 4, 2026
077fb50
fix(mobile): correct kn translations for UI context
iscekic Sep 4, 2026
e2e13a4
fix(mobile): correct km translations for UI context
iscekic Sep 4, 2026
c5e0b16
fix(mobile): correct ckb translations for UI context
iscekic Sep 4, 2026
7410057
fix(mobile): correct lv translations for UI context
iscekic Sep 4, 2026
61418f9
fix(mobile): correct lt translations for UI context
iscekic Sep 4, 2026
ce32eac
fix(mobile): correct mk translations for UI context
iscekic Sep 4, 2026
c56588f
fix(mobile): correct mg translations for UI context
iscekic Sep 4, 2026
7215b5b
fix(mobile): correct ms translations for UI context
iscekic Sep 4, 2026
f61903a
fix(mobile): correct ml translations for UI context
iscekic Sep 4, 2026
611a0bf
fix(mobile): correct mt translations for UI context
iscekic Sep 4, 2026
3a84df5
fix(mobile): correct mi translations for UI context
iscekic Sep 4, 2026
49b2ed5
fix(mobile): correct mr translations for UI context
iscekic Sep 4, 2026
b985a78
fix(mobile): correct mn translations for UI context
iscekic Sep 4, 2026
0d72363
fix(mobile): correct ne translations for UI context
iscekic Sep 4, 2026
e4bba32
fix(mobile): correct nb translations for UI context
iscekic Sep 4, 2026
3f06772
fix(mobile): correct or translations for UI context
iscekic Sep 4, 2026
018b132
fix(mobile): correct om translations for UI context
iscekic Sep 4, 2026
c03bbca
fix(mobile): correct fa translations for UI context
iscekic Sep 4, 2026
57d24ad
test(mobile): allowlist the KiloClaw product name in the catalog check
iscekic Sep 4, 2026
c02889c
fix(mobile): correct ps translations for UI context
iscekic Sep 4, 2026
3d120f1
fix(mobile): correct pa translations for UI context
iscekic Sep 4, 2026
55710d0
fix(mobile): correct ro translations for UI context
iscekic Sep 4, 2026
1de484f
fix(mobile): correct sr translations for UI context
iscekic Sep 4, 2026
5faf0d5
fix(mobile): correct si translations for UI context
iscekic Sep 4, 2026
8e008db
fix(mobile): correct sk translations for UI context
iscekic Sep 4, 2026
81d3ec7
fix(mobile): correct sl translations for UI context
iscekic Sep 4, 2026
02bb84c
fix(mobile): correct so translations for UI context
iscekic Sep 4, 2026
aef691c
fix(mobile): correct sw translations for UI context
iscekic Sep 4, 2026
3bffb2a
fix(mobile): correct sv translations for UI context
iscekic Sep 4, 2026
7436f7a
fix(mobile): correct ta translations for UI context
iscekic Sep 4, 2026
d5542f9
fix(mobile): correct ur translations for UI context
iscekic Sep 4, 2026
13bb8cb
fix(mobile): correct uz translations for UI context
iscekic Sep 4, 2026
8c39dd3
test(mobile): allowlist Bitbucket in the catalog check
iscekic Sep 4, 2026
b57cf78
fix(mobile): correct te translations for UI context
iscekic Sep 4, 2026
940e177
fix(mobile): correct cy translations for UI context
iscekic Sep 4, 2026
4c305f8
fix(mobile): correct yo translations for UI context
iscekic Sep 4, 2026
8617b1c
test(mobile): allowlist the Kilo product name in the catalog check
iscekic Sep 4, 2026
92c0066
fix(mobile): correct zu translations for UI context
iscekic Sep 4, 2026
dc88b44
fix(mobile): correct lo translations for UI context
iscekic Sep 4, 2026
521979c
refactor(mobile): collapse duplicate translation keys, batch 1 of 4
iscekic Sep 4, 2026
0123e3f
refactor(mobile): collapse duplicate translation keys, batch 2 of 4
iscekic Sep 4, 2026
f222f16
refactor(mobile): collapse duplicate translation keys, batch 3 of 4
iscekic Sep 4, 2026
2cf320f
refactor(mobile): collapse duplicate translation keys, batch 4 of 4
iscekic Sep 4, 2026
9fc7ec3
test(mobile): require one key per piece of copy
iscekic Sep 4, 2026
2dfab75
fix(mobile): restore the case the English copy sets
iscekic Sep 4, 2026
af8e283
test(mobile): follow the renamed keys and the new Spanish copy
iscekic Sep 4, 2026
e49d7f5
Merge branch 'main' into fix/mobile-i18n-context-pass
iscekic Sep 4, 2026
039dd6c
fix(mobile): keep Greek accents and drop Georgian capitals
iscekic Sep 4, 2026
cca0d73
refactor(mobile): point the dismissed label at one key
iscekic Sep 4, 2026
412e466
docs(mobile): record which languages take the English case
iscekic Sep 4, 2026
360b75c
fix(mobile): review the translations main added
iscekic Sep 4, 2026
f83e6fc
docs(i18n): state what the duplicate-copy rule exempts
iscekic Sep 4, 2026
90aeee7
fix(dev): track the tab label keys the i18n pass moved to common
iscekic Sep 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 19 additions & 0 deletions apps/mobile/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,25 @@ git diff --check
- Set `freezeOnBlur: true` on tabs. Use haptics for commits and outcomes only, never passive interaction.
- Set `transition={0}` on small or header `expo-image` images to avoid flicker.

## Translations

Copy lives in `src/i18n/locales/en.json`. The other 86 catalogs are reviewed
against the screens their keys render on, so a key's name and its context are
what a translator has to work from.

- Add and edit copy in `en.json` only. Never hand-edit another catalog.
- Search `en.json` for the string before you add a key. If the copy already
exists, reuse that key. `pnpm check:i18n` fails when two keys hold the same copy.
- Put copy used by more than one section under `common.`.
- Name a label with `$t(other.key)`; never spell an English label inside another
message, or every catalog quotes a button the reader never sees.
- Keep the `{{placeholder}}` set identical to English. Word order around a
placeholder is the translator's to change, so never assume English order.
- Name a key for what the string is, not for the one screen that shows it first.
- If one English word truly needs two senses, add it to `TWO_SENSE_COPY` in
`tools/i18n/check-catalogs.mjs` and record both senses there.
- Run `pnpm check:i18n` after you touch copy.

## Design

The app follows https://github.com/Kilo-Org/kilo-design/ in general, except where this file states otherwise.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ function InstanceRow({
</Text>
<View className="flex-row flex-wrap items-center gap-x-3 gap-y-1">
<Text variant="muted" numberOfLines={1}>
{instance.organizationName ?? t('chat.instancePicker.personal')}
{instance.organizationName ?? t('common.personal')}
</Text>
<StatusBadge status={instance.status} />
</View>
Expand Down Expand Up @@ -100,7 +100,7 @@ export default function InstancePickerScreen() {
{showList && loadedInstances.length === 0 ? (
<EmptyState
icon={Server}
title={t('chat.instancePicker.noInstances')}
title={t('common.noKiloclawInstances')}
description={t('chat.instancePicker.noInstancesDescription')}
action={
<Button
Expand Down
4 changes: 2 additions & 2 deletions apps/mobile/src/app/(app)/(tabs)/(1_kiloclaw)/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export default function KiloClawTab() {
return (
<View className="flex-1 bg-background">
<ScreenHeader
title={t('kiloclaw.title')}
title={t('common.kiloclaw')}
size="large"
showBackButton={false}
className="px-[22px]"
Expand Down Expand Up @@ -101,7 +101,7 @@ export default function KiloClawTab() {
return (
<View className="flex-1 bg-background">
<ScreenHeader
title={t('kiloclaw.title')}
title={t('common.kiloclaw')}
size="large"
showBackButton={false}
className="px-[22px]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export default function FocusAreasRoute() {
const { t } = useTranslation();
const areaLabels = {
security: 'codeReviewer.focusArea.security',
performance: 'codeReviewer.focusArea.performance',
performance: 'common.performance',
bugs: 'codeReviewer.focusArea.bugs',
style: 'codeReviewer.focusArea.style',
testing: 'codeReviewer.focusArea.testing',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ export default function GateThresholdRoute() {
const save = useSaveReviewConfig(scope, platform);
const { t } = useTranslation();
const labels = {
off: t('codeReviewer.gateThreshold.off'),
all: t('codeReviewer.gateThreshold.all'),
off: t('common.off'),
all: t('common.all'),
warning: t('codeReviewer.gateThreshold.warning'),
critical: t('codeReviewer.gateThreshold.critical'),
critical: t('common.critical'),
} as const;
const descriptions = {
off: t('codeReviewer.gate.off'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export default function ReposRoute() {
<QueryError
variant="server"
placement={fullBodyState ? 'center' : 'top'}
title={t('codeReviewer.repos.couldNotLoad')}
title={t('common.couldNotLoadRepositories')}
onRetry={refetchRepos}
isRetrying={reposFetching}
/>
Expand All @@ -138,7 +138,7 @@ export default function ReposRoute() {
size="sm"
onPress={() => {
void openExternalUrl(getBitbucketIntegrationUrl(WEB_BASE_URL, scope), {
label: t('codeReviewer.repos.bitbucketSetup'),
label: t('codeReviewer.bitbucket.setup'),
});
}}
>
Expand Down Expand Up @@ -171,7 +171,7 @@ export default function ReposRoute() {
{ label: t('codeReviewer.repos.repositoryAccess') }
);
} catch {
toast.error(t('codeReviewer.repos.couldNotOpenGithubSettings'));
toast.error(t('prReview.couldNotOpenGitHubAppSettings'));
}
} else if (platform === 'gitlab') {
await openExternalUrl(getGitLabIntegrationUrl(WEB_BASE_URL, orgScope), {
Expand All @@ -191,20 +191,20 @@ export default function ReposRoute() {

return (
<View className="flex-1 bg-background">
<ScreenHeader title={t('codeReviewer.repos.title')} />
<ScreenHeader title={t('common.repositories')} />
{fullBodyState ? (
repoState
) : (
<TabScreenScrollView className="flex-1" contentContainerClassName="px-6 pt-4">
{capabilities.selectionModePicker && (
<RadioGroup label={t('codeReviewer.repos.title')}>
<RadioGroup label={t('common.repositories')}>
{(['all', 'selected'] as const).map(option => (
<ChoiceRow
key={option}
label={
option === 'all'
? t('codeReviewer.repos.allRepositories')
: t('codeReviewer.repos.selectedRepositories')
? t('common.allRepositories')
: t('common.selectedRepositories')
}
selected={mode === option}
disabled={configDisabled}
Expand All @@ -220,7 +220,7 @@ export default function ReposRoute() {
{(!capabilities.selectionModePicker || mode === 'selected') && (
<View className={capabilities.selectionModePicker ? 'mt-6' : undefined}>
<Text variant="small" className="mb-1 uppercase tracking-wide text-muted-foreground">
{t('codeReviewer.repos.title')}
{t('common.repositories')}
</Text>
{reposLoading && (
<View className="gap-3 pt-2">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default function ReviewStyleRoute() {
const { t } = useTranslation();
const labels = {
strict: t('codeReviewer.reviewStyle.strict'),
balanced: t('codeReviewer.reviewStyle.balanced'),
balanced: t('common.balanced'),
lenient: t('codeReviewer.reviewStyle.lenient'),
roast: t('codeReviewer.reviewStyle.roast'),
} as const;
Expand Down
32 changes: 19 additions & 13 deletions apps/mobile/src/app/(app)/(tabs)/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,9 @@ export default function TabsLayout() {
name="(1_kiloclaw)"
options={{
href: showKiloClawTab ? undefined : null,
title: t('tabs.kiloclaw'),
title: t('common.kiloclaw'),
tabBarAccessibilityLabel: tabAccessibilityLabel(
t('tabs.kiloclaw'),
t('common.kiloclaw'),
tabBarPosition('kiloclaw', tabFlags) ?? 2,
tabCount
),
Expand All @@ -175,7 +175,7 @@ export default function TabsLayout() {
label={
fontScale > TAB_LABEL_WRAP_FONT_SCALE
? t('tabs.kiloclawWrapped')
: t('tabs.kiloclaw')
: t('common.kiloclaw')
}
focused={focused}
/>
Expand All @@ -195,16 +195,16 @@ export default function TabsLayout() {
<Tabs.Screen
name="(2_agents)"
options={{
title: t('tabs.agents'),
title: t('common.agents'),
tabBarBadge: needsInputBadge,
tabBarAccessibilityLabel: tabAccessibilityLabel(
needsInputBadge
? `${t('tabs.agents')}, ${needsInputBadge} ${t('agents.sessionRow.needsInput')}`
: t('tabs.agents'),
? `${t('common.agents')}, ${needsInputBadge} ${t('agents.sessionRow.needsInput')}`
: t('common.agents'),
tabBarPosition('agents', tabFlags) ?? 2,
tabCount
),
tabBarLabel: ({ focused }) => <TabLabel label={t('tabs.agents')} focused={focused} />,
tabBarLabel: ({ focused }) => <TabLabel label={t('common.agents')} focused={focused} />,
tabBarIcon: ({ color, focused }) => (
<Bot size={tabIconSize} color={color} strokeWidth={focused ? 2 : 1.5} />
),
Expand All @@ -219,13 +219,13 @@ export default function TabsLayout() {
name="(4_chat)"
options={{
href: showQuickChatTab ? undefined : null,
title: t('tabs.chat'),
title: t('common.chat'),
tabBarAccessibilityLabel: tabAccessibilityLabel(
t('tabs.chat'),
t('common.chat'),
tabBarPosition('chat', tabFlags) ?? 3,
tabCount
),
tabBarLabel: ({ focused }) => <TabLabel label={t('tabs.chat')} focused={focused} />,
tabBarLabel: ({ focused }) => <TabLabel label={t('common.chat')} focused={focused} />,
tabBarIcon: ({ color, focused }) => (
<MessageCircle size={tabIconSize} color={color} strokeWidth={focused ? 2 : 1.5} />
),
Expand All @@ -239,9 +239,15 @@ export default function TabsLayout() {
<Tabs.Screen
name="(3_profile)"
options={{
title: t('tabs.profile'),
tabBarAccessibilityLabel: tabAccessibilityLabel(t('tabs.profile'), tabCount, tabCount),
tabBarLabel: ({ focused }) => <TabLabel label={t('tabs.profile')} focused={focused} />,
title: t('common.profile'),
tabBarAccessibilityLabel: tabAccessibilityLabel(
t('common.profile'),
tabCount,
tabCount
),
tabBarLabel: ({ focused }) => (
<TabLabel label={t('common.profile')} focused={focused} />
),
tabBarIcon: ({ color, focused }) => (
<UserRound size={tabIconSize} color={color} strokeWidth={focused ? 2 : 1.5} />
),
Expand Down
10 changes: 5 additions & 5 deletions apps/mobile/src/app/(app)/agent-chat/[session-id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,19 +171,19 @@ export default function SessionDetailScreen() {
);
let message = t(
identityFailed
? 'bootstrap.couldNotLoadAccountDescription'
? 'organization.boundary.loadErrorMessage'
: 'agentChat.session.failedToLoadDetails'
);
let variant: 'neutral' | 'not-found' | 'permission' | 'server' = identityFailed
? 'neutral'
: 'server';
if (notFound) {
title = t('agentChat.session.notFound');
message = t('agentChat.session.notFoundDescription');
title = t('common.notFound');
message = t('queryError.notFoundDescription');
variant = 'not-found';
} else if (unauthorized) {
title = t('agentChat.session.accessDenied');
message = t('agentChat.session.accessDeniedDescription');
title = t('common.accessDenied');
message = t('queryError.permissionDescription');
variant = 'permission';
}
const retry = identityFailed ? confirmation.retry : () => void sessionQuery.refetch();
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/src/app/(app)/agent-chat/instance-picker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ export default function InstancePickerScreen() {
icon={Server}
placement="center"
title={t('agentChat.instancePicker.couldNotLoad')}
description={t('agentChat.instancePicker.couldNotLoadDescription')}
description={t('organization.boundary.loadErrorMessage')}
action={
<Button
variant="outline"
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/src/app/(app)/agent-chat/repo-picker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ export default function RepoPickerScreen() {
}
description={
search.trim()
? t('agentChat.repoPicker.tryDifferentSearch')
? t('agents.sessionList.tryDifferentSearch')
: t('agentChat.repoPicker.noRepositoriesDescription')
}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ export function useNewSessionDiscardGuard({
: 'agentChat.newSession.discardDraftMessage'
),
[
{ text: i18n.t('agentChat.newSession.keepEditing'), style: 'cancel' },
{ text: i18n.t('common.keepEditing'), style: 'cancel' },
{
text: i18n.t('agentChat.newSession.discard'),
text: i18n.t('common.discard'),
style: 'destructive',
onPress: () => {
void (async () => {
Expand Down
8 changes: 4 additions & 4 deletions apps/mobile/src/app/(app)/kiloclaw/[instance-id]/billing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { useTRPC } from '@/lib/trpc';
import { cn } from '@/lib/utils';

const SUBSCRIPTION_PLAN_KEYS = {
commit: 'kiloclaw.billing.planName.commit',
commit: 'kiloclaw.billing.commit',
standard: 'kiloclaw.billing.planName.standard',
} satisfies Record<string, string>;

Expand Down Expand Up @@ -107,7 +107,7 @@ function FinalCommitTermDetails({

return (
<View>
<DetailRow label={t('kiloclaw.billing.plan')} value={t('kiloclaw.billing.commitPlan')} />
<DetailRow label={t('kiloclaw.billing.plan')} value={t('kiloclaw.billing.commit')} />
<View className="h-px bg-border" />
<DetailRow label={t('kiloclaw.billing.finalTermEnds')} value={finalDate} />
<View className="h-px bg-border" />
Expand Down Expand Up @@ -164,7 +164,7 @@ function PlanDetails({
<View>
<DetailRow label={t('kiloclaw.billing.plan')} value={t('kiloclaw.billing.freeTrial')} />
<View className="h-px bg-border" />
<DetailRow label={t('kiloclaw.billing.remaining')} value={daysText} />
<DetailRow label={t('common.remaining')} value={daysText} />
<View className="h-px bg-border" />
<DetailRow
label={t('kiloclaw.billing.ends')}
Expand All @@ -179,7 +179,7 @@ function PlanDetails({
<View>
<DetailRow label={t('kiloclaw.billing.plan')} value={t('kiloclaw.billing.earlybird')} />
<View className="h-px bg-border" />
<DetailRow label={t('kiloclaw.billing.remaining')} value={daysText} />
<DetailRow label={t('common.remaining')} value={daysText} />
<View className="h-px bg-border" />
<DetailRow
label={t('kiloclaw.billing.expires')}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ export default function DevicePairingScreen() {
<Monitor size={18} color={colors.foreground} />
<View className="flex-1 gap-0.5">
<Text className="text-sm font-medium">
{request.role ?? t('kiloclaw.devicePairing.device')}
{request.role ?? t('common.device')}
</Text>
<Text variant="muted" className="text-xs">
{[request.platform, request.requestId.slice(0, 12)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ export default function GoogleScreen() {
isConnected ? 'text-good' : 'text-muted-foreground'
)}
>
{isConnected ? t('kiloclaw.google.connected') : t('kiloclaw.google.notConnected')}
{isConnected ? t('common.connected') : t('common.notConnected')}
</Text>
</View>
</View>
Expand All @@ -160,7 +160,7 @@ export default function GoogleScreen() {
{!mutations.restartMachine.isPending && (
<RefreshCw size={14} color={colors.foreground} />
)}
<Text>{t('kiloclaw.google.redeploy')}</Text>
<Text>{t('kiloclaw.redeploy')}</Text>
</Button>
</View>
)}
Expand Down Expand Up @@ -219,9 +219,7 @@ export default function GoogleScreen() {
onPress={handleToggleGmail}
disabled={mutations.setGmailNotifications.isPending}
>
<Text>
{gmailEnabled ? t('kiloclaw.google.enabled') : t('kiloclaw.google.disabled')}
</Text>
<Text>{gmailEnabled ? t('common.enabled') : t('common.disabled')}</Text>
</Button>
</View>
</View>
Expand Down
Loading