1
0
forked from Kieran/snort

chore: Update translations

This commit is contained in:
Kieran 2023-09-24 12:36:51 +00:00
parent 0e9ca7e2e3
commit 9f731da5be
10 changed files with 101 additions and 77 deletions

View File

@ -8,7 +8,18 @@ import useEventPublisher from "Hooks/useEventPublisher";
import { getMutedKeys } from "Feed/MuteList"; import { getMutedKeys } from "Feed/MuteList";
import useModeration from "Hooks/useModeration"; import useModeration from "Hooks/useModeration";
import useLogin from "Hooks/useLogin"; import useLogin from "Hooks/useLogin";
import { SnortAppData, addSubscription, setAppData, setBlocked, setBookmarked, setFollows, setMuted, setPinned, setRelays, setTags } from "Login"; import {
SnortAppData,
addSubscription,
setAppData,
setBlocked,
setBookmarked,
setFollows,
setMuted,
setPinned,
setRelays,
setTags,
} from "Login";
import { SnortPubKey } from "Const"; import { SnortPubKey } from "Const";
import { SubscriptionEvent } from "Subscription"; import { SubscriptionEvent } from "Subscription";
import useRelaysFeedFollows from "./RelaysFeedFollows"; import useRelaysFeedFollows from "./RelaysFeedFollows";
@ -101,12 +112,11 @@ export default function useLoginFeed() {
).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap))); ).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap)));
const appData = getNewest(loginFeed.data.filter(a => a.kind === EventKind.AppData)); const appData = getNewest(loginFeed.data.filter(a => a.kind === EventKind.AppData));
if(appData) { if (appData) {
publisher.decryptGeneric(appData.content, appData.pubkey).then(d => { publisher.decryptGeneric(appData.content, appData.pubkey).then(d => {
setAppData(login, JSON.parse(d) as SnortAppData, appData.created_at * 1000); setAppData(login, JSON.parse(d) as SnortAppData, appData.created_at * 1000);
}) });
} }
} }
}, [loginFeed, publisher]); }, [loginFeed, publisher]);

View File

@ -76,6 +76,6 @@ export default function useModeration() {
unblock, unblock,
isBlocked, isBlocked,
isMutedWord, isMutedWord,
isEventMuted isEventMuted,
}; };
} }

View File

@ -158,7 +158,7 @@ export function setBookmarked(state: LoginSession, bookmarked: Array<string>, ts
} }
export function setAppData(state: LoginSession, data: SnortAppData, ts: number) { export function setAppData(state: LoginSession, data: SnortAppData, ts: number) {
if(state.appData.timestamp >= ts) { if (state.appData.timestamp >= ts) {
return; return;
} }
state.appData.item = data; state.appData.item = data;

View File

@ -19,7 +19,7 @@ export enum LoginSessionType {
} }
export interface SnortAppData { export interface SnortAppData {
mutedWords: Array<string> mutedWords: Array<string>;
} }
export interface LoginSession { export interface LoginSession {

View File

@ -48,7 +48,7 @@ const LoggedOut = {
subscriptions: [], subscriptions: [],
appData: { appData: {
item: { item: {
mutedWords: [] mutedWords: [],
}, },
timestamp: 0, timestamp: 0,
}, },

View File

@ -6,39 +6,53 @@ import { useState } from "react";
import { FormattedMessage } from "react-intl"; import { FormattedMessage } from "react-intl";
export function ModerationSettings() { export function ModerationSettings() {
const login = useLogin(); const login = useLogin();
const [muteWord, setMuteWord] = useState(""); const [muteWord, setMuteWord] = useState("");
function addMutedWord() { function addMutedWord() {
login.appData ??= { login.appData ??= {
item: { item: {
mutedWords: [] mutedWords: [],
}, },
timestamp: 0 timestamp: 0,
}; };
setAppData(login, { setAppData(
...login.appData.item, login,
mutedWords: appendDedupe(login.appData.item.mutedWords, [muteWord]) {
}, unixNowMs()); ...login.appData.item,
setMuteWord(""); mutedWords: appendDedupe(login.appData.item.mutedWords, [muteWord]),
} },
return <> unixNowMs(),
<h2> );
<FormattedMessage defaultMessage="Muted Words" /> setMuteWord("");
</h2> }
<div className="flex-column g12"> return (
<div className="flex g8"> <>
<input type="text" placeholder="eg. crypto" className="w-max" value={muteWord} onChange={e => setMuteWord(e.target.value)} /> <h2>
<button type="button" onClick={addMutedWord}> <FormattedMessage defaultMessage="Muted Words" />
<FormattedMessage defaultMessage="Add" /> </h2>
</button> <div className="flex-column g12">
</div> <div className="flex g8">
{login.appData.item.mutedWords.map(v => <div className="p br b flex f-space"> <input
<div>{v}</div> type="text"
<button type="button"> placeholder="eg. crypto"
<FormattedMessage defaultMessage="Delete" /> className="w-max"
</button> value={muteWord}
</div>)} onChange={e => setMuteWord(e.target.value)}
/>
<button type="button" onClick={addMutedWord}>
<FormattedMessage defaultMessage="Add" />
</button>
</div> </div>
{login.appData.item.mutedWords.map(v => (
<div className="p br b flex f-space">
<div>{v}</div>
<button type="button">
<FormattedMessage defaultMessage="Delete" />
</button>
</div>
))}
</div>
</> </>
} );
}

View File

@ -150,7 +150,7 @@
"GUlSVG": "Beanspruche deine enthaltene Snort Nostr-Adresse", "GUlSVG": "Beanspruche deine enthaltene Snort Nostr-Adresse",
"Gcn9NQ": "Magnet Link", "Gcn9NQ": "Magnet Link",
"GspYR7": "{n} Gefällt nicht", "GspYR7": "{n} Gefällt nicht",
"Gxcr08": "Broadcast Event", "Gxcr08": "Event verbreiten",
"H+vHiz": "Hex-Schlüssel...", "H+vHiz": "Hex-Schlüssel...",
"H0JBH6": "Abmelden", "H0JBH6": "Abmelden",
"H6/kLh": "Bestellung bezahlt!", "H6/kLh": "Bestellung bezahlt!",
@ -186,7 +186,7 @@
"KoFlZg": "Mint-URL eingeben", "KoFlZg": "Mint-URL eingeben",
"KtsyO0": "PIN eingeben", "KtsyO0": "PIN eingeben",
"LF5kYT": "Weitere Verbindungen", "LF5kYT": "Weitere Verbindungen",
"LR1XjT": "Pin too short", "LR1XjT": "PIN zu kurz",
"LXxsbk": "Anonym", "LXxsbk": "Anonym",
"LgbKvU": "Kommentar", "LgbKvU": "Kommentar",
"Lu5/Bj": "In Zapstr öffnen", "Lu5/Bj": "In Zapstr öffnen",
@ -437,12 +437,12 @@
"vOKedj": "{n,plural,one {}=1{& {n} anderer} other{& {n} andere}}", "vOKedj": "{n,plural,one {}=1{& {n} anderer} other{& {n} andere}}",
"vZ4quW": "NIP-05 ist eine DNS-basierte Verifizierungsspezifikation, die dabei hilft, dich als echten Benutzer zu validieren.", "vZ4quW": "NIP-05 ist eine DNS-basierte Verifizierungsspezifikation, die dabei hilft, dich als echten Benutzer zu validieren.",
"vhlWFg": "Umfrageoptionen", "vhlWFg": "Umfrageoptionen",
"vlbWtt": "Erhalte eine kostenlos", "vlbWtt": "Eine kostenlos erhalten",
"vrTOHJ": "{amount} sats", "vrTOHJ": "{amount} sats",
"vxwnbh": "Maß an Arbeit, die auf alle veröffentlichte Events angewendet werden soll", "vxwnbh": "Maß an Arbeit, die auf alle veröffentlichte Events angewendet werden soll",
"wEQDC6": "Anpassen", "wEQDC6": "Anpassen",
"wLtRCF": "Dein Schlüssel", "wLtRCF": "Dein Schlüssel",
"wSZR47": "Submit", "wSZR47": "Absenden",
"wWLwvh": "Anon", "wWLwvh": "Anon",
"wYSD2L": "Nostr-Adresse", "wYSD2L": "Nostr-Adresse",
"wih7iJ": "Name ist blockiert", "wih7iJ": "Name ist blockiert",

View File

@ -1,27 +1,27 @@
{ {
"+D82kt": "Вы уверены, что хотите сделать репост: {id}", "+D82kt": "Вы уверены, что хотите сделать репост: {id}",
"+PzQ9Y": "Payout Now", "+PzQ9Y": "Выплатить сейчас",
"+Vxixo": "Secret Group Chat", "+Vxixo": "Секретный групповой чат",
"+aZY2h": "Тип запа", "+aZY2h": "Тип запа",
"+tShPg": "following", "+tShPg": "подписки",
"+vA//S": "Логины", "+vA//S": "Логины",
"+vIQlC": "Пожалуйста, обязательно сохраните следующий пароль, чтобы в будущем управлять своим хэндлом", "+vIQlC": "Пожалуйста, обязательно сохраните следующий пароль, чтобы в будущем управлять своим хэндлом",
"+vVZ/G": "Подключиться", "+vVZ/G": "Подключиться",
"+xliwN": "{name} reposted", "+xliwN": "{name} сделал репост",
"/4tOwT": "Пропустить", "/4tOwT": "Пропустить",
"/JE/X+": "Поддержка аккаунта", "/JE/X+": "Поддержка аккаунта",
"/PCavi": "Публичный", "/PCavi": "Публичный",
"/RD0e2": "Nostr использует технологию цифровой подписи для создания защищенных от несанкционированного доступа заметок, которые можно безопасно копировать на множество релеев, обеспечивая резервное хранение Вашего контента.", "/RD0e2": "Nostr использует технологию цифровой подписи для создания защищенных от несанкционированного доступа заметок, которые можно безопасно копировать на множество релеев, обеспечивая резервное хранение Вашего контента.",
"/Xf4UW": "Send anonymous usage metrics", "/Xf4UW": "Отправлять показатели анонимного использования",
"/d6vEc": "Упростить поиск и распространение вашего профиля в Nostr", "/d6vEc": "Упростить поиск и распространение вашего профиля в Nostr",
"/n5KSF": "{n} мс", "/n5KSF": "{n} мс",
"00LcfG": "Load more", "00LcfG": "Загрузить больше",
"08zn6O": "Экспортировать ключи", "08zn6O": "Экспортировать ключи",
"0Azlrb": "Управление", "0Azlrb": "Управление",
"0BUTMv": "Поиск...", "0BUTMv": "Поиск...",
"0jOEtS": "Неверный LNURL", "0jOEtS": "Неверный LNURL",
"0mch2Y": "имя содержит запрещенные символы", "0mch2Y": "имя содержит запрещенные символы",
"0uoY11": "Show Status", "0uoY11": "Показать статус",
"0yO7wF": "{n} секунд", "0yO7wF": "{n} секунд",
"1A7TZk": "Что такое Snort и как он работает?", "1A7TZk": "Что такое Snort и как он работает?",
"1Mo59U": "Вы уверены, что хотите удалить эту заметку из закладок?", "1Mo59U": "Вы уверены, что хотите удалить эту заметку из закладок?",
@ -37,7 +37,7 @@
"2a2YiP": "{n} Закладок", "2a2YiP": "{n} Закладок",
"2k0Cv+": "Дизлайки ({n})", "2k0Cv+": "Дизлайки ({n})",
"2ukA4d": "{n} часов", "2ukA4d": "{n} часов",
"3KNMbJ": "Articles", "3KNMbJ": "Статьи",
"3Rx6Qo": "Продвинутые", "3Rx6Qo": "Продвинутые",
"3cc4Ct": "Светлый", "3cc4Ct": "Светлый",
"3gOsZq": "Переводчики", "3gOsZq": "Переводчики",
@ -46,7 +46,7 @@
"3tVy+Z": "{n} Подписчиков", "3tVy+Z": "{n} Подписчиков",
"3xCwbZ": "ИЛИ", "3xCwbZ": "ИЛИ",
"3yk8fB": "Кошелек", "3yk8fB": "Кошелек",
"40VR6s": "Nostr Connect", "40VR6s": "Подключение Nostr",
"450Fty": "Ничьи", "450Fty": "Ничьи",
"47FYwb": "Отменить", "47FYwb": "Отменить",
"4IPzdn": "Основные разработчики", "4IPzdn": "Основные разработчики",
@ -61,14 +61,14 @@
"5oTnfy": "Приобрести хэндл", "5oTnfy": "Приобрести хэндл",
"5rOdPG": "После того как Вы настроили расширение для управления ключами и сгенерировали ключ, Вы можете последовать нашему гиду для новичков, чтобы настроить свой профиль и найти интересных людей, заслуживающих подписки на Nostr.", "5rOdPG": "После того как Вы настроили расширение для управления ключами и сгенерировали ключ, Вы можете последовать нашему гиду для новичков, чтобы настроить свой профиль и найти интересных людей, заслуживающих подписки на Nostr.",
"5u6iEc": "Перевести на Pubkey", "5u6iEc": "Перевести на Pubkey",
"5vMmmR": "Usernames are not unique on Nostr. The nostr address is your unique human-readable address that is unique to you upon registration.", "5vMmmR": "Имя пользователя не является уникальным на Nostr. Nostr адрес - это ваш уникальный человеко читаемый адрес, который уникален для вас при регистрации.",
"5ykRmX": "Отправить зап", "5ykRmX": "Отправить зап",
"6/SF6e": "<h1>{n}</h1> Cashu sats", "6/SF6e": "<h1>{n}</h1> Cashu sats",
"6/hB3S": "Watch Replay", "6/hB3S": "Смотреть повтор",
"65BmHb": "Не удалось загрузить изображение через {host}, нажмите здесь, чтобы загрузить напрямую", "65BmHb": "Не удалось загрузить изображение через {host}, нажмите здесь, чтобы загрузить напрямую",
"6OSOXl": "Reason: <i>{reason}</i>", "6OSOXl": "Причина: <i>{reason}</i>",
"6Yfvvp": "Получите адрес", "6Yfvvp": "Получите адрес",
"6bgpn+": "Not all clients support this, you may still receive some zaps as if zap splits was not configured", "6bgpn+": "Не все клиенты поддерживают это, вы все равно можете получить некоторые запы, как если бы запределение не было настроено",
"6ewQqw": "Лайки ({n})", "6ewQqw": "Лайки ({n})",
"6uMqL1": "Не оплачено", "6uMqL1": "Не оплачено",
"7+Domh": "Заметки", "7+Domh": "Заметки",
@ -76,13 +76,13 @@
"7hp70g": "NIP-05", "7hp70g": "NIP-05",
"8/vBbP": "Репосты ({n})", "8/vBbP": "Репосты ({n})",
"89q5wc": "Подтверждать репосты", "89q5wc": "Подтверждать репосты",
"8Kboo2": "Scan this QR code with your signer app to get started", "8Kboo2": "Отсканируйте этот QR код с вашим приложением для регистрации, чтобы начать",
"8QDesP": "Запнуть {n} сат", "8QDesP": "Запнуть {n} сат",
"8Rkoyb": "Recipient", "8Rkoyb": "Получатель",
"8Y6bZQ": "Invalid zap split: {input}", "8Y6bZQ": "Неверный zap сплит: {input}",
"8g2vyB": "имя слишком длинное", "8g2vyB": "имя слишком длинное",
"8v1NN+": "Фраза для сопряжения", "8v1NN+": "Фраза для сопряжения",
"8xNnhi": "Nostr Extension", "8xNnhi": "Расширение Nostr",
"9+Ddtu": "Далее", "9+Ddtu": "Далее",
"9HU8vw": "Ответить", "9HU8vw": "Ответить",
"9SvQep": "Подписан(а) на {n}", "9SvQep": "Подписан(а) на {n}",
@ -91,7 +91,7 @@
"9pMqYs": "Nostr адрес", "9pMqYs": "Nostr адрес",
"9wO4wJ": "Лайтнинг-инвойс", "9wO4wJ": "Лайтнинг-инвойс",
"ADmfQT": "Ветка", "ADmfQT": "Ветка",
"AGNz71": "Zap All {n} sats", "AGNz71": "Зап Все {n} sats",
"ASRK0S": "Этот автор был заглушен", "ASRK0S": "Этот автор был заглушен",
"Adk34V": "Настройте свой профиль", "Adk34V": "Настройте свой профиль",
"Ai8VHU": "Снятие ограничения срока хранения ваших заметок на релее Snort", "Ai8VHU": "Снятие ограничения срока хранения ваших заметок на релее Snort",
@ -108,7 +108,7 @@
"BcGMo+": "Заметки содержат текст; наиболее популярное применение этих заметок - передача сообщений \"подобно твиттеру\".", "BcGMo+": "Заметки содержат текст; наиболее популярное применение этих заметок - передача сообщений \"подобно твиттеру\".",
"C5xzTC": "Premium", "C5xzTC": "Premium",
"C81/uG": "Выход", "C81/uG": "Выход",
"C8HhVE": "Suggested Follows", "C8HhVE": "Предложенные подписки",
"CHTbO3": "Не удалось загрузить инвойс", "CHTbO3": "Не удалось загрузить инвойс",
"CVWeJ6": "Популярные профили", "CVWeJ6": "Популярные профили",
"CmZ9ls": "{n} заглушен", "CmZ9ls": "{n} заглушен",
@ -120,12 +120,12 @@
"DZzCem": "Показать последние {n} заметки", "DZzCem": "Показать последние {n} заметки",
"DcL8P+": "Саппортер", "DcL8P+": "Саппортер",
"Dh3hbq": "Авто Зап", "Dh3hbq": "Авто Зап",
"Dn82AL": "Live", "Dn82AL": "Прямой эфир",
"DtYelJ": "Перевод", "DtYelJ": "Перевод",
"E8a4yq": "Подпишитесь на популярные аккаунты", "E8a4yq": "Подпишитесь на популярные аккаунты",
"ELbg9p": "Data Providers", "ELbg9p": "Данные провайдера",
"EPYwm7": "Ваш приватный ключ - это Ваш пароль. Если Вы потеряете этот ключ, вы потеряете доступ к своей учетной записи! Скопируйте и сохраните его в надежном месте. Восстановить приватный ключ невозможно.", "EPYwm7": "Ваш приватный ключ - это Ваш пароль. Если Вы потеряете этот ключ, вы потеряете доступ к своей учетной записи! Скопируйте и сохраните его в надежном месте. Восстановить приватный ключ невозможно.",
"EQKRE4": "Show badges on profile pages", "EQKRE4": "Показывать значки на страницах профиля",
"EWyQH5": "Глобальная лента", "EWyQH5": "Глобальная лента",
"Ebl/B2": "Перевести на {lang}", "Ebl/B2": "Перевести на {lang}",
"EcZF24": "Кастомные релеи", "EcZF24": "Кастомные релеи",
@ -135,9 +135,9 @@
"F+B3x1": "Мы также сотрудничаем с nostrplebs.com, чтобы предоставить Вам больше возможностей", "F+B3x1": "Мы также сотрудничаем с nostrplebs.com, чтобы предоставить Вам больше возможностей",
"F3l7xL": "Добавить аккаунт", "F3l7xL": "Добавить аккаунт",
"FDguSC": "{n} Запов", "FDguSC": "{n} Запов",
"FMfjrl": "Show status messages on profile pages", "FMfjrl": "Показывать статусные сообщения на страницах профиля",
"FS3b54": "Готово!", "FS3b54": "Готово!",
"FSYL8G": "Trending Users", "FSYL8G": "Трендовые пользователи",
"FdhSU2": "Получить сейчас", "FdhSU2": "Получить сейчас",
"FfYsOb": "Произошла ошибка!", "FfYsOb": "Произошла ошибка!",
"FmXUJg": "подписан(а) на Вас", "FmXUJg": "подписан(а) на Вас",
@ -145,24 +145,24 @@
"G1BGCg": "Выберите кошелек", "G1BGCg": "Выберите кошелек",
"GFOoEE": "Соль", "GFOoEE": "Соль",
"GL8aXW": "Закладки ({n})", "GL8aXW": "Закладки ({n})",
"GQPtfk": "Join Stream", "GQPtfk": "Присоединиться к стриму",
"GSye7T": "Lightning Address", "GSye7T": "Lightning Адрес",
"GUlSVG": "Получите Nostr адрес от Snort", "GUlSVG": "Получите Nostr адрес от Snort",
"Gcn9NQ": "Magnet-ссылка", "Gcn9NQ": "Magnet-ссылка",
"GspYR7": "{n} Дизлайк", "GspYR7": "{n} Дизлайк",
"Gxcr08": "Broadcast Event", "Gxcr08": "Трансляция события",
"H+vHiz": "Hex ключа..", "H+vHiz": "Hex ключа..",
"H0JBH6": "Выйти", "H0JBH6": "Выйти",
"H6/kLh": "Заказ оплачен!", "H6/kLh": "Заказ оплачен!",
"HAlOn1": "Имя", "HAlOn1": "Имя",
"HFls6j": "имя будет доступно позже", "HFls6j": "имя будет доступно позже",
"HOzFdo": "Заглушен", "HOzFdo": "Заглушен",
"HWbkEK": "Clear cache and reload", "HWbkEK": "Очистить кэш и перезагрузить",
"HbefNb": "Открыть кошелек", "HbefNb": "Открыть кошелек",
"HhcAVH": "You don't follow this person, click here to load media from <i>{link}</i>, or update <a><i>your preferences</i></a> to always load media from everybody.", "HhcAVH": "Вы не подписаны на этого человека, нажмите здесь, чтобы загрузить медиа из <i>{link}</i>, или обновите <a><i>ваши предпочтения</i></a> чтобы всегда загружать медиа от всех.",
"IDjHJ6": "Спасибо, что выбрали Snort, пожалуйста, поддержите проект, если это возможно.", "IDjHJ6": "Спасибо, что выбрали Snort, пожалуйста, поддержите проект, если это возможно.",
"IEwZvs": "Вы уверены, что хотите открепить эту заметку?", "IEwZvs": "Вы уверены, что хотите открепить эту заметку?",
"IKKHqV": "Follows", "IKKHqV": "Подписки",
"INSqIz": "Имя пользователя в Twitter...", "INSqIz": "Имя пользователя в Twitter...",
"IUZC+0": "Это означает, что никто не может изменить созданные Вами заметки, и каждый может легко убедиться, что увиденные ими заметки созданы Вами.", "IUZC+0": "Это означает, что никто не может изменить созданные Вами заметки, и каждый может легко убедиться, что увиденные ими заметки созданы Вами.",
"Ig9/a1": "Sent {n} sats to {name}", "Ig9/a1": "Sent {n} sats to {name}",

View File

@ -277,7 +277,7 @@ export class EventPublisher {
*/ */
async decryptGeneric(content: string, from: string) { async decryptGeneric(content: string, from: string) {
const pl = decodeEncryptionPayload(content); const pl = decodeEncryptionPayload(content);
switch(pl.v) { switch (pl.v) {
case MessageEncryptorVersion.Nip4: { case MessageEncryptorVersion.Nip4: {
const nip4Payload = `${base64.encode(pl.ciphertext)}?iv=${base64.encode(pl.nonce)}`; const nip4Payload = `${base64.encode(pl.ciphertext)}?iv=${base64.encode(pl.nonce)}`;
return await this.#signer.nip4Decrypt(nip4Payload, from); return await this.#signer.nip4Decrypt(nip4Payload, from);

View File

@ -158,4 +158,4 @@ export function decodeEncryptionPayload(p: string) {
export function encodeEncryptionPayload(p: MessageEncryptorPayload) { export function encodeEncryptionPayload(p: MessageEncryptorPayload) {
return base64.encode(new Uint8Array([p.v, ...p.nonce, ...p.ciphertext])); return base64.encode(new Uint8Array([p.v, ...p.nonce, ...p.ciphertext]));
} }