chore(client): translate all user-visible strings to English

Mixed-language UI was confusing — onboarding said "Why DChain / How it
works / Your keys" in English headings but feature descriptions and
CTAs were in Russian; compose's confirm dialog was Russian; feed tabs
were Russian; error messages in humanizeTxError were Russian.
Everything user-facing is now English.

Files touched (only string literals, not comments):
  app/index.tsx              onboarding slides + CTA buttons
  app/(app)/compose.tsx      composer alerts, header button, placeholder,
                             attachment-size hint
  app/(app)/feed/index.tsx   tab labels (Following/For you/Trending),
                             empty-state hints, retry button
  app/(app)/feed/[id].tsx    post detail header + stats rows (Views,
                             Likes, Size, Paid to publish, Hosted on,
                             Hashtags)
  app/(app)/feed/tag/[tag].tsx  empty-state copy
  app/(app)/profile/[address].tsx  Profile header, Follow/Following,
                             Edit, Open chat, Address, Copied, Encryption,
                             Added, Members, unknown-contact hint
  app/(app)/new-contact.tsx  Search title, placeholder, Search button,
                             empty-state hint, E2E-ready indicator,
                             Intro label + placeholder, fee-tier labels
                             (Min / Standard / Priority), Send request,
                             Insufficient-balance alert, Request-sent
                             alert
  app/(app)/requests.tsx     Notifications title, empty-state, Accept /
                             Decline buttons, decline-confirm alert,
                             "wants to add you" line
  components/SearchBar.tsx   default placeholder
  components/feed/PostCard.tsx  long-press menu (Delete post, confirm,
                             Actions / Cancel)
  components/feed/ShareSheet.tsx  sheet title, contact-search placeholder,
                             empty state, Select contacts / Send button,
                             plural helper rewritten for English
  components/chat/PostRefCard.tsx  "POST" ribbon, "photo" indicator
  lib/api.ts                 humanizeTxError (rate-limit, clock skew,
                             bad signature, 400/5xx/network-error
                             messages)
  lib/dates.ts               dateBucket now returns Today/Yesterday/
                             "Jun 17, 2025"; month array switched to
                             English short forms

Code comments left in Russian intentionally — they're developer
context, not user-facing. This commit is purely display-string.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
vsecoder
2026-04-18 23:39:38 +03:00
parent 060ac6c2c9
commit f7a849ddcb
14 changed files with 134 additions and 139 deletions

View File

@@ -98,11 +98,11 @@ export default function ComposeScreen() {
const perm = await ImagePicker.requestMediaLibraryPermissionsAsync();
if (!perm.granted) {
Alert.alert(
'Нужен доступ к фото',
'Откройте настройки и разрешите доступ к галерее.',
'Photo access required',
'Please enable photo library access in Settings.',
[
{ text: 'Отмена' },
{ text: 'Настройки', onPress: () => Linking.openSettings() },
{ text: 'Cancel' },
{ text: 'Settings', onPress: () => Linking.openSettings() },
],
);
return;
@@ -132,8 +132,8 @@ export default function ComposeScreen() {
if (bytes.length > MAX_POST_BYTES - 512) {
Alert.alert(
'Слишком большое',
`Картинка ${Math.round(bytes.length / 1024)} KB — лимит ${MAX_POST_BYTES / 1024} KB. Попробуйте выбрать поменьше.`,
'Image too large',
`Image is ${Math.round(bytes.length / 1024)} KB but the limit is ${MAX_POST_BYTES / 1024} KB. Try picking a smaller one.`,
);
return;
}
@@ -147,7 +147,7 @@ export default function ComposeScreen() {
height: manipulated.height,
});
} catch (e: any) {
Alert.alert('Не удалось', String(e?.message ?? e));
Alert.alert('Failed', String(e?.message ?? e));
} finally {
setPicking(false);
}
@@ -159,19 +159,19 @@ export default function ComposeScreen() {
// Balance guard.
if (balance !== null && balance < estimatedFee) {
Alert.alert(
'Недостаточно средств',
`Нужно ${formatFee(estimatedFee)}, на балансе ${formatFee(balance)}.`,
'Insufficient balance',
`Need ${formatFee(estimatedFee)}, have ${formatFee(balance)}.`,
);
return;
}
Alert.alert(
'Опубликовать пост?',
`Цена: ${formatFee(estimatedFee)}\nРазмер: ${Math.round(totalBytes / 1024 * 10) / 10} KB`,
'Publish post?',
`Cost: ${formatFee(estimatedFee)}\nSize: ${Math.round(totalBytes / 1024 * 10) / 10} KB`,
[
{ text: 'Отмена', style: 'cancel' },
{ text: 'Cancel', style: 'cancel' },
{
text: 'Опубликовать',
text: 'Publish',
onPress: async () => {
setBusy(true);
try {
@@ -185,7 +185,7 @@ export default function ComposeScreen() {
// Close composer and open the new post.
router.replace(`/(app)/feed/${postID}` as never);
} catch (e: any) {
Alert.alert('Не удалось опубликовать', humanizeTxError(e));
Alert.alert('Failed to publish', humanizeTxError(e));
} finally {
setBusy(false);
}
@@ -235,7 +235,7 @@ export default function ComposeScreen() {
fontSize: 14,
}}
>
Опубликовать
Publish
</Text>
)}
</Pressable>
@@ -251,7 +251,7 @@ export default function ComposeScreen() {
<TextInput
value={content}
onChangeText={setContent}
placeholder="Что происходит?"
placeholder="What's happening?"
placeholderTextColor="#5a5a5a"
multiline
maxLength={MAX_CONTENT_LENGTH}
@@ -328,7 +328,7 @@ export default function ComposeScreen() {
</Pressable>
</View>
<Text style={{ color: '#6a6a6a', fontSize: 11, marginTop: 6 }}>
{Math.round(attach.size / 1024)} KB · метаданные удалят на сервере
{Math.round(attach.size / 1024)} KB · metadata stripped on server
</Text>
</View>
)}