Merge remote-branch 'misskey/develop'

This commit is contained in:
NoriDev 2023-12-14 19:48:32 +09:00
commit e5423228b8
72 changed files with 2617 additions and 1210 deletions

View file

@ -15,6 +15,17 @@
## 2023.x.x (unreleased)
### Note
- 絵文字ピッカーにピン留め表示する絵文字設定が「リアクション用」と「絵文字入力用」に分かれました。以前の設定は「リアクション用」として使用されます。
**影響:**
それにより、投稿フォームから表示される絵文字ピッカーのピン留め絵文字がリセットされたように感じるかもしれません(新設された投稿用のピン留め絵文字が使われるため)。
投稿用のピン留め絵文字をアップデート前の状態にするには、以下の手順で操作します。
1. 「設定」メニューに移動し、「絵文字ピッカー」タブを選択します。
2. 「ピン留 (全般)」のタブを選択します。
3. 「リアクション設定からコピーする」ボタンを押すことで、アップデート前の状態に戻すことができます。
### General
- Feat: メールアドレスの認証にverifymail.ioを使えるように (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/971ba07a44550f68d2ba31c62066db2d43a0caed)
- Feat: モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能を追加 (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/e0eb5a752f6e5616d6312bb7c9790302f9dbff83)
@ -25,7 +36,8 @@
### Client
- Feat: 今日誕生日のフォロー中のユーザーを一覧表示できるウィジェットを追加
- Feat: データセーバーでコードハイライトの読み込みを削減できるように
- Enhance: 投稿フォームの絵文字ピッカーをリアクション時に使用するものと同じのを使用するように #12336
- Enhance: 投稿フォームの絵文字ピッカーをリアクション時に使用するものと同じのを使用するように #12336 #12560
- Enhance: リアクション用ピン留め絵文字と投稿時の絵文字入力用ピン留め絵文字を分けて設定できるように #12560
- Enhance: 絵文字のオートコンプリート機能強化 #12364
- Enhance: ユーザーのRawデータを表示するページが復活
- Enhance: リアクション選択時に音を鳴らせるように
@ -37,6 +49,8 @@
- Enhance: データセーバーの適用範囲を個別で設定できるように
- 従来のデータセーバーの設定はリセットされます
- Enhance: タイムライン上のタブからリスト、アンテナ、チャンネルの管理ページにジャンプできるように
- Enhance: ユーザー名、プロフィール、お知らせ、ページの編集画面でMFMや絵文字のオートコンプリートが使用できるように
- Enhance: プロフィール、お知らせの編集画面でMFMのプレビューを表示できるように
- Feat: センシティブと判断されたウェブサイトのサムネイルをぼかすように
- ウェブサイトをセンシティブと判断する仕組みが動いていないため、summalyProxyを使用しないと機能しません。
- fix: 「設定のバックアップ」で一部の項目がバックアップに含まれていなかった問題を修正
@ -50,6 +64,7 @@
- Fix: 長い名前のチャンネルにおける投稿フォームの表示が崩れる問題を修正
- Fix: セキュリティ向上のためAiScriptの`Mk:apiExternal`を無効化
- Fix: ノート中の絵文字をタップして「リアクションする」からリアクションした際にリアクションサウンドが鳴らない不具合を修正
- Fix: ノート中のリアクションの表示を微調整 #12650
### Server
- Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように

View file

@ -418,7 +418,6 @@ share: "شارِك"
notFound: "غير موجود"
notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط."
uploadFolder: "المجلد الافتراضي للرفع"
cacheClear: "مسح ذاكرة التخزين المؤقت"
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة"
markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة"
@ -802,7 +801,7 @@ hashtags: "الوسوم"
troubleshooting: "استكشاف الأخطاء وإصلاحها"
useBlurEffect: "استخدم تأثير الطمس في الواجهة"
learnMore: "راجع المزيد"
misskeyUpdated: "حُدث ميسكي!"
misskeyUpdated: "حُدث CherryPick!"
whatIsNew: "اعرض التغييرات"
translate: "ترجم"
translatedFrom: "تُرجم من {x}"
@ -925,7 +924,7 @@ numberOfLikes: "الإعجابات"
show: "المظهر"
neverShow: "لا تظهره مجددًا"
remindMeLater: "ربما لاحقا"
didYouLikeMisskey: "هل أعجبك ميسكي؟"
didYouLikeMisskey: "هل أعجبك CherryPick؟"
pleaseDonate: "يستخدم {host} البرمجية الحرة ميسكي. نتمنى أن تتبرعوا للمشروع مما سيسمح لنا متابعة تطويره!"
roles: "الأدوار"
role: "الدور"
@ -1004,7 +1003,7 @@ rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "يجب أن تكون ال
cancelReactionConfirm: "أتريد حذف تفاعلك؟"
changeReactionConfirm: "أتريد تعديل تفاعلك؟"
later: "لاحقاً"
goToMisskey: ميسكي"
goToMisskey: CherryPick"
additionalEmojiDictionary: "قواميس إيموجي إضافية"
installed: "مُثبت"
expirationDate: "تاريخ انتهاء الصلاحية"

View file

@ -393,7 +393,6 @@ share: "শেয়ার"
notFound: "পাওয়া যায়নি"
notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।"
uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার"
cacheClear: "ক্যাশ পরিষ্কার করুন"
markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন"
markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন"
markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন"

View file

@ -157,6 +157,9 @@ addEmoji: "Afegeix un emoji"
settingGuide: "Configuració recomanada"
cacheRemoteFiles: "Emmagatzemar fitxers remots"
cacheRemoteFilesDescription: "Quan aquesta opció està desactivada, els fitxers remots es carreguen directament des del servidor remot. Si desactiveu això, es reduirà l'ús d'emmagatzematge, però augmentarà el trànsit, ja que no es generaran miniatures."
youCanCleanRemoteFilesCache: "Pots netejar la memòria cau fent clic al botó de la paperera🗑 a l'administrador d'arxius."
cacheRemoteSensitiveFiles: "Posar a la memòria cau arxius remots sensibles"
cacheRemoteSensitiveFilesDescription: "Quan aquesta opció és desactiva, els arxius remots sensibles es carregant directament del servidor d'origen sense que es guardin a la memòria cau."
flagAsBot: "Marca aquest compte com a bot"
flagAsBotDescription: "Marca aquest compte com a bot"
flagAsCat: "Marca aquest compte com a gat"
@ -165,6 +168,7 @@ flagShowTimelineReplies: "Mostra les respostes a la línia de temps"
flagShowTimelineRepliesDescription: "Mostra les respostes a la línia de temps"
autoAcceptFollowed: "Aprova automàticament les sol·licituds de seguiment dels usuaris que segueixes"
addAccount: "Afegeix un compte"
reloadAccountsList: "Recarregar la llista de contactes"
loginFailed: "S'ha produït un error al accedir."
showOnRemote: "Navega més en el perfil original"
general: "General"
@ -191,6 +195,7 @@ perHour: "Per hora"
perDay: "Per dia"
stopActivityDelivery: "Deixa d'enviar activitats"
blockThisInstance: "Deixa d'enviar activitats"
silenceThisInstance: "Silencia aquesta instància "
operations: "Accions"
software: "Programari"
version: "Versió"

View file

@ -428,7 +428,6 @@ share: "Sdílet"
notFound: "Nenalezeno"
notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL."
uploadFolder: "Výchozí lokace pro upload"
cacheClear: "Vymazat cache"
markAsReadAllNotifications: "Označit všechna oznámení za přečtená"
markAsReadAllUnreadNotes: "Označit všechny příspěvky za přečtené"
markAsReadAllTalkMessages: "Označit všechny zprávy za přečtené"
@ -733,7 +732,7 @@ onlineUsersCount: "{n} uživatelů je online"
nUsers: "{n} užívatelů"
nNotes: "{n} poznámek"
sendErrorReports: "Odesílat chybové záznamy"
sendErrorReportsDescription: "Pokud je tato funkce zapnutá, budou se při výskytu problému sdílet podrobné informace o chybách se službou Misskey, což pomůže zlepšit kvalitu služby Misskey. Tyto informace budou zahrnovat například verzi operačního systému, jaký prohlížeč používáte, vaši aktivitu v Misskey atd."
sendErrorReportsDescription: "Pokud je tato funkce zapnutá, budou se při výskytu problému sdílet podrobné informace o chybách se službou CherryPick, což pomůže zlepšit kvalitu služby CherryPick. Tyto informace budou zahrnovat například verzi operačního systému, jaký prohlížeč používáte, vaši aktivitu v CherryPick atd."
myTheme: "Moje vzhledy"
backgroundColor: "Pozadí"
accentColor: "Akcent"
@ -827,7 +826,7 @@ hashtags: "Hashtagy"
troubleshooting: "Poradce při potížích"
useBlurEffect: "Použít efekt rozostření v UI"
learnMore: "Zjistit více"
misskeyUpdated: "Misskey byl aktualizován!"
misskeyUpdated: "CherryPick byl aktualizován!"
whatIsNew: "Zobrazit změny"
translate: "Přeložit"
translatedFrom: "Přeloženo z {x}"
@ -956,8 +955,8 @@ numberOfLikes: "Počet \"To se mi líbí\""
show: "Zobrazit"
neverShow: "Znovu nezobrazovat"
remindMeLater: "Možná později"
didYouLikeMisskey: "Oblíbili jste si Misskey?"
pleaseDonate: "{host} používá bezplatný software Misskey. Velmi bychom ocenili vaše dary, aby mohl vývoj Misskey pokračovat!"
didYouLikeMisskey: "Oblíbili jste si CherryPick?"
pleaseDonate: "{host} používá bezplatný software CherryPick. Velmi bychom ocenili vaše dary, aby mohl vývoj CherryPick pokračovat!"
roles: "Role"
role: "Role"
noRole: "Role nenalezena"
@ -1066,7 +1065,7 @@ rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Role musí být veřejné.
cancelReactionConfirm: "Opravdu chcete odstranit vaší reakci?"
changeReactionConfirm: "Opravdu chcete změnit vaši reakci?"
later: "Později"
goToMisskey: "Jít na Misskey"
goToMisskey: "Jít na CherryPick"
additionalEmojiDictionary: "Další slovníky emoji"
installed: "Nainstalováno"
branding: "Značka"
@ -1123,7 +1122,7 @@ _accountMigration:
moveTo: "Přesunout tenhle účet do jiného"
moveToLabel: "Cílový účet pro přesunutí:"
moveCannotBeUndone: "Migrace účtu nemůže být vrácena."
moveAccountDescription: "Tím dojde k migraci vašeho účtu na jiný účet.\n ・Sledovatelé z tohoto účtu budou automaticky převedeni na nový účet.\n ・Tento účet zruší sledování všech uživatelů, které aktuálně sleduje.\n ・Na tomto účtu nebude možné vytvářet nové poznámky atd.\n\nZatímco migrace sledovaných uživatelů probíhá automaticky, pro migraci seznamu sledovaných uživatelů je nutné připravit některé kroky ručně. Za tímto účelem proveďte export sledovaných, který později naimportujete na nový účet v nabídce nastavení. Stejný postup platí pro seznamy i pro ztlumené a zablokované uživatele.\n\n(Tento výklad platí pro Misskey v13.12.0 a novější. Jiný software ActivityPub, například Mastodon, může fungovat jinak.)"
moveAccountDescription: "Tím dojde k migraci vašeho účtu na jiný účet.\n ・Sledovatelé z tohoto účtu budou automaticky převedeni na nový účet.\n ・Tento účet zruší sledování všech uživatelů, které aktuálně sleduje.\n ・Na tomto účtu nebude možné vytvářet nové poznámky atd.\n\nZatímco migrace sledovaných uživatelů probíhá automaticky, pro migraci seznamu sledovaných uživatelů je nutné připravit některé kroky ručně. Za tímto účelem proveďte export sledovaných, který později naimportujete na nový účet v nabídce nastavení. Stejný postup platí pro seznamy i pro ztlumené a zablokované uživatele.\n\n(Tento výklad platí pro CherryPick v13.12.0 a novější. Jiný software ActivityPub, například Mastodon, může fungovat jinak.)"
moveAccountHowTo: "Chcete-li migrovat, vytvořte nejprve alias tohoto účtu na účtu, na který chcete přejít.\nPo vytvoření aliasu zadejte účet, na který chcete přejít, v následujícím formátu: @username@server.example.com"
startMigration: "Migrovat"
migrationConfirm: "Opravdu chcete migrovat tento účet na {account}? Jednou zahájený proces nelze zastavit ani vrátit zpět a tento účet již nebudete moci používat v původním stavu."
@ -1134,9 +1133,9 @@ _achievements:
earnedAt: "Odemčeno v"
_types:
_notes1:
title: "Dobrý den Misskey!"
title: "Dobrý den CherryPick!"
description: "Zveřejněte vaší první poznámku"
flavor: "Užijte si to s Misskey!"
flavor: "Užijte si to s CherryPick!"
_notes10:
title: "Pár poznámek"
description: "Zveřejněte 10 poznámek"
@ -1232,7 +1231,7 @@ _achievements:
_login1000:
title: "Mistr poznámek III"
description: "Přihlaste se celkově za 1000 dní"
flavor: "Děkujeme, že používáte Misskey!"
flavor: "Děkujeme, že používáte CherryPick!"
_noteClipped1:
title: "Musím... připnout..."
description: "Připněte si první poznámku"
@ -1292,18 +1291,18 @@ _achievements:
title: "Máš rád úspěchy"
description: "Koukejte na váš seznam úspěchů alespoň po dobu 3 minut"
_iLoveMisskey:
title: "Miluju Misskey"
description: "Zveřejněte \" I ❤ #Misskey\""
flavor: "Vývojový tým Misskey si velmi váží vaší podpory!"
title: "Miluju CherryPick"
description: "Zveřejněte \" I ❤ #CherryPick\""
flavor: "Vývojový tým CherryPick si velmi váží vaší podpory!"
_foundTreasure:
title: "Hon za pokladem"
description: "Našli jste schovaný poklad!"
_client30min:
title: "Krátká pauza"
description: "Mějte otevřený Misskey alespoň po dobu 30 minut"
description: "Mějte otevřený CherryPick alespoň po dobu 30 minut"
_client60min:
title: "Žádný \"Miss\" v Misskey"
description: "Mějte otevřený Misskey alespoň po dobu 60 minut"
title: "Žádný \"Miss\" v CherryPick"
description: "Mějte otevřený CherryPick alespoň po dobu 60 minut"
_noteDeletedWithin1min:
title: "Ups, nevadí"
description: "Vymažte poznámku během minuty co ji zveřejníte"

View file

@ -311,6 +311,7 @@ folderName: "Ordnername"
createFolder: "Ordner erstellen"
renameFolder: "Ordner umbenennen"
deleteFolder: "Ordner löschen"
folder: "Ordner"
addFile: "Datei hinzufügen"
emptyDrive: "Deine Drive ist leer"
emptyFolder: "Dieser Ordner ist leer"
@ -437,7 +438,6 @@ share: "Teilen"
notFound: "Nicht gefunden"
notFoundDescription: "Es konnte keine Seite unter dieser URL gefunden werden."
uploadFolder: "Standardordner für Uploads"
cacheClear: "Cache leeren"
markAsReadAllNotifications: "Alle Benachrichtigungen als gelesen markieren"
markAsReadAllUnreadNotes: "Alle Notizen als gelesen markieren"
markAsReadAllTalkMessages: "Alle Chats als gelesen markieren"
@ -556,6 +556,8 @@ showInPage: "In einer Seite anzeigen"
popout: "Pop-Up"
volume: "Lautstärke"
masterVolume: "Gesamtlautstärke"
notUseSound: "Gebe kein Ton aus"
useSoundOnlyWhenActive: "Gebe nur Ton aus, wenn CherryPick aktiv ist"
details: "Details"
chooseEmoji: "Emoji auswählen"
unableToProcess: "Der Vorgang konnte nicht abgeschlossen werden"
@ -576,6 +578,10 @@ output: "Ausgabe"
script: "Skript"
disablePagesScript: "AiScript auf Seiten deaktivieren"
updateRemoteUser: "Benutzerinformationen aktualisieren"
unsetUserAvatar: "Entferne Profilbild"
unsetUserAvatarConfirm: "Möchtest du dein Profilbild entfernen?"
unsetUserBanner: "Entferne Profilbanner"
unsetUserBannerConfirm: "Möchtest du dein Profilbanner entfernen?"
deleteAllFiles: "Alle Dateien löschen"
deleteAllFilesConfirm: "Möchtest du wirklich alle Dateien löschen?"
removeAllFollowing: "Allen gefolgten Benutzern entfolgen"
@ -1034,6 +1040,8 @@ resetPasswordConfirm: "Wirklich Passwort zurücksetzen?"
sensitiveWords: "Sensible Wörter"
sensitiveWordsDescription: "Die Notizsichtbarkeit aller Notizen, die diese Wörter enthalten, wird automatisch auf \"Startseite\" gesetzt. Durch Zeilenumbrüche können mehrere konfiguriert werden."
sensitiveWordsDescription2: "Durch die Verwendung von Leerzeichen können AND-Verknüpfungen angegeben werden und durch das Umgeben von Schrägstrichen können reguläre Ausdrücke verwendet werden."
hiddenTags: "Ausgeblendete Hashtags"
hiddenTagsDescription: "Die hier eingestellten Tags werden nicht mehr in den Trends angezeigt. Mit der Umschalttaste können mehrere ausgewählt werden."
notesSearchNotAvailable: "Die Notizsuche ist nicht verfügbar."
license: "Lizenz"
unfavoriteConfirm: "Wirklich aus Favoriten entfernen?"
@ -1046,6 +1054,7 @@ enableChartsForRemoteUser: "Diagramme für Nutzer fremder Instanzen erstellen"
enableChartsForFederatedInstances: "Diagramme für fremde Instanzen erstellen"
showClipButtonInNoteFooter: "\"Clip\" zum Notizmenu hinzufügen"
reactionsDisplaySize: "Reaktionsanzeigegröße"
limitWidthOfReaction: "Begrenze die Breite der Reaktion und zeige sie verkleinert an"
noteIdOrUrl: "Notiz-ID oder URL"
video: "Video"
videos: "Videos"
@ -1169,7 +1178,10 @@ refreshing: "Wird aktualisiert..."
pullDownToRefresh: "Zum Aktualisieren ziehen"
disableStreamingTimeline: "Echtzeitaktualisierung der Chronik deaktivieren"
useGroupedNotifications: "Benachrichtigungen gruppieren"
signupPendingError: "Beim Überprüfen der Mailadresse ist etwas schiefgelaufen. Der Link könnte abgelaufen sein."
cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden."
doReaction: "Reagieren"
code: "Code"
_announcement:
forExistingUsers: "Nur für existierende Nutzer"
forExistingUsersDescription: "Ist diese Option aktiviert, wird diese Ankündigung nur Nutzern angezeigt, die zum Zeitpunkt der Ankündigung bereits registriert sind. Ist sie deaktiviert, wird sie auch Nutzern, die sich nach dessen Veröffentlichung registrieren, angezeigt."
@ -1179,6 +1191,9 @@ _announcement:
tooManyActiveAnnouncementDescription: "Zu viele aktive Ankündigungen können die Benutzerfreundlichkeit verschlechtern. Es wird empfohlen, veraltete Ankündigungen zu archivieren."
readConfirmTitle: "Als gelesen markieren?"
readConfirmText: "Dies markiert den Inhalt von \"{title}\" als gelesen."
dialogAnnouncementUxWarn: "Bei der Verwendung von mehr als zwei Meldungen im Dialog-Format wird um Vorsicht geboten, da dies negative Auswirkungen auf die UX haben kann."
silence: "Keine Benachrichtigung"
silenceDescription: "Wenn aktiviert, gibt diese Meldung keine Nachricht aus und muss nicht als \"gelesen\" markiert werden."
_initialAccountSetting:
accountCreated: "Dein Konto wurde erfolgreich erstellt!"
letsStartAccountSetup: "Lass uns nun dein Konto einrichten."
@ -1191,8 +1206,20 @@ _initialAccountSetting:
pushNotificationDescription: "Durch die Aktivierung von Push-Benachrichtigungen kannst du von {name} Benachrichtigungen direkt auf dein Gerät erhalten."
initialAccountSettingCompleted: "Kontoeinrichtung abgeschlossen!"
haveFun: "Viel Spaß mit {name}!"
youCanContinueTutorial: "Du kannst mit dem Tutorial von {name}(CherryPick) fortfahren, oder auch abbrechen und gleich anfangen CherryPick zu benutzen."
startTutorial: "Fange mit dem Tutorial an"
skipAreYouSure: "Die Kontoeinrichtung wirklich überspringen?"
laterAreYouSure: "Die Kontoeinrichtung wirklich später erledigen?"
_initialTutorial:
launchTutorial: "Tutorial ansehen"
title: "Tutorial"
wellDone: "Gut gemacht!"
skipAreYouSure: "Möchtest du das Tutorial verlassen?"
_landing:
title: "Willkommen zum Tutorial"
description: "Hier kannst du sehen, wie CherryPick funktioniert"
_note:
title: "Was sind Notizen?"
_serverRules:
description: "Eine Reihe von Regeln, die vor der Registrierung angezeigt werden. Eine Zusammenfassung der Nutzungsbedingungen anzuzeigen ist empfohlen."
_serverSettings:

View file

@ -228,7 +228,6 @@ userList: "Λίστες"
about: "Πληροφορίες"
moderator: "Συντονιστής"
moderation: "Συντονισμός"
cacheClear: "Εκκαθάριση προσωρινής μνήμης"
markAsReadAllNotifications: "Όλες οι ειδοποιήσεις διαβάστηκαν"
members: "Μέλη"
transfer: "Μεταφορά"

View file

@ -635,6 +635,8 @@ showInPage: "Show in page"
popout: "Pop-out"
volume: "Volume"
masterVolume: "Master volume"
notUseSound: "No sounds output."
useSoundOnlyWhenActive: "Output sounds only if CherryPick is active."
details: "Details"
chooseEmoji: "Select an emoji"
unableToProcess: "The operation could not be completed"
@ -655,10 +657,10 @@ output: "Output"
script: "Script"
disablePagesScript: "Disable AiScript on Pages"
updateRemoteUser: "Update remote user information"
unsetUserAvatar: "Delete user icon"
unsetUserAvatarConfirm: "Are you sure that you want to delete this user's icon?"
unsetUserBanner: "Delete user banner"
unsetUserBannerConfirm: "Are you sure that you want to delete this user's banner?"
unsetUserAvatar: "Unset avatar"
unsetUserAvatarConfirm: "Are you sure you want to unset the avatar?"
unsetUserBanner: "Unset banner"
unsetUserBannerConfirm: "Are you sure you want to unset the banner?"
deleteAllFiles: "Delete all files"
deleteAllFilesConfirm: "Are you sure that you want to delete all files?"
removeAllFollowing: "Unfollow all followed users"
@ -730,6 +732,7 @@ smtpSecure: "Use implicit SSL/TLS for SMTP connections"
smtpSecureInfo: "Turn this off when using STARTTLS"
testEmail: "Test email delivery"
wordMute: "Word mute"
hardWordMute: "Hard word mute"
regexpError: "Regular Expression error"
regexpErrorDescription: "An error occurred in the regular expression on line {line} of your {tab} word mutes:"
instanceMute: "Instance Mutes"
@ -1121,6 +1124,8 @@ resetPasswordConfirm: "Really reset your password?"
sensitiveWords: "Sensitive words"
sensitiveWordsDescription: "The visibility of all notes containing any of the configured words will be set to \"Home\" automatically. You can list multiple by separating them via line breaks."
sensitiveWordsDescription2: "Using spaces will create AND expressions and surrounding keywords with slashes will turn them into a regular expression."
hiddenTags: "Hidden hashtags"
hiddenTagsDescription: "Select tags which will not shown on trend list.\nMultiple tags could be registered by lines."
notesSearchNotAvailable: "Note search is unavailable."
license: "License"
unfavoriteConfirm: "Really remove from favorites?"
@ -1133,6 +1138,7 @@ enableChartsForRemoteUser: "Generate remote user data charts"
enableChartsForFederatedInstances: "Generate remote instance data charts"
showClipButtonInNoteFooter: "Add \"Clip\" to note action menu"
reactionsDisplaySize: "Reaction display size"
limitWidthOfReaction: "Limits the maximum width of reactions and display them in reduced size."
noteIdOrUrl: "Note ID or URL"
video: "Video"
videos: "Videos"
@ -1266,7 +1272,7 @@ signupPendingError: "There was a problem verifying the email address. The link m
cwNotationRequired: "If \"Hide content\" is enabled, a description must be provided."
doReaction: "Add reaction"
code: "Code"
tryReloadIfNotApplied: "If the settings are not reflected, please try refresh."
reloadRequiredToApplySettings: "Reloading is required to apply the settings."
showUnreadNotificationsCount: "Show the number of unread notifications"
showCatOnly: "Show only cats"
additionalPermissionsForFlash: "Allow to add permission to Play"
@ -1473,6 +1479,8 @@ _serverSettings:
shortName: "Short name"
shortNameDescription: "A shorthand for the instance's name that can be displayed if the full official name is long."
fanoutTimelineDescription: "Greatly increases performance of timeline retrieval and reduces load on the database when enabled. In exchange, memory usage of Redis will increase. Consider disabling this in case of low server memory or server instability."
fanoutTimelineDbFallback: "Fallback to database"
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
_accountMigration:
moveFrom: "Migrate another account to this one"
moveFromSub: "Create alias to another account"
@ -1746,7 +1754,9 @@ _role:
assignTarget: "Assignment type"
descriptionOfAssignTarget: "<b>Manual</b> to manually change who is part of this role and who is not.\n<b>Conditional</b> to have users be automatically assigned and removed from this role based on a condition."
manual: "Manual"
manualRoles: "Manual roles"
conditional: "Conditional"
conditionalRoles: "Conditional roles"
condition: "Condition"
isConditionalRole: "This is a conditional role."
isPublic: "Public role"
@ -1896,7 +1906,7 @@ _registry:
domain: "Domain"
createKey: "Create key"
_aboutMisskey:
about: "CherryPick is a customization client based on Misskey that has been in development since 2021."
about: "CherryPick is a customization open-source software based on Misskey that has been in development since 2021."
contributors: "Main contributors"
allContributors: "All contributors"
source: "Source code"
@ -1909,7 +1919,6 @@ _aboutMisskey:
serverStatus: "Server Status"
donate: "Donate to Kokonect"
_cherrypick:
about: "This Misskey was customized by NoriDev!"
translation: "Translate CherryPick"
donate: "Donate to CherryPick"
relayServer: "Relay Server"
@ -2112,6 +2121,14 @@ _sfx:
chatBg: "Chat (Background)"
antenna: "Antennas"
channel: "Channel notifications"
reaction: "On choosing a reaction"
_soundSettings:
driveFile: "Use an audio file in Drive."
driveFileWarn: "Select an audio file from Drive."
driveFileTypeWarn: "This file is not supported"
driveFileTypeWarnDescription: "Select an audio file"
driveFileDurationWarn: "The audio is too long."
driveFileDurationWarnDescription: "Long audio may disrupt using CherryPick. Still continue?"
_ago:
future: "Future"
justNow: "Just now"
@ -2123,6 +2140,14 @@ _ago:
monthsAgo: "{n}mo ago"
yearsAgo: "{n}y ago"
invalid: "None"
_timeIn:
seconds: "In {n}s"
minutes: "In {n}m"
hours: "In {n}h"
days: "In {n}d"
weeks: "In {n}w"
months: "In {n}mo"
years: "In {n}y"
_time:
second: "Second(s)"
minute: "Minute(s)"
@ -2552,6 +2577,8 @@ _moderationLogTypes:
createAvatarDecoration: "Avatar decoration created"
updateAvatarDecoration: "Avatar decoration updated"
deleteAvatarDecoration: "Avatar decoration deleted"
unsetUserAvatar: "Unset this user's avatar"
unsetUserBanner: "Unset this user's banner"
_fileViewer:
title: "File details"
type: "File type"
@ -2603,17 +2630,17 @@ _externalResourceInstaller:
description: "A problem occurred during theme installation. Please try again. Error details can be viewed in the Javascript console."
_dataSaver:
_media:
title: "Load media"
title: "Loading Media"
description: "Prevents images/videos from being loaded automatically. Hidden images/videos will be loaded when tapped."
_avatar:
title: "User icon image"
description: "Animation of user's icon images stops. Since animated images can be larger in file size than normal images, data traffic can be further reduced."
title: "Avatar image"
description: "Stop avatar image animation. Animated images can be larger in file size than normal images, potentially leading to further reductions in data traffic."
_urlPreview:
title: "URL preview thumbnail"
description: "URL preview thumbnail images will no longer load."
_code:
title: "Code Highlights"
description: "If code highlighting notation is used, such as MFM, it will not be loaded until tapped. Code highlighting requires loading the definition file for each language to be highlighted, but since these files are no longer loaded automatically, a reduction in communication volume can be expected."
title: "Code highlighting"
description: "If code highlighting notations are used in MFM, etc., they will not load until tapped. Syntax highlighting requires downloading the highlight definition files for each programming language. Therefore, disabling the automatic loading of these files is expected to reduce the amount of communication data."
_abuse:
_resolver:
1hour: "one hour"

View file

@ -311,6 +311,7 @@ folderName: "Nombre de la carpeta"
createFolder: "Crear carpeta"
renameFolder: "Renombrar carpeta"
deleteFolder: "Borrar carpeta"
folder: "Carpeta"
addFile: "Agregar archivo"
emptyDrive: "El drive está vacío"
emptyFolder: "La carpeta está vacía"
@ -437,7 +438,6 @@ share: "Compartir"
notFound: "No se encuentra"
notFoundDescription: "No se encontró la página correspondiente a la URL elegida"
uploadFolder: "Carpeta de subidas por defecto"
cacheClear: "Borrar caché"
markAsReadAllNotifications: "Marcar todas las notificaciones como leídas"
markAsReadAllUnreadNotes: "Marcar todas las notas como leídas"
markAsReadAllTalkMessages: "Marcar todos los chats como leídos"
@ -556,6 +556,8 @@ showInPage: "Mostrar en la página"
popout: "Popout"
volume: "Volumen"
masterVolume: "Volumen principal"
notUseSound: "Sin sonido"
useSoundOnlyWhenActive: "Sonar solo cuando CherryPick esté activo"
details: "Detalles"
chooseEmoji: "Elije un emoji"
unableToProcess: "La operación no se puede llevar a cabo"
@ -576,6 +578,10 @@ output: "Salida"
script: "Script"
disablePagesScript: "Deshabilitar AiScript en Páginas"
updateRemoteUser: "Actualizar información de usuario remoto"
unsetUserAvatar: "Quitar avatar"
unsetUserAvatarConfirm: "¿Confirmas que quieres quitar tu avatar?"
unsetUserBanner: "Quitar banner"
unsetUserBannerConfirm: "¿Confirmas que quieres quitar tu banner?"
deleteAllFiles: "Borrar todos los archivos"
deleteAllFilesConfirm: "¿Desea borrar todos los archivos?"
removeAllFollowing: "Retener todos los siguientes"
@ -993,6 +999,7 @@ assign: "Asignar"
unassign: "Quitar"
color: "Color"
manageCustomEmojis: "Administrar emojis personalizados"
manageAvatarDecorations: "Administrar decoraciones de avatar"
youCannotCreateAnymore: "Has llegado al límite de creaciones."
cannotPerformTemporary: "Temporalmente no disponible"
cannotPerformTemporaryDescription: "Esta acción no se puede realizar porque se excedió el límite de ejecución. Espera un poco y prueba de nuevo."
@ -1033,6 +1040,7 @@ resetPasswordConfirm: "¿Realmente quieres cambiar la contraseña?"
sensitiveWords: "Palabras sensibles"
sensitiveWordsDescription: "La visibilidad de todas las notas que contienen cualquiera de las palabras configuradas serán puestas en \"Inicio\" automáticamente. Puedes enumerás varias separándolas con saltos de línea"
sensitiveWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares."
hiddenTags: "Hashtags ocultos"
notesSearchNotAvailable: "No se puede buscar una nota"
license: "Licencia"
unfavoriteConfirm: "¿Desea quitar de favoritos?"
@ -1045,6 +1053,7 @@ enableChartsForRemoteUser: "Generar gráficas de usuarios remotos."
enableChartsForFederatedInstances: "Generar gráficos de servidores remotos"
showClipButtonInNoteFooter: "Añadir \"Clip\" al menú de notas"
reactionsDisplaySize: "Tamaño de las reacciones"
limitWidthOfReaction: "Limitar ancho de las reacciones"
noteIdOrUrl: "ID o URL de la nota"
video: "Video"
videos: "Video"
@ -1146,6 +1155,10 @@ mutualFollow: "Os seguís mutuamente"
fileAttachedOnly: "Solo notas con archivos"
showRepliesToOthersInTimeline: "Mostrar respuestas a otros en la línea de tiempo"
hideRepliesToOthersInTimeline: "Ocultar respuestas a otros en la línea de tiempo"
showRepliesToOthersInTimelineAll: "Muestra tus respuestas a otros usuarios que sigues en la línea de tiempo"
hideRepliesToOthersInTimelineAll: "Ocultar tus respuestas a otros usuarios que sigues en la línea de tiempo"
confirmShowRepliesAll: "Esta operación es irreversible. ¿Confirmas que quieres mostrar tus respuestas a otros usuarios que sigues en tu línea de tiempo?"
confirmHideRepliesAll: "Esta operación es irreversible. ¿Confirmas que quieres ocultar tus respuestas a otros usuarios que sigues en tu línea de tiempo?"
externalServices: "Servicios Externos"
impressum: "Impressum"
impressumUrl: "Impressum URL"
@ -1153,7 +1166,22 @@ impressumDescription: "En algunos países, como Alemania, la inclusión del oper
privacyPolicy: "Política de Privacidad"
privacyPolicyUrl: "URL de la Política de Privacidad"
tosAndPrivacyPolicy: "Condiciones de Uso y Política de Privacidad"
avatarDecorations: "Decoraciones de avatar"
attach: "Acoplar"
detach: "Quitar"
angle: "Ángulo"
flip: "Echar de un capirotazo"
showAvatarDecorations: "Mostrar decoraciones de avatar"
releaseToRefresh: "Soltar para recargar"
refreshing: "Recargando..."
pullDownToRefresh: "Tira hacia abajo para recargar"
disableStreamingTimeline: "Desactivar actualizaciones en tiempo real de la línea de tiempo"
useGroupedNotifications: "Mostrar notificaciones agrupadas"
signupPendingError: "Ha habido un problema al verificar tu dirección de correo electrónico. Es posible que el enlace haya caducado."
cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario proporcionar una descripción."
doReaction: "Añadir reacción"
code: "Código"
reloadRequiredToApplySettings: "Es necesario recargar para que se aplique la configuración."
_announcement:
forExistingUsers: "Solo para usuarios registrados"
forExistingUsersDescription: "Este anuncio solo se mostrará a aquellos usuarios registrados en el momento de su publicación. Si se deshabilita esta opción, aquellos usuarios que se registren tras su publicación también lo verán."
@ -1163,6 +1191,10 @@ _announcement:
tooManyActiveAnnouncementDescription: "Tener demasiados anuncios activos empeora la experiencia de usuario. Por favor, considera archivar aquellos anuncios que hayan quedado obsoletos."
readConfirmTitle: "¿Marcar como leído?"
readConfirmText: "Esto marcará el contenido de \"{title}\" como leído."
shouldNotBeUsedToPresentPermanentInfo: "Dado que puede impactar en la experiencia de usuario de forma significativa, es recomendable usar notificaciones en el flujo de información en vez de información persistente."
dialogAnnouncementUxWarn: "Mostrar dos o más notificaciones en formato diálogo a la vez puede impactar en la experiencia de usuario de forma significativa, úsalos con cuidado."
silence: "Silenciar notificaciones"
silenceDescription: "Si lo activas, no enviarás notificación sobre este anuncio y el usuario no tendrá que leerlo."
_initialAccountSetting:
accountCreated: "¡La cuenta ha sido creada!"
letsStartAccountSetup: "Para empezar, creemos tu perfil."
@ -1175,8 +1207,38 @@ _initialAccountSetting:
pushNotificationDescription: "Habilitar las notificaciones push te permitirá recibir notificaciones de {name} directamente en tu dispositivo."
initialAccountSettingCompleted: "¡Configuración del perfil completada!"
haveFun: "¡Disfruta de {name}!"
youCanContinueTutorial: "Puedes proceder a un tutorial sobre cómo usar {name} (CherryPick) o puedes terminar la instalación aquí y empezar a usarlo ya mismo."
startTutorial: "Comenzar tutorial"
skipAreYouSure: "¿Realmente quieres saltarte la configuración del perfil?"
laterAreYouSure: "¿Realmente quieres configurar tu perfil después?"
_initialTutorial:
launchTutorial: "Comenzar tutorial"
title: "Tutorial"
wellDone: "¡Bien hecho!"
skipAreYouSure: "¿Salir del tutorial?"
_landing:
title: "Bienvenid@ al tutorial"
description: "Aquí podrás aprender las nociones básicas sobre cómo usar CherryPick y sus funciones."
_note:
title: "¿Qué es una nota?"
description: "Las publicaciones en CherryPick se llaman 'Notas'. Las notas se ordenan de forma cronológica en la línea de tiempo y se actualizan en tiempo real."
reply: "Pulsa en este botón para contestar a un mensaje. También es posible contestar a otras contestaciones, continuando así la conversación como un hilo."
renote: "Puedes compartir esa nota en tu propia línea de tiempo. También puedes añadir una cita con tus comentarios."
reaction: "Puedes añadir reacciones a la Nota. Se explicarán más detalles en la siguiente página."
menu: "Puedes ver los detalles de la Nota, copiar enlaces, y realizar otras acciones."
_reaction:
title: "¿Qué son las reacciones?"
description: "Se puede reaccionar a las Notas con diferentes emojis. Las reacciones te permiten expresar matices que no se pueden transmitir con un simple 'me gusta'."
letsTryReacting: "Puedes añadir reacciones pulsando en el botón '+' de la nota. ¡Intenta reaccionar a esta nota de ejemplo!"
reactToContinue: "Añade una reacción para continuar."
reactNotification: "Recibirás notificaciones en tiempo real cuando alguien reaccione a tu nota."
reactDone: "Puedes deshacer una reacción pulsando en el botón '-'."
_timeline:
title: "El concepto de Línea de tiempo"
description1: "CherryPick proporciona múltiples líneas de tiempo basadas en su uso (algunas pueden no estar disponibles dependiendo de las políticas de la instancia)."
home: "Puedes ver los posts de las cuentas que sigues."
local: "Puedes ver los posts de todos los usuarios de este servidor."
social: "Se ven los posts de la línea de tiempo de inicio junto con los de la línea de tiempo local."
_serverRules:
description: "Un conjunto de reglas que serán mostradas antes del registro. Configurar un sumario de términos de servicio es recomendado."
_serverSettings:
@ -1491,6 +1553,7 @@ _role:
inviteLimitCycle: "Enfriamiento del límite de invitaciones"
inviteExpirationTime: "Intervalo de caducidad de invitaciones"
canManageCustomEmojis: "Administrar emojis personalizados"
canManageAvatarDecorations: "Administrar decoraciones de avatar"
driveCapacity: "Capacidad del drive"
alwaysMarkNsfw: "Siempre marcar archivos como NSFW"
pinMax: "Máximo de notas fijadas"
@ -1804,6 +1867,8 @@ _ago:
monthsAgo: "Hace {n} meses"
yearsAgo: "Hace {n} años"
invalid: "No hay nada que ver aqui"
_timeIn:
years: "En {n} años"
_time:
second: "Segundos"
minute: "Minutos"
@ -2123,6 +2188,9 @@ _notification:
checkNotificationBehavior: "Comprobar comportamiento de la notificación"
sendTestNotification: "Enviar notificación de prueba"
notificationWillBeDisplayedLikeThis: "Las notificaciones tendrán este aspecto"
reactedBySomeUsers: "{n} usuarios han reaccionado"
renotedBySomeUsers: "{n} usuarios han renotado"
followedBySomeUsers: "Seguido por {n} usuarios"
_types:
all: "Todo"
note: "Nuevas notas"
@ -2227,6 +2295,11 @@ _moderationLogTypes:
createAd: "Anuncio creado"
deleteAd: "Anuncio eliminado"
updateAd: "Anuncio actualizado"
createAvatarDecoration: "Decoración de avatar creada"
updateAvatarDecoration: "Decoración de avatar actualizada"
deleteAvatarDecoration: "Decoración de avatar eliminada"
unsetUserAvatar: "Quitar decoración de avatar de este usuario"
unsetUserBanner: "Quitar banner de este usuario"
_fileViewer:
title: "Detalles del archivo"
type: "Tipo de archivo"
@ -2235,3 +2308,44 @@ _fileViewer:
uploadedAt: "Subido el"
attachedNotes: "Notas adjuntas"
thisPageCanBeSeenFromTheAuthor: "Esta página solo puede ser vista por el autor."
_externalResourceInstaller:
title: "Instalar desde sitio externo"
checkVendorBeforeInstall: "Asegúrate de que el distribuidor de este recurso es de confianza antes de proceder a la instalación."
_plugin:
title: "¿Quieres instalar este plugin?"
metaTitle: "Información del plugin"
_theme:
title: "¿Quieres instalar este tema?"
metaTitle: "Información del tema"
_meta:
base: "Esquema de color base"
_vendorInfo:
title: "Información del distribuidor"
endpoint: "Terminal referenciada"
hashVerify: "Verificación de hash"
_errors:
_invalidParams:
title: "Parámetros inválidos"
description: "No hay información suficiente para cargar datos de un sitio externo. Por favor, confirma la URL introducida."
_resourceTypeNotSupported:
title: "Este recurso externo no es compatible"
description: "El tipo de este recurso externo no es compatible. Por favor, contacta con el administrador del sitio."
_failedToFetch:
title: "No se pudo obtener los datos"
fetchErrorDescription: "Ha ocurrido un error al comunicarse con el sitio externo. Si no se soluciona tras intentarlo otra vez, por favor, contacta con el administrador del sitio."
parseErrorDescription: "Ha ocurrido un error al procesar los datos obtenidos del sitio externo. Por favor, contacta con el administrador del sitio."
_hashUnmatched:
title: "Verificación de datos fallida"
description: "Ha ocurrido un error al verificar la integridad de los datos obtenidos. Por seguridad, la instalación no se puede realizar. Por favor, contacta con el administrador del sitio."
_pluginParseFailed:
title: "Error de AiScript"
description: "Los datos se han obtenido correctamente, pero ha ocurrido un error de AiScript al procesarlos. Por favor, contacta con el autor del plugin. Se pueden ver más detalles del error en la consola de Javascript."
_pluginInstallFailed:
title: "Instalación del plugin fallida."
description: "Ha ocurrido un problema al instalar el plugin. Por favor, inténtalo de nuevo. Se pueden ver más detalles del error en la consola de Javascript."
_themeParseFailed:
title: "Análisis del tema fallido"
description: "Los datos se han obtenido correctamente, pero ha ocurrido un error al analizar el tema. Por favor, contacta con el autor. Se pueden ver más detalles del error en la consola de Javascript."
_themeInstallFailed:
title: "Instalación de tema fallida"
description: "Ha ocurrido un problema al instalar el tema. Por favor, inténtalo de nuevo. Se pueden ver más detalles del error en la consola de Javascript."

View file

@ -75,7 +75,7 @@ import: "Importer"
export: "Exporter"
files: "Fichiers"
download: "Télécharger"
driveFileDeleteConfirm: "Êtes-vous sûr de vouloir supprimer le fichier \"{name}\" ? Les notes liées à ce fichier seront aussi supprimées."
driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier « {name} » ? Les notes avec ce fichier joint seront aussi supprimées."
unfollowConfirm: "Désirez-vous vous désabonner de {name} ?"
exportRequested: "Vous avez demandé une exportation. Lopération pourrait prendre un peu de temps. Une fois terminée, le fichier sera ajouté au Drive."
importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps."
@ -258,14 +258,15 @@ imageUrl: "URL de limage"
remove: "Supprimer"
removed: "Supprimé"
removeAreYouSure: "Êtes-vous sûr·e de vouloir supprimer « {x} » ?"
deleteAreYouSure: "Êtes-vous sûr·e de vouloir supprimer「{x}」?"
deleteAreYouSure: "Êtes-vous sûr·e de vouloir supprimer « {x} » ?"
resetAreYouSure: "Voulez-vous réinitialiser ?"
areYouSure: "Êtes-vous sûr·e ?"
saved: "Enregistré"
messaging: "Discuter"
upload: "Téléverser"
keepOriginalUploading: "Garder limage dorigine"
keepOriginalUploadingDescription: "Conserve la version originale lors du téléchargement d'images. S'il est désactivé, le navigateur génère l'image pour la publication web lors du téléchargement."
fromDrive: "Depuis le Drive"
fromDrive: "Depuis le Disque"
fromUrl: "Depuis une URL"
uploadFromUrl: "Téléverser via une URL"
uploadFromUrlDescription: "URL du fichier que vous souhaitez téléverser"
@ -299,7 +300,7 @@ dark: "Sombre"
lightThemes: "Thèmes clairs"
darkThemes: "Thèmes sombres"
syncDeviceDarkMode: "Utiliser le mode sombre de votre appareil"
drive: "Drive"
drive: "Disque"
fileName: "Nom du fichier"
selectFile: "Choisir le fichier"
selectFiles: "Choisir les fichiers"
@ -310,8 +311,9 @@ folderName: "Nom du dossier"
createFolder: "Créer un dossier"
renameFolder: "Renommer le dossier"
deleteFolder: "Supprimer le dossier"
folder: "Dossier"
addFile: "Ajouter un fichier"
emptyDrive: "Le Drive est vide"
emptyDrive: "Le Disque est vide"
emptyFolder: "Le dossier est vide"
unableToDelete: "Suppression impossible"
inputNewFileName: "Entrez un nouveau nom de fichier"
@ -355,8 +357,8 @@ disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur
registration: "Sinscrire"
enableRegistration: "Autoriser les nouvelles inscriptions"
invite: "Inviter"
driveCapacityPerLocalAccount: "Volume du Drive par utilisateur local"
driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant"
driveCapacityPerLocalAccount: "Capacité de stockage du Disque par utilisateur local"
driveCapacityPerRemoteAccount: "Capacité de stockage du Disque par utilisateur distant"
inMb: "en mégaoctets"
bannerUrl: "URL de limage de la bannière"
backgroundImageUrl: "URL de l'image d'arrière-plan"
@ -428,6 +430,7 @@ lastUsed: "Dernier utilisé"
lastUsedAt: "Dernière utilisation : {t}"
unregister: "Se désinscrire"
passwordLessLogin: "Se connecter sans mot de passe"
passwordLessLoginDescription: "Se connecter uniquement avec une clé de sécurité ou une clé d'accès sans utiliser de mot de passe"
resetPassword: "Réinitialiser le mot de passe"
newPasswordIs: "Votre nouveau mot de passe est \"{password}\""
reduceUiAnimation: "Réduire les animations dans linterface"
@ -435,7 +438,6 @@ share: "Partager"
notFound: "Non trouvé"
notFoundDescription: "Aucune page ne correspond à lURL spécifiée."
uploadFolder: "Emplacement de téléversement par défaut"
cacheClear: "Vider le cache"
markAsReadAllNotifications: "Marquer toutes les notifications comme lues"
markAsReadAllUnreadNotes: "Marquer toutes les notes comme lues"
markAsReadAllTalkMessages: "Marquer toutes les discussions comme lues"
@ -495,6 +497,7 @@ showNoteActionsOnlyHover: "Afficher les actions de note uniquement au survol"
noHistory: "Pas d'historique"
signinHistory: "Historique de connexion"
enableAdvancedMfm: "Activer la MFM avancée"
enableAnimatedMfm: "Activer le MFM animé"
doing: "En cours..."
category: "Catégorie"
tags: "Étiquettes"
@ -503,6 +506,7 @@ createAccount: "Créer un compte"
existingAccount: "Compte existant"
regenerate: "Générer à nouveau"
fontSize: "Taille de la police"
mediaListWithOneImageAppearance: "Hauteur des listes de médias n'ayant qu'une image "
limitTo: "Limiter à {x}"
noFollowRequests: "Vous navez aucune demande dabonnement en attente"
openImageInNewTab: "Ouvrir les images dans un nouvel onglet"
@ -540,6 +544,7 @@ objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi"
serverLogs: "Journal du serveur"
deleteAll: "Supprimer tout"
showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité"
showFixedPostFormInChannel: "Afficher le formulaire de publication en haut du fil (canaux)"
withRepliesByDefaultForNewlyFollowed: "Afficher les réponses des nouvelles personnes que vous suivez dans le fil par défaut"
newNoteRecived: "Voir les nouvelles notes"
sounds: "Sons"
@ -550,6 +555,8 @@ showInPage: "Afficher dans la page"
popout: "Fenêtre contextuelle"
volume: "Volume"
masterVolume: "Volume principal"
notUseSound: "Ne pas émettre de son"
useSoundOnlyWhenActive: "Émettre des sons uniquement quand CherryPick est active"
details: "Détails"
chooseEmoji: "Choisissez un émoji"
unableToProcess: "Lopération na pas pu être complétée."
@ -570,9 +577,13 @@ output: "Sortie"
script: "Script"
disablePagesScript: "Désactiver AiScript sur les Pages"
updateRemoteUser: "Mettre à jour les informations de lutilisateur·rice distant·e"
unsetUserAvatar: "Supprimer lavatar"
unsetUserAvatarConfirm: "Êtes-vous sûr·e de vouloir supprimer l'avatar ?"
unsetUserBanner: "Supprimer la bannière"
unsetUserBannerConfirm: "Êtes-vous sûr·e de vouloir supprimer la bannière ?"
deleteAllFiles: "Supprimer tous les fichiers"
deleteAllFilesConfirm: "Êtes-vous sûr·e de vouloir supprimer tous les fichiers ?"
removeAllFollowing: "Retenir tous les abonnements"
removeAllFollowing: "Se désabonner de tous les utilisateurs auxquels vous êtes abonné·e"
removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action dans les cas où linstance nexiste plus, etc."
userSuspended: "Cet·te utilisateur·rice a été suspendu·e."
userSilenced: "Cette utilisateur·trice a été mis·e en sourdine."
@ -641,6 +652,7 @@ smtpSecure: "Utiliser SSL/TLS implicitement dans les connexions SMTP"
smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé"
testEmail: "Tester la distribution de courriel"
wordMute: "Filtre de mots"
hardWordMute: "Filtre de mots dur"
regexpError: "Erreur dexpression régulière"
regexpErrorDescription: "Une erreur s'est produite dans l'expression régulière sur la ligne {ligne} de votre mot muet {tab} :"
instanceMute: "Instance en sourdine"
@ -713,8 +725,8 @@ pollVotesCount: "Nombre de votes envoyés"
pollVotedCount: "Nombre de votes reçus"
yes: "Oui"
no: "Non"
driveFilesCount: "Nombre de fichiers dans le Drive"
driveUsage: "Utilisation du Drive"
driveFilesCount: "Nombre de fichiers sur le Disque"
driveUsage: "Utilisation du Disque"
noCrawle: "Refuser l'indexation par les robots"
noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page de profil, vos notes, vos pages, etc."
lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre note sur \"Abonné-e-s\", vos notes sont visibles par tous, même si vous exigez que les demandes d'abonnement soient approuvées manuellement."
@ -857,7 +869,7 @@ pubSub: "Comptes Pub/Sub"
lastCommunication: "Dernière communication"
resolved: "Résolu"
unresolved: "En attente"
breakFollow: "Ne plus suivre"
breakFollow: "Supprimer l'abonné·e"
breakFollowConfirm: "Êtes-vous sûr de vouloir vous désabonner?"
itsOn: "Activé"
itsOff: "Désactivé"
@ -918,7 +930,7 @@ noEmailServerWarning: "Serveur de courrier non configuré."
thereIsUnresolvedAbuseReportWarning: "Il ny a aucun rapport non résolu."
recommended: "Recommandé"
check: "Vérifier"
driveCapOverrideLabel: "Modifier la capacité de stockage du drive de cet·te utilisateur·rice"
driveCapOverrideLabel: "Modifier la capacité de stockage du Disque de cet·te utilisateur·rice"
driveCapOverrideCaption: "Si une valeur inférieure à 0 est spécifiée, elle est annulée."
requireAdminForView: "Vous devez être connecté avec un compte administrateur pour les visualiser."
isSystemAccount: "Ces comptes sont automatiquement créés et gérés par le système."
@ -994,6 +1006,7 @@ preset: "Préréglage"
selectFromPresets: "Sélectionner à partir des préréglages"
achievements: "Accomplissements"
gotInvalidResponseError: "Réponse du serveur invalide"
gotInvalidResponseErrorDescription: "Il se peut que le serveur soit hors ligne ou en maintenance. Veuillez réessayer plus tard."
thisPostMayBeAnnoying: "Cette note peut gêner d'autres personnes."
thisPostMayBeAnnoyingHome: "Publier vers le fil principal"
thisPostMayBeAnnoyingCancel: "Annuler"
@ -1003,16 +1016,31 @@ internalServerError: "Erreur interne du serveur"
copyErrorInfo: "Copier les détails de lerreur"
joinThisServer: "S'inscrire à cette instance"
exploreOtherServers: "Trouver une autre instance"
letsLookAtTimeline: "Jetez un coup d'œil au fil"
disableFederationConfirm: "Voulez-vous vraiment désactiver la fédération ?"
disableFederationConfirmWarn: "Même sans fédération, la note ne sera pas privée. Dans la plupart des cas, ce n'est pas nécessaire de désactiver la fédération."
disableFederationOk: "Désactiver"
invitationRequiredToRegister: "Actuellement, cette instance est uniquement sur invitation. Seuls ceux qui ont un code d'invitation peuvent s'inscrire."
emailNotSupported: "Cette instance ne prend pas en charge l'envoi de courriels"
postToTheChannel: "Publier au canal"
cannotBeChangedLater: "Cela ne peut pas être modifié plus tard."
reactionAcceptance: "Acceptation des réactions"
likeOnly: "Les favoris uniquement"
likeOnlyForRemote: "Toutes (mentions j'aime seulement pour les instances distantes)"
nonSensitiveOnly: "Non sensibles seulement"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Non sensibles seulement (mentions j'aime seulement pour les instances distantes)"
rolesAssignedToMe: "Rôles attribués à moi"
sensitiveWords: "Mots sensibles"
hiddenTags: "Hashtags cachés"
hiddenTagsDescription: "Les hashtags définis ne s'afficheront pas dans les tendances. Vous pouvez définir plusieurs hashtags en faisant un saut de ligne."
notesSearchNotAvailable: "La recherche de notes n'est pas disponible."
license: "Licence"
myClips: "Mes clips"
drivecleaner: "Nettoyeur du Disque"
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
reactionsDisplaySize: "Taille de l'affichage des réactions"
limitWidthOfReaction: "Limiter la largeur maximale des réactions et les afficher en taille réduite"
noteIdOrUrl: "Identifiant de la note ou URL"
video: "Vidéo"
videos: "Vidéos"
@ -1023,6 +1051,7 @@ accountMovedShort: "Ce compte a migré"
operationForbidden: "Opération non autorisée"
forceShowAds: "Toujours afficher les publicités"
addMemo: "Ajouter un mémo"
editMemo: "Éditer le mémo"
reactionsList: "Réactions"
renotesList: "Liste de renotes"
notificationDisplay: "Style des notifications"
@ -1035,10 +1064,13 @@ vertical: "Vertical"
horizontal: "Latéral"
position: "Position"
serverRules: "Règles du serveur"
pleaseConfirmBelowBeforeSignup: "Pour vous inscrire sur cette instance, vous devez confirmer et accepter le contenu suivant."
pleaseAgreeAllToContinue: "Pour continuer, veuillez accepter tous les champs ci-dessus."
continue: "Continuer"
preservedUsernames: "Noms d'utilisateur·rice réservés"
createNoteFromTheFile: "Rédiger une note de ce fichier"
archive: "Archive"
channelArchiveConfirmTitle: "Voulez-vous vraiment archiver {name} ?"
thisChannelArchived: "Ce canal a été archivé."
displayOfNote: "Affichage de la note"
initialAccountSetting: "Configuration initiale du profil"
@ -1051,7 +1083,9 @@ failedToPreviewUrl: "Aperçu d'URL échoué"
update: "Mettre à jour"
later: "Plus tard"
goToMisskey: "Retour vers CherryPick"
additionalEmojiDictionary: "Dictionnaires d'émojis additionnels"
installed: "Installé"
branding: "Image de marque"
expirationDate: "Date dexpiration"
waitingForMailAuth: "En attente de la vérification de l'adresse courriel"
usedAt: "Utilisé le"
@ -1094,6 +1128,7 @@ tosAndPrivacyPolicy: "Conditions d'utilisation et politique de confidentialité"
avatarDecorations: "Décorations d'avatar"
attach: "Mettre"
detach: "Enlever"
detachAll: "Tout enlever"
angle: "Angle"
flip: "Inverser"
showAvatarDecorations: "Afficher les décorations d'avatar"
@ -1105,6 +1140,9 @@ useGroupedNotifications: "Grouper les notifications"
signupPendingError: "Un problème est survenu lors de la vérification de votre adresse e-mail. Le lien a peut-être expiré."
cwNotationRequired: "Si « Masquer le contenu » est activé, une description doit être fournie."
doReaction: "Réagir"
code: "Code"
reloadRequiredToApplySettings: "Le rafraîchissement est nécessaire pour que les paramètres prennent effet."
remainingN: "Restants : {n}"
_announcement:
readConfirmTitle: "Marquer comme lu ?"
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
@ -1174,7 +1212,7 @@ _initialTutorial:
tryThisFile: "Essayez de marquer l'image jointe à ce formulaire de publication comme sensible !"
_exampleNote:
note: "Oups, j'ai échoué à ouvrir le couvercle du natto..."
method: "Pour marquer un fichier joint comme sensible, cliquez sur la vignette du fichier, ouvrez le menu et cliquez sur « marquer comme sensible » ."
method: "Pour marquer un fichier joint comme sensible, cliquez sur la vignette du fichier pour ouvrir le menu et cliquez sur « marquer comme sensible » ."
sensitiveSucceeded: "Quand vous joignez des fichiers, veuillez indiquer la sensibilité selon les règles du serveur."
doItToContinue: "Marquez le fichier joint comme sensible pour procéder."
_done:
@ -1340,6 +1378,8 @@ _role:
description: "Description du rôle"
permission: "Rôle et autorisations"
assignTarget: "Attribuer"
manualRoles: "Rôles manuels"
conditionalRoles: "Rôles conditionnels"
condition: "Condition"
isPublic: "Rôle public"
options: "Options"
@ -1357,8 +1397,10 @@ _role:
_options:
canManageCustomEmojis: "Gestion des émojis personnalisés"
canManageAvatarDecorations: "Gestion des décorations d'avatar"
driveCapacity: "Capacité de stockage du Disque"
wordMuteMax: "Nombre maximal de caractères dans le filtre de mots"
canUseTranslator: "Usage de la fonctionnalité de traduction"
avatarDecorationLimit: "Nombre maximal de décorations d'avatar"
_sensitiveMediaDetection:
description: "L'apprentissage automatique peut être utilisé pour détecter automatiquement les médias sensibles à modérer. La sollicitation des serveurs augmente légèrement."
sensitivity: "Sensibilité de la détection"
@ -1426,7 +1468,7 @@ _preferencesBackups:
nameAlreadyExists: "Le nom de sauvegarde \"{name}\" existe déjà. Veuillez spécifier un autre nom."
applyConfirm: "Voulez-vous appliquer la sauvegarde '{name}' au dispositif actuel ? La configuration actuelle de l'appareil sera perdue."
saveConfirm: "Voulez-vous écraser {name} ?"
deleteConfirm: "Voulez-vous supprimer {name} ?"
deleteConfirm: "Êtes-vous sûr·e de vouloir supprimer {name} ?"
renameConfirm: "Voulez-vous remplacer \"{old}\" par \"{new}\" ?"
noBackups: "Aucune sauvegarde n'est disponible. L'option \"Nouvelle sauvegarde\" vous permet de sauvegarder la configuration actuelle du client sur le serveur."
createdAt: "Créé : {date} {time}"
@ -1631,6 +1673,14 @@ _sfx:
chatBg: "Discussion (arrière-plan)"
antenna: "Réception de lantenne"
channel: "Notifications de canal"
reaction: "Lors de la sélection de la réaction"
_soundSettings:
driveFile: "Utiliser un effet sonore sur le Disque"
driveFileWarn: "Veuillez sélectionner le fichier sur le Disque"
driveFileTypeWarn: "Ce fichier n'est pas pris en charge"
driveFileTypeWarnDescription: "Veuillez sélectionner un fichier audio"
driveFileDurationWarn: "L'effet sonore est trop long"
driveFileDurationWarnDescription: "Utiliser un effet sonore long peut affecter l'utilisation de CherryPick. Voulez-vous encore continuer ?"
_ago:
future: "Futur"
justNow: "à linstant"
@ -1642,6 +1692,14 @@ _ago:
monthsAgo: "Il y a {n} mois"
yearsAgo: "Il y a {n} ans"
invalid: "Il n'y a rien à voir ici"
_timeIn:
seconds: "Dans {n}s"
minutes: "Dans {n}min"
hours: "Dans {n}h"
days: "Dans {n}j"
weeks: "Dans {n} sem."
months: "Dans {n} mois"
years: "Dans {n}a"
_time:
second: "s"
minute: "min"
@ -1659,7 +1717,7 @@ _2fa:
securityKeyInfo: "Vous pouvez configurer l'authentification WebAuthN pour sécuriser davantage le processus de connexion grâce à une clé de sécurité matérielle qui prend en charge FIDO2, ou bien en configurant l'authentification par empreinte digitale ou par code PIN sur votre appareil."
securityKeyName: "Nom de la clé"
removeKey: "Supprimer la clé de sécurité"
removeKeyConfirm: "Voulez-vous supprimer {name} ?"
removeKeyConfirm: "Êtes-vous sûr·e de vouloir supprimer {name} ?"
renewTOTPOk: "Reconfigurer"
renewTOTPCancel: "Pas maintenant"
backupCodes: "Codes de Secours"
@ -1668,8 +1726,8 @@ _permissions:
"write:account": "Mettre à jour les informations de votre compte"
"read:blocks": "Voir les comptes bloqués"
"write:blocks": "Gérer les comptes bloqués"
"read:drive": "Parcourir le Drive"
"write:drive": "Écrire sur le Drive"
"read:drive": "Parcourir le Disque"
"write:drive": "Modifier le Disque"
"read:favorites": "Afficher les favoris"
"write:favorites": "Gérer les favoris"
"read:following": "Voir les informations de vos abonnements"
@ -1689,7 +1747,7 @@ _permissions:
"read:page-likes": "Voir les mentions « J'aime » des pages"
"write:page-likes": "Gérer les mentions « J'aime » sur les pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
"write:user-groups": "Éditer les groupes d'utilisateur·rice·s"
"read:channels": "Lire les canaux"
"write:channels": "Gérer les canaux"
"read:gallery": "Voir la galerie"
@ -1744,6 +1802,7 @@ _widgets:
userList: "Liste utilisateur"
_userList:
chooseList: "Sélectionner une liste"
birthdayFollowings: "Utilisateurs qui fêtent l'anniversaire aujourd'hui"
_cw:
hide: "Masquer"
show: "Afficher le contenu"
@ -1801,8 +1860,9 @@ _profile:
metadataDescription: "Vous pouvez afficher jusqu'à quatre informations supplémentaires dans votre profil."
metadataLabel: "Étiquette"
metadataContent: "Contenu"
changeAvatar: "Changer l'image de profil"
changeAvatar: "Changer l'avatar"
changeBanner: "Changer de bannière"
avatarDecorationMax: "Vous pouvez mettre au plus {max} décorations d'avatar."
_exportOrImport:
allNotes: "Toutes les notes"
followingList: "Abonnements"
@ -1968,6 +2028,9 @@ _deck:
channel: "Canal"
mentions: "Mentions"
direct: "Direct"
_drivecleaner:
orderBySizeDesc: "Taille descendante"
orderByCreatedAtAsc: "Date d'ajout ascendante"
_webhookSettings:
name: "Nom"
active: "Activé"
@ -2005,6 +2068,8 @@ _moderationLogTypes:
createAvatarDecoration: "Décoration d'avatar créée"
updateAvatarDecoration: "Décoration d'avatar mise à jour"
deleteAvatarDecoration: "Décoration d'avatar supprimée"
unsetUserAvatar: "Supprimer l'avatar de l'utilisateur·rice"
unsetUserBanner: "Supprimer la bannière de l'utilisateur·rice"
_fileViewer:
title: "Détails du fichier"
type: "Type du fichier"
@ -2054,3 +2119,16 @@ _externalResourceInstaller:
_themeInstallFailed:
title: "Échec d'installation du thème"
description: "Il y a eu un problème lors de l'installation du thème. Veuillez réessayer. Pour plus de détails sur l'erreur, veuillez consulter la console JavaScript."
_dataSaver:
_media:
title: "Chargement des médias"
description: "Empêche le chargement automatique des images et des vidéos. Appuyez sur les images et les vidéos cachées pour les charger."
_avatar:
title: "Animation d'avatars"
description: "Arrête l'animation d'avatars. Comme les images animées peuvent être plus volumineuses que les images normales, cela permet de réduire davantage le trafic de données."
_urlPreview:
title: "Vignettes d'aperçu des URL"
description: "Les vignettes d'aperçu des URL ne seront plus chargées."
_code:
title: "Mise en évidence du code"
description: "Si la notation de mise en évidence du code est utilisée, par exemple dans la MFM, elle ne sera pas chargée tant qu'elle n'aura pas été tapée. La mise en évidence du code nécessite le chargement du fichier de définition de chaque langue à mettre en évidence, mais comme ces fichiers ne sont plus chargés automatiquement, on peut s'attendre à une réduction du trafic de données."

View file

@ -437,7 +437,6 @@ share: "Bagikan"
notFound: "Tidak dapat ditemukan"
notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
uploadFolder: "Lokasi unggah folder bawaan"
cacheClear: "Bersihkan tembolok"
markAsReadAllNotifications: "Tandai semua notifikasi telah dibaca"
markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
@ -576,6 +575,10 @@ output: "Keluaran"
script: "Script"
disablePagesScript: "Nonaktifkan script pada halaman"
updateRemoteUser: "Perbaharui informasi pengguna instansi luar"
unsetUserAvatar: "Hapus avatar"
unsetUserAvatarConfirm: "Apakah kamu yakin ingin menghapus avatar?"
unsetUserBanner: "Hapus banner"
unsetUserBannerConfirm: "Apakah kamu yakin ingin menghapus banner?"
deleteAllFiles: "Hapus semua berkas"
deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?"
removeAllFollowing: "Batalkan mengikuti semua pengguna"
@ -993,6 +996,7 @@ assign: "Tetapkan\n"
unassign: "Batalkan penetapan"
color: "Warna"
manageCustomEmojis: "Kelola Emoji Kustom"
manageAvatarDecorations: "Kelola dekorasi avatar"
youCannotCreateAnymore: "Kamu melewati batas pembuatan."
cannotPerformTemporary: "Sementara Tidak Tersedia"
cannotPerformTemporaryDescription: "Aksi ini tidak dapat dilakukan sementara karena melewati batas eksekusi. Mohon tunggu sejenak dan coba lagi."
@ -1146,6 +1150,10 @@ mutualFollow: "Saling mengikuti"
fileAttachedOnly: "Hanya catatan dengan berkas"
showRepliesToOthersInTimeline: "Tampilkan balasan ke pengguna lain dalam lini masa"
hideRepliesToOthersInTimeline: "Sembunyikan balasan ke orang lain dari lini masa"
showRepliesToOthersInTimelineAll: "Tampilkan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa"
hideRepliesToOthersInTimelineAll: "Sembuyikan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa"
confirmShowRepliesAll: "Operasi ini tidak dapat diubah. Apakah kamu yakin untuk menampilkan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa?"
confirmHideRepliesAll: "Operasi ini tidak dapat diubah. Apakah kamu yakin untuk menyembunyikan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa?"
externalServices: "Layanan eksternal"
impressum: "Impressum"
impressumUrl: "Tautan Impressum"
@ -1153,7 +1161,20 @@ impressumDescription: "Pada beberapa negara seperti Jerman, inklusi dari informa
privacyPolicy: "Kebijakan Privasi"
privacyPolicyUrl: "Tautan Kebijakan Privasi"
tosAndPrivacyPolicy: "Syarat dan Ketentuan serta Kebijakan Privasi"
avatarDecorations: "Dekorasi avatar"
attach: "Lampirkan"
detach: "Hapus"
angle: "Sudut"
flip: "Balik"
showAvatarDecorations: "Tampilkan dekorasi avatar"
releaseToRefresh: "Lepaskan untuk memuat ulang"
refreshing: "Sedang memuat ulang..."
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
disableStreamingTimeline: "Nonaktifkan pembaharuan lini masa real-time"
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
doReaction: "Tambahkan reaksi"
_announcement:
forExistingUsers: "Hanya pengguna yang telah ada"
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
@ -1163,6 +1184,7 @@ _announcement:
tooManyActiveAnnouncementDescription: "Terlalu banyak pengumuman dapat memperburuk pengalaman pengguna. Mohon pertimbangkan untuk mengarsipkan pengumuman yang sudah usang/tidak relevan."
readConfirmTitle: "Tandai telah dibaca?"
readConfirmText: "Aksi ini akan menandai konten dari \"{title}\" telah dibaca."
silence: "Tiada notifikasi"
_initialAccountSetting:
accountCreated: "Akun kamu telah sukses dibuat!"
letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu."
@ -1175,8 +1197,25 @@ _initialAccountSetting:
pushNotificationDescription: "Menyalakan notifikasi dorong akan membuatmu menerima notifikasi dari {name} secara langsung ke perangkatmu."
initialAccountSettingCompleted: "Pengaturan profil selesai!"
haveFun: "Selamat menikmati, {name}!"
startTutorial: "Mulai Tutorial"
skipAreYouSure: "Yakin melewati atur profil?"
laterAreYouSure: "Yakin banget untuk atur profil nanti?"
_initialTutorial:
launchTutorial: "Lihat Tutorial"
title: "Tutorial"
skipAreYouSure: "Berhenti dari Tutorial?"
_landing:
title: "Selamat datang di Tutorial"
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan CherryPick dan fitur-fiturnya."
_note:
title: "Apa itu Catatan?"
_postNote:
title: "Pengaturan posting Catatan"
_visibility:
public: "Perlihatkan catatan ke semua pengguna."
home: "Hanya publik ke lini masa Beranda. Pengguna yang mengunjungi profilmu melalui pengikut dan renote dapat melihatnya."
followers: "Perlihatkan ke pengikut saja. Hanya pengikut yang dapat melihat postinganmu dan tidak dapat direnote oleh siapapun."
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
_serverRules:
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
_serverSettings:
@ -1491,6 +1530,7 @@ _role:
inviteLimitCycle: "Interval Penerbitan Kode Undangan"
inviteExpirationTime: "Interval kedaluwarsa undangan"
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
canManageAvatarDecorations: "Kelola dekorasi avatar"
driveCapacity: "Kapasitas Drive"
alwaysMarkNsfw: "Selalu tandai berkas sebagai NSFW"
pinMax: "Jumlah maksimal catatan yang disematkan"

8
locales/index.d.ts vendored
View file

@ -195,7 +195,12 @@ export interface Locale {
"add": string;
"reaction": string;
"reactions": string;
"reactionSetting": string;
"emojiPicker": string;
"pinnedEmojisForReactionSettingDescription": string;
"pinnedEmojisSettingDescription": string;
"emojiPickerDisplay": string;
"copyFromPinnedEmojisForReaction": string;
"copyFromPinnedEmojis": string;
"reactionSettingDescription2": string;
"rememberNoteVisibility": string;
"attachCancel": string;
@ -2053,7 +2058,6 @@ export interface Locale {
"donate": string;
};
"_cherrypick": {
"about": string;
"translation": string;
"donate": string;
"relayServer": string;

View file

@ -15,7 +15,7 @@ gotIt: "ok!"
cancel: "Annulla"
noThankYou: "No grazie"
enterUsername: "Inserisci un nome utente"
renotedBy: "Rinotato da {user}"
renotedBy: "Rinotata da {user}"
noNotes: "Nessuna nota!"
noNotifications: "Nessuna notifica"
instance: "Istanza"
@ -102,12 +102,12 @@ defaultNoteVisibility: "Privacy predefinita delle note"
follow: "Segui"
followRequest: "Richiesta di follow"
followRequests: "Richieste di follow"
unfollow: "Non seguire"
unfollow: "Interrompi following"
followRequestPending: "Richiesta in approvazione"
enterEmoji: "Inserisci emoji"
renote: "Rinota"
unrenote: "Elimina la Rinota"
renoted: "Rinotato!"
renoted: "Rinotata!"
cantRenote: "È impossibile rinotare questa nota."
cantReRenote: "È impossibile rinotare una Rinota."
quote: "Citazione"
@ -311,6 +311,7 @@ folderName: "Nome della cartella"
createFolder: "Nuova cartella"
renameFolder: "Rinomina cartella"
deleteFolder: "Elimina cartella"
folder: "Cartella"
addFile: "Allega"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
@ -437,7 +438,6 @@ share: "Condividi"
notFound: "Non trovato"
notFoundDescription: "Nessuna pagina corrisponde all'URL indicata."
uploadFolder: "Destinazione caricamento predefinita"
cacheClear: "Svuota cache"
markAsReadAllNotifications: "Segna tutte le notifiche come lette"
markAsReadAllUnreadNotes: "Segna tutte le note come lette"
markAsReadAllTalkMessages: "Segna tutte le chat come lette"
@ -556,6 +556,8 @@ showInPage: "Visualizza in pagina"
popout: "Finestra pop-out"
volume: "Volume"
masterVolume: "Volume principale"
notUseSound: "Non emettere suoni"
useSoundOnlyWhenActive: "Emetti suoni solo quando CherryPick è in attività"
details: "Dettagli"
chooseEmoji: "Scegli emoji"
unableToProcess: "Impossibile compiere l'operazione"
@ -576,6 +578,10 @@ output: "Uscita"
script: "Script"
disablePagesScript: "Disabilita AiScript nelle pagine"
updateRemoteUser: "Aggiorna le informazioni dal profilo remoto"
unsetUserAvatar: "Rimozione foto profilo"
unsetUserAvatarConfirm: "Vuoi davvero rimuovere la foto profilo?"
unsetUserBanner: "Rimuovi intestazione profilo"
unsetUserBannerConfirm: "Vuoi davvero rimuovere l'intestazione dal profilo?"
deleteAllFiles: "Elimina tutti i file"
deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?"
removeAllFollowing: "Annulla tutti i follow"
@ -647,6 +653,7 @@ smtpSecure: "Usare SSL/TLS implicito per le connessioni SMTP"
smtpSecureInfo: "Disabilitare quando è attivo STARTTLS."
testEmail: "Verifica il funzionamento"
wordMute: "Filtri parole"
hardWordMute: "Filtro parole forte"
regexpError: "errore regex"
regexpErrorDescription: "Si è verificato un errore nell'espressione regolare alla riga {line} della parola muta {tab}:"
instanceMute: "Silenzia l'istanza"
@ -826,7 +833,7 @@ configure: "Imposta"
postToGallery: "Pubblicare nella galleria"
postToHashtag: "Pubblica a questo hashtag"
gallery: "Galleria"
recentPosts: "Le più recenti"
recentPosts: "Pubblicazioni recenti"
popularPosts: "Le più visualizzate"
shareWithNote: "Condividere in nota"
ads: "Banner"
@ -864,7 +871,7 @@ pubSub: "Publish/Subscribe del profilo"
lastCommunication: "La comunicazione più recente"
resolved: "Risolto"
unresolved: "Non risolto"
breakFollow: "Non farti più seguire"
breakFollow: "Interrompi follow"
breakFollowConfirm: "Vuoi davvero che questo profilo smetta di seguirti?"
itsOn: "Abilitato"
itsOff: "Disabilitato"
@ -1034,6 +1041,8 @@ resetPasswordConfirm: "Vuoi davvero ripristinare la password?"
sensitiveWords: "Parole esplicite"
sensitiveWordsDescription: "Imposta automaticamente \"Home\" alla visibilità delle Note che contengono una qualsiasi parola tra queste configurate. Puoi separarle per riga."
sensitiveWordsDescription2: "Gli spazi creano la relazione \"E\" tra parole (questo E quello). Racchiudere una parola nelle slash \"/\" la trasforma in Espressione Regolare."
hiddenTags: "Hashtag nascosti"
hiddenTagsDescription: "Impedire la visualizzazione del tag impostato nei trend. Puoi impostare più valori, uno per riga."
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
license: "Licenza"
unfavoriteConfirm: "Vuoi davvero rimuovere la preferenza?"
@ -1046,6 +1055,7 @@ enableChartsForRemoteUser: "Abilita i grafici per i profili remoti"
enableChartsForFederatedInstances: "Abilita i grafici per le istanze federate"
showClipButtonInNoteFooter: "Aggiungi il bottone Clip tra le azioni delle Note"
reactionsDisplaySize: "Grandezza delle reazioni"
limitWidthOfReaction: "Limita la larghezza delle reazioni e ridimensionale"
noteIdOrUrl: "ID della Nota o URL"
video: "Video"
videos: "Video"
@ -1128,7 +1138,7 @@ currentAnnouncements: "Annunci attuali"
pastAnnouncements: "Annunci precedenti"
youHaveUnreadAnnouncements: "Ci sono Annunci non letti"
useSecurityKey: "Per utilizzare la chiave di sicurezza o la passkey, segui le indicazioni del dispositivo"
replies: "Rispondi"
replies: "Risposte"
renotes: "Rinota"
loadReplies: "Leggi le risposte"
loadConversation: "Leggi la conversazione"
@ -1172,6 +1182,8 @@ useGroupedNotifications: "Mostra le notifiche raggruppate"
signupPendingError: "Si è verificato un problema durante la verifica del tuo indirizzo email. Potrebbe essere scaduto il collegamento temporaneo."
cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplicito."
doReaction: "Reagisci"
code: "Codice"
reloadRequiredToApplySettings: "Per applicare le impostazioni, occorre ricaricare."
_announcement:
forExistingUsers: "Solo ai profili attuali"
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
@ -1280,6 +1292,8 @@ _serverSettings:
shortName: "Abbreviazione"
shortNameDescription: "Un'abbreviazione o un nome comune che può essere visualizzato al posto del nome ufficiale lungo del server."
fanoutTimelineDescription: "Attivando questa funzionalità migliori notevolmente la capacità delle Timeline di collezionare Note, riducendo il carico sul database. Tuttavia, aumenterà l'impiego di memoria RAM per Redis. Disattiva se il tuo server ha poca RAM o la funzionalità è irregolare."
fanoutTimelineDbFallback: "Elaborazione dati alternativa"
fanoutTimelineDbFallbackDescription: "Attivando l'elaborazione alternativa, verrà interrogato ulteriormente il database se la timeline non è nella cache. \nDisattivando, si può ridurre ulteriormente il carico del server, evitando l'elaborazione alternativa, ma limitando l'intervallo recuperabile delle timeline."
_accountMigration:
moveFrom: "Migra un altro profilo dentro a questo"
moveFromSub: "Crea un alias verso un altro profilo remoto"
@ -1553,7 +1567,9 @@ _role:
assignTarget: "Modalità di assegnazione del ruolo"
descriptionOfAssignTarget: "<b>Manuale</b>: per assegnare manualmente questo ruolo ai profili.\n<b>Condizionale</b>: per assegnare o rimuovere automaticamente questo ruolo ai profili, a precise condizioni."
manual: "Manuale"
manualRoles: "Ruoli assegnati manualmente"
conditional: "Condizionale"
conditionalRoles: "Ruoli condizionati"
condition: "Condizioni"
isConditionalRole: "Questo è un ruolo condizionato"
isPublic: "Ruolo pubblico"
@ -1677,7 +1693,7 @@ _preferencesBackups:
list: "Elenco di impostazioni salvate in precedenza"
saveNew: "Nuovo salvataggio"
loadFile: "Carica da file"
apply: "Applicabile a questo dispositivo"
apply: "Applica a questo dispositivo"
save: "Sovrascrivi il backup"
inputName: "Inserire il nome del backup."
cannotSave: "Impossibile salvare."
@ -1891,6 +1907,14 @@ _sfx:
chatBg: "Chat (sfondo)"
antenna: "Ricezione dell'antenna"
channel: "Notifiche di canale"
reaction: "Quando seleziono una reazione"
_soundSettings:
driveFile: "Suoni del Drive"
driveFileWarn: "Seleziona file dal dispositivo"
driveFileTypeWarn: "Formato file non supportato"
driveFileTypeWarnDescription: "Per favore, scegli un file di tipo audio"
driveFileDurationWarn: "La durata dell'audio è troppo lunga"
driveFileDurationWarnDescription: "Scegliere un audio lungo potrebbe interferire con l'uso di CherryPick. Vuoi continuare lo stesso?"
_ago:
future: "Futuro"
justNow: "Adesso"
@ -1902,6 +1926,14 @@ _ago:
monthsAgo: "{n} mesi fa"
yearsAgo: "{n} anni fa"
invalid: "Niente da visualizzare"
_timeIn:
seconds: "Dopo {n} secondi"
minutes: "Dopo {n} minuti"
hours: "Dopo {n} ore"
days: "Dopo {n} giorni"
weeks: "Dopo {n} settimane"
months: "Dopo {n} mesi"
years: "Dopo {n} anni"
_time:
second: "s"
minute: "min"
@ -1946,7 +1978,7 @@ _permissions:
"read:favorites": "Visualizza i tuoi preferiti"
"write:favorites": "Gestisci i tuoi preferiti"
"read:following": "Vedi le informazioni di follow"
"write:following": "Seguire / Non seguire altri profili"
"write:following": "Following di altri profili"
"read:messaging": "Visualizzare la chat"
"write:messaging": "Gestire la chat"
"read:mutes": "Vedi i profili silenziati"
@ -2028,6 +2060,7 @@ _widgets:
_userList:
chooseList: "Seleziona una lista"
clicker: "Cliccaggio"
birthdayFollowings: "Chi nacque oggi"
_cw:
hide: "Nascondere"
show: "Continua la lettura..."
@ -2331,6 +2364,8 @@ _moderationLogTypes:
createAvatarDecoration: "Creazione decorazione della foto profilo"
updateAvatarDecoration: "Aggiornamento decorazione foto profilo"
deleteAvatarDecoration: "Eliminazione decorazione della foto profilo"
unsetUserAvatar: "Rimossa foto profilo"
unsetUserBanner: "Rimossa intestazione profilo"
_fileViewer:
title: "Dettagli del file"
type: "Tipo di file"
@ -2380,3 +2415,16 @@ _externalResourceInstaller:
_themeInstallFailed:
title: "Impossibile installare la variazione grafica"
description: "Si è verificato un impedimento durante l'installazione della variazione grafica. Per favore riprova e consulta la console di Javascript per ottenere dettagli aggiuntivi."
_dataSaver:
_media:
title: "Caricamento dei media"
description: "Impedire il caricamento automatico di immagini e video. Devi toccare le immagini o i video nascosti per caricarli."
_avatar:
title: "Immagine del profilo"
description: "Impedire l'animazione per l'immagine del profilo. Le immagini animate possono avere dimensioni file maggiori rispetto a quelle normali, puoi ridurre ulteriormente l'utilizzo dei dati."
_urlPreview:
title: "Anteprime delle URL"
description: "Impedire il caricamento delle anteprime URL."
_code:
title: "Codice evidenziato"
description: "Impedire che il codice sorgente sia automaticamente evidenziato. Evidenziare il codice richiede il caricamento di un file per ogni linguaggio. Puoi evidenziare soltanto il codice che intendi leggere e ridurre il traffico inutilizzato."

View file

@ -192,7 +192,12 @@ sensitive: "センシティブ"
add: "追加"
reaction: "リアクション"
reactions: "リアクション"
reactionSetting: "ピッカーに表示するリアクション"
emojiPicker: "絵文字ピッカー"
pinnedEmojisForReactionSettingDescription: "リアクション時にピン留め表示する絵文字を設定できます"
pinnedEmojisSettingDescription: "絵文字入力時にピン留め表示する絵文字を設定できます"
emojiPickerDisplay: "ピッカーの表示"
copyFromPinnedEmojisForReaction: "リアクション設定からコピーする"
copyFromPinnedEmojis: "絵文字設定からコピーする"
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
rememberNoteVisibility: "公開範囲を記憶する"
attachCancel: "添付取り消し"
@ -1942,7 +1947,7 @@ _registry:
createKey: "キーを作成"
_aboutMisskey:
about: "CherryPickは、Misskeyをベースに2021年から開発中のカスタマイズクライアントです。"
about: "CherryPickは、Misskeyをベースに2021年から開発中のカスタマイズオープンソースのソフトウェアです。"
contributors: "コントリビューター"
allContributors: "全てのコントリビューター"
source: "ソースコード"
@ -1955,7 +1960,6 @@ _aboutMisskey:
serverStatus: "サーバ状態"
donate: "ココネクトに寄付"
_cherrypick:
about: "このMisskeyはNoriDevによってカスタムされました"
translation: "CherryPickを翻訳"
donate: "CherryPickに寄付"
relayServer: "リレーサーバー"

File diff suppressed because it is too large Load diff

528
locales/ko-GS.yml Normal file
View file

@ -0,0 +1,528 @@
---
_lang_: "한국어(경상)"
headlineMisskey: "노트로 이언 네트워크"
introMisskey: "어서 오이소! CherryPick언 오픈소스 분산헹 마이크로 블로그 서비스입니다.\n노트럴 맨걸어서 지검 일나넌 일얼 노누던가 내 이바구럴 남한데 서 보이소.📡\n리액션 기넝서 남으 노트에 억수로 빠리게 답할 수 잇십니다.👍\n새롭운 세게럴 탐험해 보입시다.🚀"
poweredByMisskeyDescription: "{name} 서버넌 오픈소스 플랫폼 <b>CherryPick</b>으 서버 가운데 하나입니다."
monthAndDay: "{month}월 {day}일"
search: "찾기"
notifications: "알림"
username: "사용자 이럼"
password: "비밀번호"
forgotPassword: "비밀번호럴 잊엇뿟십니꺼?"
fetchingAsApObject: "연합서 찾아보고 잇어예"
ok: "예"
gotIt: "알것어예"
cancel: "아이예"
noThankYou: "뎃어예"
enterUsername: "사용자 이럼 서기"
renotedBy: "{user}님이 리노트햇십니다"
noNotes: "노트가 없십니다"
noNotifications: "알림이 없십니다"
instance: "서버"
settings: "설정"
notificationSettings: "알림 설정"
basicSettings: "기본 설정"
otherSettings: "다린 설정"
openInWindow: "창서 옐기"
profile: "프로필"
timeline: "타임라인"
noAccountDescription: "자기소개가 없십니다"
login: "로그인"
loggingIn: "로그인하고 잇어예"
logout: "로그아웃"
signup: "가입하기"
uploading: "올리고 잇어예"
save: "저장하기"
users: "사용자"
addUser: "사용자 옇기"
favorite: "질겨찾기"
favorites: "질겨찾기"
unfavorite: "질겨찾기서 어ᇝ애기"
favorited: "질겨찾기에 담앗십니다."
alreadyFavorited: "벌시로 질겨찾기에 담기 잇십니다."
cantFavorite: "질겨찾기에 몬 담았십니다."
pin: "프로필에 붙이기"
unpin: "프로필서 띠기"
copyContent: "내용 복사하기"
copyLink: "링크 복사하기"
copyLinkRenote: "리노트 링크 복사"
delete: "내삐리기"
deleteAndEdit: "내삐리고 새로 적기"
deleteAndEditConfirm: "요 노트럴 뭉캐고 새로 적십니꺼? 요 노트서 리액션하고 리노트, 답하기도 말캉 뭉캐집니다."
addToList: "리스트에 옇기"
addToAntenna: "안테나에 옇기"
sendMessage: "메시지 보내기"
copyRSS: "알에스에스 복사하기"
copyUsername: "사용자 이럼 복사하기"
copyUserId: "사용자 아이디 복사하기"
copyNoteId: "노트 아이디 복사하기"
copyFileId: "파일 아이디 복사하기"
copyFolderId: "폴더 아이디 복사하기"
copyProfileUrl: "프로필 주소 복사하기"
searchUser: "사용자 찾기"
reply: "답하기"
loadMore: "더 볼래예"
showMore: "더 볼래예"
showLess: "꺼기"
youGotNewFollower: "새 팔로워가 잇십니다"
receiveFollowRequest: "팔로잉 요청이 잇십니다"
followRequestAccepted: "팔로잉이 받아딜이젓십니다"
mention: "멘션"
mentions: "받언 멘션"
directNotes: "쪽지 서기"
importAndExport: "가오기하고 내가기"
import: "가오기"
export: "내가기"
files: "파일"
download: "내리받기"
driveFileDeleteConfirm: "{name} 파일얼 뭉캡니꺼? 요 파일얼 서넌 콘텐츠도 뭉캐집니다."
unfollowConfirm: "{name}님얼 고만 팔로잉합니꺼?"
exportRequested: "내가기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다. 요청이 껕나모 ‘드라이브’에 옇십니다."
importRequested: "가오기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다."
lists: "리스트"
noLists: "리스트가 없십니다"
note: "노트"
notes: "노트"
following: "팔로잉"
followers: "팔로워"
followsYou: "내럴 팔로잉합니다"
createList: "리스트 맨걸기"
manageLists: "리스트 간리하기"
error: "우짭니꺼"
somethingHappened: "먼가 일낫십니다"
retry: "다시 하기"
pageLoadError: "하멘 부리오기가 아이뎁니다."
pageLoadErrorDescription: "네트워크나 브라우저 캐시 때문일 깁니다. 캐시럴 뭉캐던가 쪼매 잇다 새로 해 주이소."
serverIsDead: "서버가 대답얼 아이합니다. 쪼매 잇다 새로 해 주이소."
youShouldUpgradeClient: "요 하멘얼 볼라먼 새로 곤치던가 새 버전으 클라이언트럴 받아 서 보이소."
enterListName: "리스트 이럼 서기"
privacy: "개인 정보"
makeFollowManuallyApprove: "팔로잉얼 하나석 받아딜이기"
defaultNoteVisibility: "기본 공개 범위"
follow: "팔로우"
followRequest: "팔로우 요청하기"
followRequests: "팔로우 요청"
unfollow: "팔로우 무루기"
followRequestPending: "팔로우 수락 지둘림"
enterEmoji: "이모지 서기"
renote: "리노트"
unrenote: "리노트 무루기"
renoted: "리노트럴 햇십니다."
cantRenote: "요 걸언 리노트럴 몬 합니다."
cantReRenote: "리노트넌 지럴 리노트 몬 합니다."
quote: "따오기"
inChannelRenote: "채널 안 리노트"
inChannelQuote: "채널 안 따오기"
pinnedNote: "프로필에 붙인 노트"
pinned: "프로필에 붙이기"
you: "나"
clickToShow: "누질라서 보기"
sensitive: "수ᇚ힛섭니다"
add: "옇기"
reaction: "반엉"
reactions: "반엉"
reactionSetting: "모엄함서 포시할 반엉"
reactionSettingDescription2: "꺼시서 두고, 누질라서 뭉캐고, +’럴 누질라서 옇십니다."
rememberNoteVisibility: "공개 범위럴 기억하기"
attachCancel: "붙임 빼기"
markAsSensitive: "수ᇚ힘 설정"
unmarkAsSensitive: "수ᇚ힘 무루기"
enterFileName: "파일 이럼 서기"
mute: "수ᇚ후기"
unmute: "수ᇚ훈 거 무루기"
renoteMute: "리노트 수ᇚ후기"
renoteUnmute: "리노트 수ᇚ훈 거 무루기"
block: "차단하기"
unblock: "차단 무루기"
suspend: "얼우기"
unsuspend: "얼우기 풀기"
blockConfirm: "차단합니꺼?"
unblockConfirm: "차단얼 무룹니꺼?"
suspendConfirm: "얼웁니꺼?"
unsuspendConfirm: "얼운 거 풉니꺼?"
selectList: "리스트 개리기"
editList: "리스트 적기"
selectChannel: "채널 개리기"
selectAntenna: "안테나 개리기"
editAntenna: "안테나 적기"
selectWidget: "위젯 개리기"
editWidgets: "위젯 적기"
editWidgetsExit: "고마 적기"
customEmojis: "사용자 지정 이모지"
emoji: "이모지"
emojis: "이모지"
emojiName: "이모지 이럼"
emojiUrl: "이모지 주소"
addEmoji: "이모지 옇기"
settingGuide: "개않언 설정"
cacheRemoteFiles: "웬겍 파일 캐시하기"
cacheRemoteFilesDescription: "요 설정얼 키모 웬겍 파일얼 요 서버으 스토리지에 캐시합니다. 미디어가 사게 비이지먼 서버으 스토리지럴 마이 섭니다. 웬겍 사용자가 얼매나 캐시럴 둘 긴가넌 고 옉할으 드라이브 크기 제한마중 다립니다. 요 제한얼 넘구모 엣날 파일버터 캐시서 뭉캐지서 링크가 뎁니다. 요 설정얼 꺼모 웬겍 파일언 첨버터 링크가 뎁니다. 이미지으 섬네일얼 맨걸던 사용자으 개인 정보럴 징키던 할라먼 default.yml서 proxyRemoteFiles럴 ture로 하입시다."
youCanCleanRemoteFilesCache: "파일 간리으 🗑️ 모냥얼 누질리모 캐시럴 말캉 뭉캘 수 잇십니다."
cacheRemoteSensitiveFiles: "웬겍으 수ᇚ힌 파일얼 캐시하기"
cacheRemoteSensitiveFilesDescription: "요 설정얼 꺼모 웬겍 수ᇚ힌 파일이 캐시하지 아이하고 바리 링크합니다."
flagAsBot: "자동 게정입니다"
flagAsBotDescription: "요 게정얼 프로그램서 설라먼 키야 합니다. 키모 다런 개발자가 반엉얼 끋없이 데풀이하지 몬 하게 도아 줄 수 잇고 CherryPick으 시스템서 자동 게정이 뎁니다."
flagAsCat: "애웅애웅애웅애웅!"
flagAsCatDescription: "애옹?"
flagShowTimelineReplies: "타임라인서 노트으 답하기 보기"
flagShowTimelineRepliesDescription: "키모 타임라인서 다런 사용자덜으 답하기도 봅니다."
autoAcceptFollowed: "팔로잉하넌 사용자으 팔로잉 요청 바리 받아딜이기"
addAccount: "게정 옇기"
reloadAccountsList: "게정 리스트으 정보 새로 바꾸기"
loginFailed: "로그인이 아이뎁니다."
showOnRemote: "웬겍서 보기"
general: "일반"
wallpaper: "벡지"
setWallpaper: "벡지 설정"
removeWallpaper: "벡지 뭉캐기"
searchWith: "찾기: {q}"
youHaveNoLists: "리스트가 없십니다"
followConfirm: "{name}님얼 팔로잉합니꺼?"
proxyAccount: "프락시 게정"
proxyAccountDescription: "프락시 게정언 턱벨한 조겐서 웬겍 팔로잉얼 하넌 게정입니다. 사용자가 웬겍 사용자럴 리스트에 옇얼 때 리스트에 옇언 사용자럴 누도 팔로잉 아이하모 할동이 서버로 아이 오니께 요 게정이 아인 프락시 게정얼 팔로잉하게 합니다."
host: "호스트 이럼"
selectUser: "사용자 개리기"
recipient: "받넌 사람"
annotation: "주석"
federation: "옌합"
instances: "서버"
registeredAt: "첫 발겐"
latestRequestReceivedAt: "막죽에 받언 요청"
latestStatus: "막죽 상태"
storageUsage: "스토리지 사용량"
charts: "차트"
perHour: "한 시간마중"
perDay: "하리마중"
stopActivityDelivery: "할동 고마 보내기"
blockThisInstance: "요 서버 차단하기"
silenceThisInstance: "서버 수ᇚ후기"
operations: "동작"
software: "소프트웨어"
version: "버전"
metadata: "메타데이터"
withNFiles: "파일 {n}개"
monitor: "모니터"
jobQueue: "작업 대기옐"
cpuAndMemory: "시피유하고 메모리"
network: "네트워크"
disk: "디스크"
instanceInfo: "서버 정보"
statistics: "통게"
clearQueue: "대기옐 비우기"
clearQueueConfirmTitle: "대기옐얼 비웁니꺼?"
clearQueueConfirmText: "대기옐에 잇넌 걸얼 아이 보냅니다. 흐이 요 동작언 할 필요가 없십니다."
clearCachedFiles: "캐시 비우기"
clearCachedFilesConfirm: "캐시한 웬겍 파일얼 말캉 뭉캡니꺼?"
blockedInstances: "차단한 서버"
blockedInstancesDescription: "차단할라넌 서버으 호스트럴 줄 바꿈해서로 비이 줍니다. 차단한 서버넌 요 서버하고 교류 몬 합니다."
silencedInstances: "수ᇚ훈 서버"
silencedInstancesDescription: "수ᇚ훌라넌 서버으 호스트럴 줄 바꿈해서로 비이 줍니다. 수ᇚ훈 서버으 게정언 말캉 ‘수ᇚ후기’가 데서 팔로잉 요청만 데고 팔로워가 아인 로컬 게정서 멘션얼 몬 합니다. 차단한 서버넌 상간 없십니다."
muteAndBlock: "수ᇚ훔하고 차단"
mutedUsers: "수ᇚ훈 사용자"
blockedUsers: "차단한 사용자"
noUsers: "사용자가 없십니다"
editProfile: "프로필 적기"
noteDeleteConfirm: "요 노트럴 뭉캡니꺼?"
pinLimitExceeded: "더 몬 붙입니다"
intro: "CherryPick럴 다 깔앗십니다! 간리자 게정얼 맨걸어 보입시다."
done: "햇어예"
processing: "처리하고 잇어예"
preview: "미리보기"
default: "기본값"
defaultValueIs: "기본값: {value}"
noCustomEmojis: "이모지가 없십니다"
noJobs: "작업이 없십니다"
federating: "옌합하고 잇어예"
blocked: "차단햇어예"
suspended: "고만 보내예"
all: "말캉"
subscribing: "구독하고 잇어예"
publishing: "보내고 잇어예"
notResponding: "답이 없어예"
instanceFollowing: "서버으 팔로잉"
instanceFollowers: "서버으 팔로워"
instanceUsers: "서버으 사용자"
changePassword: "비밀번호 바꾸기"
security: "보안"
retypedNotMatch: "선 거가 안 맞십니다."
currentPassword: "지검 비밀번호"
newPassword: "새 비밀번호"
newPasswordRetype: "새 비밀번호 다시 서기"
attachFile: "파일 붙이기"
more: "더 볼래예!"
featured: "인기"
usernameOrUserId: "사용자 이럼이나 사용자 아이디"
noSuchUser: "사용자럴 몬 찾앗십니다"
lookup: "찾아보기"
announcements: "공지 걸"
imageUrl: "이미지 주소"
remove: "내삐리기"
removed: "뭉캣십니다"
removeAreYouSure: "{x}(얼)럴 뭉캡니꺼?"
deleteAreYouSure: "{x}(얼)럴 뭉캡니꺼?"
resetAreYouSure: "아시로 데돌립니꺼?"
saved: "저장햇십니다"
messaging: "대화"
upload: "올리기"
keepOriginalUploading: "온본 두기"
keepOriginalUploadingDescription: "이미지럴 올릴 때 온본얼 고대로 둡니다. 꺼모 올릴 때 브라우저서 웹 공개 이미지럴 맨겁니다."
fromDrive: "드라이브서"
fromUrl: "주소서"
uploadFromUrl: "주소 올리기"
uploadFromUrlDescription: "올리기할라넌 파일으 주소"
uploadFromUrlRequested: "올리기럴 요청햇십니다"
uploadFromUrlMayTakeTime: "올리기가 껕날라먼 시간이 쪼매 걸릴 깁니다."
explore: "살펴보기"
messageRead: "이럿어예"
noMoreHistory: "요카마 엣날 기록이 없십니다"
startMessaging: "대화하기"
nUsersRead: "{n}멩이 이럿십니다"
agreeTo: "{0}에 동이하기"
agree: "동이합니다"
agreeBelow: "밑으 내용에 동이합니다"
basicNotesBeforeCreateAccount: "주이할 내용"
termsOfService: "이용 약간"
start: "시작하기"
home: "덜머리"
remoteUserCaution: "웬겍 사용자넌 정보가 학실하지 아이할 수 잇십니다."
activity: "할동"
images: "이미지"
image: "이미지"
birthday: "생일"
yearsOld: "{age}살"
registeredDate: "맨건 날"
location: "장소"
theme: "테마"
themeForLightMode: "볽엄 모드서 설 테마"
themeForDarkMode: "어덥엄 모드서 설 테마"
light: "볽엄"
dark: "어덥엄"
lightThemes: "볽언 테마"
darkThemes: "어덥언 테마"
syncDeviceDarkMode: "드라이브으 어덥엄 모드하고 같구로 마추기"
drive: "드라이브"
fileName: "파일 이럼"
selectFile: "파일 개리기"
selectFiles: "파일 개리기"
selectFolder: "폴더 개리기"
selectFolders: "폴더 개리기"
renameFile: "파일 이럼 바꾸기"
folderName: "폴더 이럼"
createFolder: "폴더 맨걸기"
renameFolder: "폴더 이럼 바꾸기"
deleteFolder: "폴더 뭉캐기"
folder: "폴더"
addFile: "파일 옇기"
emptyDrive: "드라이브가 비잇십니다"
emptyFolder: "폴더가 비잇십니다"
unableToDelete: "몬 뭉캡니다"
inputNewFileName: "새 파일 이럼얼 서 보이소"
inputNewDescription: "새 설멩얼 서 보이소"
inputNewFolderName: "새 폴더 이럼얼 서 보이소"
circularReferenceFolder: "엚길 폴더으 아래 폴더입니다."
hasChildFilesOrFolders: "요 폴더넌 아이 비잇어니께 몬 뭉캡니다."
copyUrl: "주소 복사하기"
rename: "이럼 바꾸기"
avatar: "아바타"
banner: "배너"
displayOfSensitiveMedia: "수ᇚ힌 옝상물 보기"
whenServerDisconnected: "서버하고 옌겔이 껂기모"
disconnectedFromServer: "서버하고 옌겔이 껂깃십니다"
reload: "새로곤침"
doNothing: "무시하기"
reloadConfirm: "새로곤침합니까?"
watch: "간심 갖기"
unwatch: "간심 고마 갖기"
accept: "받기"
reject: "아이 받기"
normal: "일반"
instanceName: "서버 이럼"
instanceDescription: "서버 소개"
maintainerName: "간리자 이럼"
maintainerEmail: "간리자 전자우펜"
tosUrl: "이용 약간 주소"
thisYear: "올개"
thisMonth: "요달"
today: "오올"
dayX: "{day}일"
monthX: "{month}월"
yearX: "{year}년"
pages: "바닥"
integration: "옌겔"
connectService: "옌겔하기"
disconnectService: "껂기"
enableLocalTimeline: "로컬 타임라인 키기"
enableGlobalTimeline: "글로벌 타임라인 키기"
disablingTimelinesInfo: "요 타임라인얼 꺼도 간리자하고 중재자넌 고대로 설 수 잇십니다."
registration: "맨걸기"
enableRegistration: "누라도 새로 맨걸 수 잇거로 하기"
invite: "초대하기"
driveCapacityPerLocalAccount: "로컬 사용자 하나마중 드라이브 커기"
driveCapacityPerRemoteAccount: "웬겍 사용자 하나마중 드라이브 커기"
inMb: "메가바이트 단이"
bannerUrl: "배너 이미지 주소"
backgroundImageUrl: "배겡 이미지 주소"
basicInfo: "기본 정보"
pinnedUsers: "붙인 사용자"
pinnedUsersDescription: "‘살펴보기’서 붙일라넌 사용자럴 줄 바꿈해서로 적십니다."
pinnedPages: "붙인 바닥"
pinnedPagesDescription: "서버으 대문서 붙일라넌 바닥으 겡로럴 줄 바꿈해서로 적십니다."
pinnedClipId: "붙일 클립으 아이디"
pinnedNotes: "프로필에 붙인 노트"
hcaptcha: "에이치캡차"
enableHcaptcha: "에이치캡차 키기"
hcaptchaSiteKey: "사이트키"
hcaptchaSecretKey: "시크릿키"
recaptcha: "리캡차"
enableRecaptcha: "리캡차 키기"
recaptchaSiteKey: "사이트키"
recaptchaSecretKey: "시크릿키"
turnstile: "턴스타일"
enableTurnstile: "턴스타일 키기"
turnstileSiteKey: "사이트키"
turnstileSecretKey: "시크릿키"
avoidMultiCaptchaConfirm: "오만 캡차럴 서모 간섭이 잇얼 깁니다. 다린 캡차를 껍니까? ‘아이예’럴 누질리모 오만 캡차럴 키 둘 수도 잇십니다."
antennas: "안테나"
manageAntennas: "안테나 간리"
name: "이럼"
antennaSource: "받얼 소스"
antennaKeywords: "받얼 검색어"
antennaExcludeKeywords: "수ᇚ훌 검색어"
antennaKeywordsDescription: "띠어서기럴 하모 ‘거라고’가 데고 줄 바꿈얼 하모 ‘아이먼’이 뎁니다"
notifyAntenna: "새 노트럴 알리기"
withFileAntenna: "파일이 붙언 노트마"
enableServiceworker: "브라우저서 알림 포시럴 키기"
antennaUsersDescription: "사용자 이럼얼 줄 바꿈해서로 섭니다"
caseSensitive: "대소문자럴 구벨하기"
withReplies: "답하기도 옇기"
connectedTo: "요 게정하고 옌겔데어 잇십니다"
notesAndReplies: "걸하고 답걸"
withFiles: "파일에 붙이기"
silence: "수ᇚ후기"
silenceConfirm: "수ᇚ훕니꺼?"
unsilence: "수ᇚ후기 어ᇝ애기"
unsilenceConfirm: "수ᇚ후기럴 어ᇝ앱니꺼?"
popularUsers: "소문난 사용자"
recentlyUpdatedUsers: "얼마 전에 걸 선 사용자"
recentlyRegisteredUsers: "얼마 전에 맨건 사용자"
recentlyDiscoveredUsers: "얼마 전에 찾언 사용자"
exploreUsersCount: "사용자 {count}멩이 잇십니다."
exploreFediverse: "옌합우주 탐험하기"
popularTags: "소문난 태그"
userList: "리스트"
about: "정보"
aboutMisskey: "CherryPick넌예"
administrator: "간리자"
token: "학인 코드"
2fa: "두 단게 정멩"
setupOf2fa: "두 단게 정멩 설정"
totp: "정멩 앱"
totpDescription: "정멩 앱서 단헤용 비밀번호 서기"
moderator: "중재자"
moderation: "중재"
moderationNote: "중재 노트"
addModerationNote: "중재 노트 옇기"
moderationLogs: "중재 일지"
nUsersMentioned: "{n}멩이 이바구하고 잇어예"
securityKeyAndPasskey: "보안키·패스키"
securityKey: "보안키"
invites: "초대하기"
invitations: "초대하기"
language: "언어"
manage: "간리"
smtpHost: "호스트 이럼"
smtpUser: "사용자 이럼"
smtpPass: "비밀번호"
clearCache: "캐시 비우기"
unlikeConfirm: "좋네예럴 무룹니꺼?"
info: "정보"
user: "사용자"
administration: "간리"
on: "킴"
off: "껌"
searchByGoogle: "찾기"
tenMinutes: "십 분"
oneHour: "한 시간"
oneDay: "하리"
oneWeek: "한 주"
oneMonth: "한 달"
file: "파일"
tools: "도구"
like: "좋네예!"
unlike: "좋네예 무루기"
numberOfLikes: "좋네예 수"
roles: "옉할"
role: "옉할"
noRole: "옉할이 없십니다"
thisPostMayBeAnnoyingCancel: "아이예"
likeOnly: "좋네예마"
icon: "아바타"
replies: "답하기"
renotes: "리노트"
_gallery:
liked: "좋네예한 걸"
like: "좋네예!"
unlike: "좋네예 무루기"
_email:
_follow:
title: "새 팔로워가 잇십니다"
_theme:
keys:
mention: "멘션"
_sfx:
note: "노트"
notification: "알림"
_2fa:
renewTOTPCancel: "뎃어예"
_widgets:
profile: "프로필"
instanceInfo: "서버 정보"
notifications: "알림"
timeline: "타임라인"
activity: "할동"
federation: "옌합"
jobQueue: "작업 대기옐"
_userList:
chooseList: "리스트 개리기"
_cw:
show: "더 볼래예"
_visibility:
home: "덜머리"
followers: "팔로워"
_profile:
name: "이럼"
username: "사용자 이럼"
_exportOrImport:
followingList: "팔로잉"
muteList: "수ᇚ후기"
blockingList: "차단하기"
userLists: "리스트"
_charts:
federation: "옌합"
_timelines:
home: "덜머리"
_pages:
like: "좋네예"
unlike: "좋네예 무루기"
blocks:
image: "이미지"
_notification:
youWereFollowed: "새 팔로워가 잇십니다"
_types:
follow: "팔로잉"
mention: "멘션"
quote: "따오기"
reaction: "반엉"
_actions:
reply: "답하기"
_deck:
_columns:
notifications: "알림"
tl: "타임라인"
antenna: "안테나"
list: "리스트"
mentions: "받언 멘션"
_webhookSettings:
name: "이럼"
_moderationLogTypes:
suspend: "얼우기"

View file

@ -66,11 +66,11 @@ cherrypickUpdatedCacheClear: "테마 및 색상, 로케일 등의 변경 사항
cherrypickUpdatedCacheClearLater: "나중에 캐시를 지우려면 <b>설정</b> - <b>캐시 지우기</b>에서 할 수 있어요!"
headlineMisskey: "노트로 연결되는 네트워크"
introMisskey: "어서오세요! CherryPick은 오픈 소스 분산형 마이크로 블로그 서비스에요.\n'노트'를 작성해서 지금 일어나고 있는 일을 공유하거나, 나만의 이야기를 모두에게 발신할 수 있어요.📡\n'리액션' 기능으로 친구의 노트에 총알같이 반응을 추가할 수도 있답니다!👍\n새로운 세계를 탐험해 보세요!🚀"
poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼 <b>CherryPick</b>을 사용한 서버 중 하나예요."
poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼 <b>CherryPick</b> 서버 중 하나예요."
monthAndDay: "{month}월 {day}일"
search: "검색"
notifications: "알림"
username: "유저명"
username: "사용자 이름"
password: "비밀번호"
forgotPassword: "비밀번호를 잊었어요!"
fetchingAsApObject: "연합에서 조회 중"
@ -78,7 +78,7 @@ ok: "확인"
gotIt: "알겠어요"
cancel: "취소"
noThankYou: "나중에"
enterUsername: "유저명 입력"
enterUsername: "사용자 이름 입력"
renotedBy: "{user}님이 리노트 했어요"
noNotes: "노트가 없어요"
noNotifications: "표시할 알림이 없어요"
@ -99,8 +99,8 @@ logoutAllConfirm: "이 기기에 추가한 계정을 전부 로그아웃 할까
signup: "회원 가입"
uploading: "업로드하고 있어요!"
save: "저장"
users: "유저"
addUser: "유저 추가"
users: "사용자"
addUser: "사용자 추가"
favorite: "즐겨찾기"
favorites: "즐겨찾기"
unfavorite: "즐겨찾기에서 제거"
@ -121,8 +121,8 @@ addToList: "리스트에 추가"
addToAntenna: "안테나에 추가"
sendMessage: "메시지 보내기"
copyRSS: "RSS 복사"
copyUsername: "유저명 복사"
copyUserId: "유저 ID 복사"
copyUsername: "사용자 이름 복사"
copyUserId: "사용자 ID 복사"
copyNoteId: "노트 ID 복사"
copyFileId: "파일 ID 복사"
copyFolderId: "폴더 ID 복사"
@ -143,7 +143,7 @@ import: "가져오기"
export: "내보내기"
files: "파일"
download: "다운로드"
driveFileDeleteConfirm: "파일 \"{name}\" 을 삭제할까요? 노트는 삭제되지 않지만, 이 파일을 사용한 일부 콘텐츠가 삭제될 수 있어요."
driveFileDeleteConfirm: "'{name}' 파일을 삭제할까요? 노트는 삭제되지 않지만, 이 파일을 사용한 일부 콘텐츠가 삭제될 수 있어요."
unfollowConfirm: "{name}님을 언팔로우 할까요?"
exportRequested: "내보내기를 요청했어요! 이 작업은 약간의 시간이 필요할 수 있어요. 내보내기가 완료되면 \"드라이브\"에 추가돼요."
importRequested: "가져오기를 요청했어요! 이 작업에는 약간의 시간이 필요할 수 있어요."
@ -201,7 +201,7 @@ unmarkAsSensitive: "열람 주의 해제"
enterFileName: "파일명 입력"
mute: "뮤트"
unmute: "뮤트 해제"
renoteMute: "리노트 뮤트"
renoteMute: "리노트 뮤트하기"
renoteUnmute: "리노트 뮤트 해제"
block: "차단"
unblock: "차단 해제"
@ -227,7 +227,7 @@ emojiUrl: "이모지 URL"
addEmoji: "이모지 추가"
settingGuide: "추천 설정"
cacheRemoteFiles: "리모트 파일을 캐시"
cacheRemoteFilesDescription: "이 설정을 활성화하면 리모트 파일을 이 서버의 저장소에 캐시해요. 그에 따라 미디어가 표시되는 속도가 증가하지만, 서버의 저장 공간을 많이 사용할 수도 있어요. 리모트 유저의 미디어를 얼마나 보관할 지는 '역할'의 '드라이브 용량 제한'에 따라 결정되며, 정해진 용량을 초과할 경우, 오래된 파일부터 차례대로 삭제하고 링크로 전환돼요. \n비활성화하면 리모트 파일을 직접 링크하며, 이미지 썸네일 생성 및 유저 프라이버시 보호를 위해 default.yml에서 proxyRemoteFiles를 true로 설정하는 것을 권장해요."
cacheRemoteFilesDescription: "이 설정을 활성화하면 리모트 파일을 이 서버의 저장소에 캐시해요. 그에 따라 미디어가 표시되는 속도가 증가하지만, 서버의 저장 공간을 많이 사용할 수도 있어요. 리모트 사용자의 미디어를 얼마나 보관할 지는 '역할'의 '드라이브 용량 제한'에 따라 결정되며, 정해진 용량을 초과할 경우, 오래된 파일부터 차례대로 삭제하고 링크로 전환돼요. \n비활성화하면 리모트 파일을 직접 링크하며, 이미지 썸네일 생성 및 사용자 프라이버시 보호를 위해 default.yml에서 proxyRemoteFiles를 true로 설정하는 것을 권장해요."
youCanCleanRemoteFilesCache: "파일 관리 화면의 🗑️ 버튼을 눌러 모든 캐시를 삭제할 수 있어요."
cacheRemoteSensitiveFiles: "리모트의 민감한 파일을 캐시"
cacheRemoteSensitiveFilesDescription: "이 설정을 비활성화하면 리모트의 민감한 파일은 캐시하지 않고 리모트에서 직접 가져오도록 설정해요."
@ -236,8 +236,8 @@ flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우
flagAsCat: "나는 고양이다냥"
flagAsCatDescription: "이 계정이 고양이라면 활성화해 달라냥"
flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기"
flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 유저 간의 답글을 표시해요."
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 사용자 간의 답글을 표시해요."
autoAcceptFollowed: "팔로우 중인 사용자로부터의 팔로우 요청을 자동 수락"
addAccount: "계정 추가"
reloadAccountsList: "계정 리스트 정보 갱신"
loginFailed: "로그인에 실패했어요.."
@ -250,9 +250,9 @@ searchWith: "검색: {q}"
youHaveNoLists: "리스트가 없어요"
followConfirm: "{name}님을 팔로우 하시겠어요?"
proxyAccount: "프록시 계정"
proxyAccountDescription: "프록시 계정은 유저의 리모트 팔로우를 대행하는 계정이에요. 예를 들면, 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 서버로 배달되지 않기 때문에 대신 프록시 계정이 해당 유저를 팔로우해서 문제를 해결해요."
proxyAccountDescription: "프록시 계정은 사용자의 리모트 팔로우를 대행하는 계정이에요. 예를 들면, 리모트 사용자를 리스트에 넣었을 때, 리스트에 들어간 사용자를 아무도 팔로우한 적이 없다면 액티비티가 서버로 배달되지 않기 때문에 대신 프록시 계정이 해당 사용자를 팔로우해서 문제를 해결해요."
host: "호스트"
selectUser: "유저 선택"
selectUser: "사용자 선택"
recipient: "수신인"
annotation: "내용에 대한 주석"
federation: "연합"
@ -287,10 +287,10 @@ clearCachedFilesConfirm: "캐시된 리모트 파일을 모두 삭제할까요?"
blockedInstances: "차단된 서버"
blockedInstancesDescription: "차단하려는 서버의 호스트 이름을 줄바꿈으로 구분하여 설정해요. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 돼요."
silencedInstances: "사일런스한 서버"
silencedInstancesDescription: "사일런스하려는 서버의 호스트명을 한 줄에 하나씩 입력해 주세요. 사일런스된 서버에 소속된 유저는 모두 '사일런스'된 상태로 취급되며, 이 서버로부터의 팔로우가 프로필 설정과 무관하게 승인제로 변경되고, 팔로워가 아닌 로컬 유저에게는 멘션할 수 없게 돼요. 정지된 서버에는 적용되지 않아요."
silencedInstancesDescription: "사일런스하려는 서버의 호스트명을 한 줄에 하나씩 입력해 주세요. 사일런스된 서버에 소속된 사용자는 모두 '사일런스'된 상태로 취급되며, 이 서버로부터의 팔로우가 프로필 설정과 무관하게 승인제로 변경되고, 팔로워가 아닌 로컬 사용자에게는 멘션할 수 없게 돼요. 정지된 서버에는 적용되지 않아요."
muteAndBlock: "뮤트 및 차단"
mutedUsers: "뮤트한 유저"
blockedUsers: "차단한 유저"
mutedUsers: "뮤트한 사용자"
blockedUsers: "차단한 사용자"
noUsers: "아무도 없어요"
editProfile: "프로필 수정"
noteDeleteConfirm: "이 노트를 삭제할까요?"
@ -312,17 +312,17 @@ publishing: "배포 중"
notResponding: "응답 없음"
instanceFollowing: "서버의 팔로잉"
instanceFollowers: "서버의 팔로워"
instanceUsers: "서버의 유저"
instanceUsers: "서버의 사용자"
changePassword: "비밀번호 변경"
security: "보안"
retypedNotMatch: "비밀번호가 일치하지 않아요."
currentPassword: "현재 비밀번호"
newPassword: "새 비밀번호"
newPasswordRetype: "새 비밀번호 (재입력)"
newPasswordRetype: "새 비밀번호(재입력)"
attachFile: "파일 첨부"
more: "더 보기!"
featured: "하이라이트"
usernameOrUserId: "유저명이나 ID"
usernameOrUserId: "사용자 이름이나 ID"
noSuchUser: "연합우주 어디에서도 찾을 수 없었어요.."
lookup: "조회"
announcements: "공지사항"
@ -356,7 +356,7 @@ basicNotesBeforeCreateAccount: "기본적인 주의사항"
termsOfService: "이용 약관"
start: "시작하기"
home: "홈"
remoteUserCaution: "리모트 유저에요! 인스턴스와 정보가 일치하지 않을 수 있어요."
remoteUserCaution: "리모트 사용자에요! 인스턴스와 정보가 일치하지 않을 수 있어요."
activity: "활동"
images: "이미지"
image: "이미지"
@ -379,7 +379,7 @@ selectFiles: "파일 선택"
selectFolder: "폴더 선택"
selectFolders: "폴더 선택"
renameFile: "파일 이름 변경"
folderName: "폴더"
folderName: "폴더 이름"
createFolder: "폴더 만들기"
renameFolder: "폴더 이름 바꾸기"
deleteFolder: "폴더 삭제"
@ -403,8 +403,8 @@ disconnectedFromServer: "접속이 끊어졌어요!"
reload: "새로고침"
doNothing: "무시하기"
reloadConfirm: "페이지를 다시 불러올까요?"
watch: "지켜보기"
unwatch: "지켜보기 해제"
watch: "구독"
unwatch: "구독 해제"
accept: "허가"
reject: "거부"
normal: "일반"
@ -414,7 +414,7 @@ maintainerName: "관리자 이름"
maintainerEmail: "관리자 이메일"
tosUrl: "이용약관 URL"
thisYear: "올해"
thisMonth: "이달"
thisMonth: "이달"
today: "오늘"
dayX: "{day}일"
monthX: "{month}월"
@ -429,14 +429,14 @@ disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리
registration: "등록"
enableRegistration: "신규 회원가입 활성화"
invite: "초대"
driveCapacityPerLocalAccount: "로컬 유저 한 명당 드라이브 용량"
driveCapacityPerRemoteAccount: "리모트 유저 한 명당 드라이브 용량"
driveCapacityPerLocalAccount: "로컬 사용자 한 명당 드라이브 용량"
driveCapacityPerRemoteAccount: "리모트 사용자 한 명당 드라이브 용량"
inMb: "메가바이트 단위"
bannerUrl: "배너 이미지 URL"
backgroundImageUrl: "배경 이미지 URL"
basicInfo: "기본 정보"
pinnedUsers: "고정된 유저"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적어주세요."
pinnedUsers: "고정된 사용자"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 사용자를 한 줄에 한 명씩 적어주세요."
pinnedPages: "고정한 페이지"
pinnedPagesDescription: "서버의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적어주세요."
pinnedClipId: "고정할 클립의 ID"
@ -464,7 +464,7 @@ antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으
notifyAntenna: "새로운 노트를 알림"
withFileAntenna: "파일이 첨부된 노트만"
enableServiceworker: "ServiceWorker 사용"
antennaUsersDescription: "유저명을 한 줄에 한 명씩 적어주세요"
antennaUsersDescription: "사용자 이름을 한 줄에 한 명씩 적어주세요"
caseSensitive: "대소문자를 구분"
withReplies: "답글 포함"
connectedTo: "이 계정에 연결되어 있어요"
@ -474,11 +474,11 @@ silence: "사일런스"
silenceConfirm: "이 계정을 사일런스로 설정할까요?"
unsilence: "사일런스 해제"
unsilenceConfirm: "이 계정의 사일런스를 해제할까요?"
popularUsers: "인기 유저"
recentlyUpdatedUsers: "최근 활동한 유저"
recentlyRegisteredUsers: "최근 가입한 유저"
recentlyDiscoveredUsers: "최근 발견한 유저"
exploreUsersCount: "{count}명의 유저가 있어요"
popularUsers: "인기 사용자"
recentlyUpdatedUsers: "최근 활동한 사용자"
recentlyRegisteredUsers: "최근 가입한 사용자"
recentlyDiscoveredUsers: "최근 발견한 사용자"
exploreUsersCount: "{count}명의 사용자가 있어요"
exploreFediverse: "연합우주 탐색"
popularTags: "인기 태그"
userList: "리스트"
@ -525,7 +525,7 @@ invites: "초대"
groupName: "그룹명"
members: "멤버"
transfer: "양도"
messagingWithUser: "유저와 대화하기"
messagingWithUser: "사용자와 대화하기"
messagingWithGroup: "그룹끼리 대화하기"
title: "제목"
text: "텍스트"
@ -554,7 +554,7 @@ strongPassword: "강한 비밀번호"
passwordMatched: "똑같아요!"
passwordNotMatched: "어라? 비밀번호가 다른 것 같아요"
signinWith: "{x}로 로그인"
signinFailed: "로그인할 수 없었어요. 사용자과 비밀번호를 다시 확인해 주세요."
signinFailed: "로그인할 수 없었어요. 사용자 이름과 비밀번호를 다시 확인해 주세요."
or: "혹은"
language: "언어"
uiLanguage: "UI 표시 언어"
@ -635,6 +635,8 @@ showInPage: "페이지로 보기"
popout: "새 창으로 열기"
volume: "음량"
masterVolume: "마스터 볼륨"
notUseSound: "사운드를 출력하지 않음"
useSoundOnlyWhenActive: "CherryPick이 활성화된 경우에만 사운드를 출력해요"
details: "자세히"
chooseEmoji: "이모지 선택"
unableToProcess: "작업을 완료할 수 없었어요.."
@ -654,7 +656,11 @@ scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을
output: "출력"
script: "스크립트"
disablePagesScript: "Pages 에서 AiScript 를 사용하지 않음"
updateRemoteUser: "리모트 유저 정보 갱신"
updateRemoteUser: "리모트 사용자 정보 갱신"
unsetUserAvatar: "아바타 제거"
unsetUserAvatarConfirm: "아바타를 제거할까요?"
unsetUserBanner: "배너 제거"
unsetUserBannerConfirm: "배너를 제거할까요?"
deleteAllFiles: "모든 파일 삭제"
deleteAllFilesConfirm: "모든 파일을 삭제할까요?"
removeAllFollowing: "모든 팔로잉 해제"
@ -719,13 +725,14 @@ emailAddress: "메일 주소"
smtpConfig: "SMTP 서버 설정"
smtpHost: "호스트"
smtpPort: "포트"
smtpUser: "유저명"
smtpUser: "사용자 이름"
smtpPass: "비밀번호"
emptyToDisableSmtpAuth: "SMTP 인증을 사용하지 않으려면 공란으로 비워주세요."
smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용"
smtpSecureInfo: "STARTTLS 사용 시에는 해제해야 해요."
testEmail: "이메일 전송 테스트"
wordMute: "단어 뮤트"
hardWordMute: "단어 뮤트(하드)"
regexpError: "정규 표현식 오류"
regexpErrorDescription: "{tab}단어 뮤트 {line}행의 정규 표현식에 오류가 발생했어요:"
instanceMute: "서버 뮤트"
@ -753,7 +760,7 @@ behavior: "동작"
sample: "예시"
abuseReports: "신고"
reportAbuse: "신고"
reportAbuseRenote: "이 리노트 신고"
reportAbuseRenote: "이 리노트 신고하기"
reportAbuseOf: "{name} 님을 신고하기"
fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요. 특정 게시물을 신고할 때에는 게시물의 URL도 포함해 주세요."
abuseReported: "신고를 보냈어요! 신고해 주셔서 감사합니다."
@ -835,7 +842,7 @@ needReloadToApply: "변경 사항은 페이지를 다시 불러오면 적용돼
showTitlebar: "타이틀 바를 표시하기"
clearCache: "캐시 비우기"
onlineUsersCount: "{n}명이 접속 중"
nUsers: "{n} 유저"
nUsers: "{n} 사용자"
nNotes: "{n} 노트"
sendErrorReports: "오류 보고서 보내기"
sendErrorReportsDescription: "이 설정을 활성화하면, 문제가 발생했을 때 오류에 대한 상세 정보를 CherryPick에 보내 더 나은 소프트웨어를 만드는 데에 도움을 줄 수 있어요."
@ -881,7 +888,7 @@ addDescription: "설명 추가"
userPagePinTip: "각 노트의 메뉴에서 「프로필에 고정」을 선택하는 것으로, 여기에 노트를 표시해 둘 수 있어요."
notSpecifiedMentionWarning: "수신자가 선택되지 않은 멘션이 있어요"
info: "정보"
userInfo: "유저 정보"
userInfo: "사용자 정보"
unknown: "알 수 없음"
onlineStatus: "온라인 상태"
hideOnlineStatus: "온라인 상태 숨기기"
@ -897,7 +904,7 @@ switchAccount: "계정 바꾸기"
enabled: "활성화"
disabled: "비활성화"
quickAction: "빠른 동작"
user: "유저"
user: "사용자"
administration: "관리"
accounts: "계정"
switch: "전환"
@ -938,7 +945,7 @@ whatIsNew: "패치 정보 보기"
translate: "번역"
translatedFrom: "{x}에서 번역"
accountDeletionInProgress: "계정 삭제 작업을 진행하는 중이에요"
usernameInfo: "서버에서 계정을 식별하기 위한 이름이에요. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있어요. 사용자은 한번 만들면 나중에 변경할 수 없으니 신중하게 입력해 주세요."
usernameInfo: "서버에서 계정을 식별하기 위한 이름이에요. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있어요. 사용자 이름은 한번 만들면 나중에 변경할 수 없으니 신중하게 입력해 주세요."
aiChanMode: "아이 모드"
devMode: "개발자 모드"
keepCw: "CW 유지하기"
@ -957,10 +964,10 @@ unread: "읽지 않음"
filter: "필터"
controlPanel: "제어판"
manageAccounts: "계정 관리"
makeReactionsPublic: "리액션 목록 공개하기"
makeReactionsPublic: "리액션 목록 공개하기"
makeReactionsPublicDescription: "나의 리액션을 누구나 볼 수 있게 설정해요."
classic: "클래식"
muteThread: "이 글타래 뮤트"
muteThread: "이 글타래 뮤트"
unmuteThread: "글타래 뮤트 해제"
ffVisibility: "내 인맥의 공개 범위"
ffVisibilityDescription: "나의 팔로우와 팔로워 정보에 대한 공개 범위를 설정할 수 있어요."
@ -1007,7 +1014,7 @@ noEmailServerWarning: "메일 서버를 아직 설정하지 않았어요."
thereIsUnresolvedAbuseReportWarning: "해결되지 않은 신고가 있어요."
recommended: "추천"
check: "체크"
driveCapOverrideLabel: "이 유저의 드라이브 용량을 변경"
driveCapOverrideLabel: "이 사용자의 드라이브 용량을 변경"
driveCapOverrideCaption: "0 이하를 지정하면 해제돼요."
requireAdminForView: "열람하려면 관리자 계정으로 로그인 해야해요."
isSystemAccount: "시스템에 의해 자동으로 생성되어 관리되는 계정이에요."
@ -1038,7 +1045,7 @@ cannotUploadBecauseExceedsFileSizeLimit: "파일 크기가 너무 크기 때문
beta: "베타"
enableAutoSensitive: "자동으로 민감한 미디어 탐지"
enableAutoSensitiveDescription: "사용 가능한 경우, 기계학습을 통해 자동으로 미디어에 NSFW를 설정할 거예요. 이 기능을 해제하더라도, 서버 정책에 따라 자동으로 설정될 수 있어요."
activeEmailValidationDescription: "유저가 입력한 메일 주소가 일회용 메일인지, 실제로 통신할 수 있는 지 엄격하게 검사해요. 해제하면 이메일 형식에 대해서만 검사해요."
activeEmailValidationDescription: "사용자가 입력한 메일 주소가 일회용 메일인지, 실제로 통신할 수 있는 지 엄격하게 검사해요. 해제하면 이메일 형식에 대해서만 검사해요."
navbar: "내비게이션 바"
shuffle: "셔플"
account: "계정"
@ -1065,7 +1072,7 @@ show: "표시"
neverShow: "다시 보지 않기"
remindMeLater: "나중에 알림"
didYouLikeMisskey: "CherryPick이 마음에 드시나요?"
pleaseDonate: "{host}은(는) 무료 소프트웨어 CherryPick을 사용하고 있어요. 후원을 통해 저희의 개발이 이어질 수 있게 도와주세요!"
pleaseDonate: "CherryPick은 {host}에서 사용하는 무료 소프트웨어에요. 후원을 통해 앞으로도 개발을 계속할 수 있게 도와주세요!"
roles: "역할"
role: "역할"
noRole: "역할이 없어요"
@ -1075,7 +1082,7 @@ assign: "할당"
unassign: "할당 취소"
color: "색"
manageCustomEmojis: "커스텀 이모지 관리"
manageAvatarDecorations: "아이콘 장식 관리"
manageAvatarDecorations: "아바타 장식 관리"
youCannotCreateAnymore: "더 이상 생성할 수 없어요."
cannotPerformTemporary: "일시적으로 사용할 수 없음"
cannotPerformTemporaryDescription: "조작 횟수 제한을 초과하여 일시적으로 사용할 수 없어요. 잠시 후 다시 시도해 주세요."
@ -1088,7 +1095,7 @@ selectFromPresets: "프리셋에서 선택"
achievements: "도전 과제"
gotInvalidResponseError: "서버의 응답이 올바르지 않아요.."
gotInvalidResponseErrorDescription: "서버가 다운되었거나 점검 중일 가능성이 있어요. 잠시 후에 다시 접속해 주세요."
thisPostMayBeAnnoying: "이 게시물은 다른 유저에게 피해를 줄 가능성이 있어요!"
thisPostMayBeAnnoying: "이 게시물은 다른 사용자에게 피해를 줄 가능성이 있어요!"
thisPostMayBeAnnoyingHome: "홈에 게시"
thisPostMayBeAnnoyingCancel: "그만두기"
thisPostMayBeAnnoyingIgnore: "이대로 게시"
@ -1111,12 +1118,14 @@ reactionAcceptance: "리액션 수신"
likeOnly: "좋아요만 받기"
likeOnlyForRemote: "리모트에서는 좋아요만 받기"
nonSensitiveOnly: "민감한 이모지를 제외하고 받기"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "민감한 이모지를 제외하고 받기 (리모트에서는 좋아요만 받기)"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "민감한 이모지를 제외하고 받기(리모트에서는 좋아요만 받기)"
rolesAssignedToMe: "나에게 할당된 역할"
resetPasswordConfirm: "비밀번호를 재설정할까요?"
sensitiveWords: "민감한 단어"
sensitiveWordsDescription: "설정한 단어가 포함된 노트의 공개 범위를 '홈'으로 강제해요. 개행으로 구분하여 여러 개를 지정할 수 있어요."
sensitiveWordsDescription2: "공백으로 구분하면 AND로 지정되고, 키워드를 슬래시로 둘러싸면 정규 표현식이 돼요."
hiddenTags: "숨긴 해시태그"
hiddenTagsDescription: "설정한 태그가 트렌드에 표시되지 않아요. 줄 바꿈으로 하나씩 나눠서 설정할 수 있어요."
notesSearchNotAvailable: "노트 검색을 이용할 수 없어요."
license: "라이선스"
unfavoriteConfirm: "즐겨찾기를 해제할까요?"
@ -1125,10 +1134,11 @@ drivecleaner: "드라이브 정리"
retryAllQueuesNow: "모든 큐를 다시 시도"
retryAllQueuesConfirmTitle: "지금 다시 시도할까요?"
retryAllQueuesConfirmText: "일시적으로 서버의 부하가 증가할 수 있어요!"
enableChartsForRemoteUser: "리모트 유저의 차트를 생성"
enableChartsForFederatedInstances: "리모트 서버 차트 생성"
showClipButtonInNoteFooter: "노트 동작에 클립 추가"
enableChartsForRemoteUser: "리모트 사용자 차트 생성"
enableChartsForFederatedInstances: "리모트 서버 차트 생성"
showClipButtonInNoteFooter: "노트 동작에 클립 버튼 추가"
reactionsDisplaySize: "리액션 표시 크기"
limitWidthOfReaction: "리액션의 최대 폭을 제한하고 작게 표시"
noteIdOrUrl: "노트 ID 및 URL"
video: "동영상"
videos: "동영상"
@ -1158,8 +1168,8 @@ serverRules: "서버 규칙"
pleaseConfirmBelowBeforeSignup: "이 서버에 가입하기 전에 아래 사항을 확인해 주세요."
pleaseAgreeAllToContinue: "계속하시려면 모든 항목에 동의해야 해요."
continue: "계속"
preservedUsernames: "예약된 사용자"
preservedUsernamesDescription: "예약할 사용자명을 한 줄에 하나씩 입력해 주세요. 여기에서 지정한 사용자명으로는 계정을 생성할 수 없게 돼요. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않아요."
preservedUsernames: "예약된 사용자 이름"
preservedUsernamesDescription: "예약할 사용자 이름을 한 줄에 하나씩 입력해 주세요. 여기에서 지정한 사용자 이름으로는 계정을 생성할 수 없게 돼요. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않아요."
createNoteFromTheFile: "이 파일로 노트 작성"
archive: "아카이브"
channelArchiveConfirmTitle: "{name} 을(를) 아카이브할까요?"
@ -1185,7 +1195,7 @@ additionalEmojiDictionary: "이모지 추가 사전"
installed: "설치됨"
branding: "브랜딩"
enableServerMachineStats: "서버의 머신 사양을 공개하기"
enableIdenticonGeneration: "유저마다 Identicon 생성 유효화"
enableIdenticonGeneration: "사용자마다 Identicon 생성 유효화"
turnOffToImprovePerformance: "이 기능을 끄면 성능이 향상될 수 있어요."
createInviteCode: "초대 코드 생성"
createWithOptions: "옵션을 지정하여 생성"
@ -1212,7 +1222,7 @@ emailToReceiveAbuseReport: "신고 알림을 받을 수 있는 이메일 주소"
emailToReceiveAbuseReportCaption: "신고 알림을 받을 이메일 주소를 지정해 주세요. 이곳의 입력란을 비워두면 메일 서버의 이메일 주소가 사용돼요."
dialog: "다이얼로그"
icon: "아이콘"
forYou: "당신에게"
forYou: "에게"
currentAnnouncements: "현재 공지사항"
pastAnnouncements: "과거 공지사항"
youHaveUnreadAnnouncements: "읽지 않은 공지사항이 있어요."
@ -1247,12 +1257,12 @@ impressumDescription: "독일 등의 일부 나라와 지역에서는 꼭 표시
privacyPolicy: "개인정보 보호 정책"
privacyPolicyUrl: "개인정보 보호 정책 URL"
tosAndPrivacyPolicy: "약관 및 개인정보 보호 정책"
avatarDecorations: "아이콘 장식"
avatarDecorations: "아바타 장식"
attach: "붙이기"
detach: "떼기"
angle: "각도"
flip: "플립"
showAvatarDecorations: "아이콘 장식 표시"
showAvatarDecorations: "아바타 장식 표시"
releaseToRefresh: "놓아서 새로 고침"
refreshing: "새로 고침 중"
pullDownToRefresh: "당겨서 새로 고침"
@ -1262,7 +1272,7 @@ signupPendingError: "메일 주소 확인중에 문제가 발생했어요. 링
cwNotationRequired: "'내용 숨기기'를 체크했을 경우 주석을 작성해야 해요."
doReaction: "리액션 추가"
code: "코드"
tryReloadIfNotApplied: "설정을 반영하려면 페이지를 다시 불러와야 해요."
reloadRequiredToApplySettings: "설정을 반영하려면 페이지를 다시 불러와야 해요."
showUnreadNotificationsCount: "읽지 않은 알림 수 표시"
showCatOnly: "고양이만 보기"
additionalPermissionsForFlash: "Play에 대한 추가 권한"
@ -1286,15 +1296,15 @@ _showingAnimatedImages:
_messaging:
direct: "다이렉트 메시지"
_announcement:
forExistingUsers: "기존 유저에게만 알리기"
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시해요. 비활성화하면 게시 후에 가입한 유저에게도 표시해요."
forExistingUsers: "기존 사용자에게만 알리기"
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 사용자에게만 표시해요. 비활성화하면 게시 후에 가입한 사용자에게도 표시해요."
needConfirmationToRead: "읽음으로 표시하기 전에 확인하기"
needConfirmationToReadDescription: "활성화하면 이 공지사항을 읽음으로 표시하기 전에 확인 알림창을 표시해요. '모두 읽음'의 대상에서도 제외돼요."
end: "공지 내리기"
tooManyActiveAnnouncementDescription: "공지사항이 너무 많으면 사용자 경험에 영향을 끼칠 가능성이 있어요. 오래된 공지사항은 아카이브하는 것을 권장해요."
readConfirmTitle: "읽음으로 표시할까요?"
readConfirmText: "\"{title}\"을(를) 읽음으로 표시해요."
shouldNotBeUsedToPresentPermanentInfo: "신규 유저의 사용자 경험에 악영향을 끼칠 수 있으므로, 일시적인 알림 수단으로만 사용하고 고정된 정보에는 사용을 지양하는 것을 추천해요."
shouldNotBeUsedToPresentPermanentInfo: "신규 사용자의 사용자 경험에 악영향을 끼칠 수 있으므로, 일시적인 알림 수단으로만 사용하고 고정된 정보에는 사용을 지양하는 것을 추천해요."
dialogAnnouncementUxWarn: "다이얼로그 형태의 알림이 동시에 2개 이상 존재하는 경우, 사용자 경험에 악영향을 끼칠 수 있으므로 신중히 결정하는 것을 권장드려요."
silence: "조용히 알림"
silenceDescription: "활성화하면 공지사항에 대한 알림이 가지 않게 되며, 확인 버튼을 누르지 않아도 공지사항이 읽음으로 표시돼요."
@ -1306,7 +1316,7 @@ _cherrypick:
function: "고유 기능"
functionDescription: "CherryPick이 추가하는 고유 기능을 활성화/비활성화할 수 있어요."
nickname: "닉네임 기능"
nicknameDescription: "유저 페이지에서 이름을 클릭 또는 탭하여 원하는 이름으로 변경할 수 있어요. 변경한 이름은 자신에게만 반영돼요.\n자주 이름을 바꾸는 사용자를 식별하는 데 사용할 수 있어요."
nicknameDescription: "사용자 페이지에서 이름을 클릭 또는 탭하여 원하는 이름으로 변경할 수 있어요. 변경한 이름은 자신에게만 반영돼요.\n자주 이름을 바꾸는 사용자를 식별하는 데 사용할 수 있어요."
useEnterToSend: "Enter 키를 눌러 보내기"
useEnterToSendDescription: "옵션을 활성화하면 줄 바꿈은 Shift + Enter 키로 할 수 있어요. 대화를 전송할 때는 옵션의 영향을 받지 않아요."
postFormVisibilityHotkey: "단축키로 공개 범위 전환하기"
@ -1331,7 +1341,7 @@ _cherrypick:
renameTheButtonInPostFormToNya: "노트 작성 화면의 '노트' 버튼을 '냥!'으로 변경"
renameTheButtonInPostFormToNyaDescription: "냐앙냥냥냥냐냥?"
enableLongPressOpenAccountMenu: "길게 눌러 계정 메뉴 열기"
friendlyShowAvatarDecorationsInNavBtn: "플로팅 버튼에 아이콘 장식 표시"
friendlyShowAvatarDecorationsInNavBtn: "플로팅 버튼에 아바타 장식 표시"
_bannerDisplay:
all: "전부"
topBottom: "상단 및 하단"
@ -1353,7 +1363,7 @@ _initialAccountSetting:
mfmAndAnimatedImagesSetting: "MFM 및 움직이는 이미지 설정"
theseSettingsCanEditLater: "이 설정들은 나중에도 변경할 수 있어요."
youCanEditMoreSettingsInSettingsPageLater: "이 외에도 '설정' 페이지에서 다양한 설정을 나의 입맛에 맞게 조절할 수 있으니 꼭 확인해 보세요!"
followUsers: "관심사가 맞는 유저를 팔로우하여 타임라인을 가꾸어 보세요."
followUsers: "관심사가 맞는 사람을 팔로우하여 타임라인을 가꾸어 보세요."
pushNotificationDescription: "푸시 알림을 활성화하면 {name}의 알림을 나의 기기에서 받아볼 수 있어요."
initialAccountSettingCompleted: "초기 설정을 모두 완료했어요!"
haveFun: "{name}와 함께 즐거운 시간 보내세요!"
@ -1388,9 +1398,9 @@ _initialTutorial:
reactDone: "'-' 버튼을 눌러서 리액션을 취소할 수 있어요."
_timeline:
title: "타임라인에 대하여"
description1: "CherryPick에는 종류에 따라 여러 가지의 타임라인으로 구성되어 있어요. (서버에 따라서는 일부 타임라인을 사용할 수 없는 경우도 있어요)"
description1: "CherryPick에는 종류에 따라 여러 가지의 타임라인으로 구성되어 있어요.(서버에 따라서는 일부 타임라인을 사용할 수 없는 경우도 있어요)"
home: "내가 팔로우 중인 계정의 노트를 볼 수 있어요."
local: "이 서버에 있는 모든 유저의 게시물을 볼 수 있어요."
local: "이 서버에 있는 모든 사용자의 게시물을 볼 수 있어요."
social: "홈 타임라인과 로컬 타임라인의 게시물을 모두 볼 수 있어요."
global: "연결되어 있는 모든 서버의 게시물을 볼 수 있어요."
description2: "각각의 타임라인은 화면 상단에서 언제든지 변경할 수 있어요."
@ -1400,13 +1410,13 @@ _initialTutorial:
description1: "CherryPick에 노트를 쓸 때에는 다양한 옵션을 설정할 수 있어요. 노트를 작성하는 화면은 이렇게 생겼답니다."
_visibility:
description: "노트를 볼 수 있는 사람을 제한할 수 있어요."
public: "모든 유저에게 노트를 공개해요."
home: "홈 타임라인에서만 노트를 공개해요. 팔로워, 프로필 화면, 리노트를 통해서 다른 유저가 노트의 내용을 볼 수 있어요."
public: "모든 사용자에게 노트를 공개해요."
home: "홈 타임라인에서만 노트를 공개해요. 팔로워, 프로필 화면, 리노트를 통해서 다른 사용자가 노트의 내용을 볼 수 있어요."
followers: "팔로워에게만 노트를 공개해요. 자기 자신을 제외하고는 리노트를 할 수 없고, 팔로워 외에는 노트의 내용을 볼 수 없어요."
direct: "지정한 유저에게만 노트가 공개되며, 노트에 지정된 상대방에게 알림이 보내져요."
direct: "지정한 사용자에게만 노트가 공개되며, 노트에 지정된 상대방에게 알림이 보내져요."
doNotSendConfidencialOnDirect1: "민감한 정보를 보낼 때에는 주의해 주세요."
doNotSendConfidencialOnDirect2: "서버 관리자는 기술적으로 노트의 내용을 열람할 수 있기 때문에, 신뢰할 수 없는 서버의 유저에게 다이렉트 메시지를 보내는 경우, 노트를 보내기 전에 민감한 정보가 포함되어 있는지 먼저 확인해 주세요."
localOnly: "다른 서버에 노트를 보내지 않아요. 앞서 설정한 공개 범위와 상관 없이 다른 서버의 유저는 이 노트를 볼 수 없어요."
doNotSendConfidencialOnDirect2: "서버 관리자는 기술적으로 노트의 내용을 열람할 수 있기 때문에, 신뢰할 수 없는 서버의 사용자에게 다이렉트 메시지를 보내는 경우, 노트를 보내기 전에 민감한 정보가 포함되어 있는지 먼저 확인해 주세요."
localOnly: "다른 서버에 노트를 보내지 않아요. 앞서 설정한 공개 범위와 상관 없이 다른 서버의 사용자는 이 노트를 볼 수 없어요."
_cw:
title: "내용 가리기 (CW)"
description: "본문 대신에 '내용에 대한 주석'에 입력한 텍스트가 먼저 표시돼요. '더 보기' 버튼을 누르면 숨겨진 본문이 표시돼요."
@ -1428,7 +1438,7 @@ _initialTutorial:
description: "여기에서 소개한 기능은 최소한의 사용을 위한 가장 기본적인 기능만을 다뤘어요. CherryPick의 사용 방법을 더 자세히 알아보려면 {link}를 확인해 주세요!"
_timelineDescription:
home: "홈 타임라인에서는, 내가 팔로우한 계정의 게시물을 볼 수 있어요."
local: "로컬 타임라인에서는, 이 서버의 모든 유저의 게시물을 볼 수 있어요."
local: "로컬 타임라인에서는, 이 서버의 모든 사용자의 게시물을 볼 수 있어요."
social: "소셜 타임라인에서는, 홈 타임라인과 로컬 타임라인의 게시물을 모두 볼 수 있어요."
global: "글로벌 타임라인에서는, 여기와 연결된 다른 모든 서버의 게시물을 볼 수 있어요."
_serverRules:
@ -1469,6 +1479,8 @@ _serverSettings:
shortName: "약칭"
shortNameDescription: "서버의 정식 명칭이 긴 경우, 대신 표시할 수 있는 약칭이나 통칭."
fanoutTimelineDescription: "활성화하면 각종 타임라인을 가져올 때의 성능을 대폭 향상하며, 데이터베이스의 부하를 줄일 수 있어요. 단, Redis의 메모리 사용량이 증가하게 되고, 서버의 메모리 용량이 작거나, 서비스가 불안정해지는 경우 해당 설정을 비활성화해 주세요."
fanoutTimelineDbFallback: "데이터베이스 폴백"
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해서는 DB에 추가로 쿼리하는 폴백 처리를 수행해요. 비활성화하면 폴백 처리를 하지 않아 서버의 부하를 줄일 수 있지만, 타임라인을 가져올 수 있는 범위가 한정돼요."
_accountMigration:
moveFrom: "다른 계정에서 이 계정으로 이사"
moveFromSub: "다른 계정에 대한 별칭을 생성"
@ -1488,9 +1500,9 @@ _achievements:
earnedAt: "달성 일시"
_types:
_notes1:
title: "체리픽 시작했는데요"
title: "체리픽 계정을 만들었어요"
description: "첫 노트를 작성했어요!"
flavor: "CherryPick에 오신 것을 환영합니다!"
flavor: "CherryPick에 어서 오세요!"
_notes10:
title: "노트 조금"
description: "10개의 노트를 작성했어요"
@ -1501,16 +1513,16 @@ _achievements:
title: "노트로 뒤덮여버렸어"
description: "500개의 노트를 작성했어요"
_notes1000:
title: "노트 산더미"
title: "노트 산더미"
description: "1,000개의 노트를 작성했어요"
_notes5000:
title: "노트가 어디서 솟아?"
title: "솟아나는 노트"
description: "5,000개의 노트를 작성했어요"
_notes10000:
title: "슈퍼 노트"
description: "10,000개의 노트를 작성했어요"
_notes20000:
title: "노트 더 없어?"
title: "더 많은 노트가 필요해"
description: "20,000개의 노트를 작성했어요"
_notes30000:
title: "노트노트노트"
@ -1538,26 +1550,26 @@ _achievements:
description: "100,000개의 노트를 작성했어요"
flavor: "이만큼 쓸 일도 없겠지만... 다른 할 일이 있진 않으신가요?"
_login3:
title: "비기너 I"
title: "초보자 I"
description: "총 3일간 로그인했어요"
flavor: "오늘부터 여러분도 미스키스트에요!"
flavor: "오늘부터 여러분도 체리피키스트에요!"
_login7:
title: "비기너 II"
title: "초보자 II"
description: "총 7일간 로그인했어요"
flavor: "슬슬 익숙해지셨나요?"
_login15:
title: "비기너 III"
title: "초보자 III"
description: "총 15일간 로그인했어요"
_login30:
title: "미스키스트 I"
title: "체리피키스트 I"
description: "총 30일간 로그인했어요"
_login60:
title: "미스키스트 II"
title: "체리피키스트 II"
description: "총 60일간 로그인했어요"
_login100:
title: "미스키스트 III"
title: "체리피키스트 III"
description: "총 100일간 로그인했어요"
flavor: "그 유저, 미스키스트이다"
flavor: "그 사람, 체리피키스트이다"
_login200:
title: "단골 I"
description: "총 200일간 로그인했어요"
@ -1742,7 +1754,9 @@ _role:
assignTarget: "할당 대상"
descriptionOfAssignTarget: "<b>수동</b>을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있어요.\n<b>조건부</b>를 선택하면 조건을 설정해 일치하는 사용자를 자동으로 포함시킬 수 있어요."
manual: "수동"
manualRoles: "수동 역할"
conditional: "조건부"
conditionalRoles: "조건부 역할"
condition: "조건"
isConditionalRole: "조건부 역할이에요."
isPublic: "역할 공개"
@ -1754,7 +1768,7 @@ _role:
chooseRoleToAssign: "할당할 역할 선택"
iconUrl: "아이콘 URL"
asBadge: "배지로 표시"
descriptionOfAsBadge: "활성화하면 유저명 옆에 역할의 아이콘이 표시돼요."
descriptionOfAsBadge: "활성화하면 사용자 이름 옆에 역할의 아이콘이 표시돼요."
isExplorable: "역할 타임라인 공개"
descriptionOfIsExplorable: "활성화하면 역할 타임라인을 공개해요. 비활성화하면 타임라인이 공개되지 않아요."
displayOrder: "표시 순서"
@ -1776,7 +1790,7 @@ _role:
inviteLimitCycle: "초대 발급 간격"
inviteExpirationTime: "초대 만료 기간"
canManageCustomEmojis: "커스텀 이모지 관리"
canManageAvatarDecorations: "아이콘 장식 관리"
canManageAvatarDecorations: "아바타 장식 관리"
driveCapacity: "드라이브 용량"
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
pinMax: "고정할 수 있는 노트 수"
@ -1785,8 +1799,8 @@ _role:
webhookMax: "생성할 수 있는 웹훅 수"
clipMax: "생성할 수 있는 클립 수"
noteEachClipsMax: "각 클립에 추가할 수 있는 노트 수"
userListMax: "생성할 수 있는 유저 리스트 수"
userEachUserListsMax: "유저 리스트당 최대 사용자 수"
userListMax: "생성할 수 있는 사용자 리스트 수"
userEachUserListsMax: "사용자 리스트당 최대 사용자 수"
rateLimitFactor: "요청 빈도 제한"
descriptionOfRateLimitFactor: "작을수록 제한이 완화되고, 클수록 제한이 강화돼요."
canHideAds: "광고 숨기기"
@ -1795,14 +1809,14 @@ _role:
_condition:
isLocal: "로컬 사용자"
isRemote: "리모트 사용자"
createdLessThan: "가입한 지 다음 일수 이내인 유저"
createdMoreThan: "가입한 지 다음 일수 이상인 유저"
followersLessThanOrEq: "팔로워 수가 다음 이하인 유저"
followersMoreThanOrEq: "팔로워 수가 다음 이상인 유저"
followingLessThanOrEq: "팔로잉 수가 다음 이하인 유저"
followingMoreThanOrEq: "팔로잉 수가 다음 이상인 유저"
notesLessThanOrEq: "노트 수가 다음 이하인 유저"
notesMoreThanOrEq: "노트 수가 다음 이상인 유저"
createdLessThan: "가입한 지 다음 일수 이내인 사용자"
createdMoreThan: "가입한 지 다음 일수 이상인 사용자"
followersLessThanOrEq: "팔로워 수가 다음 이하인 사용자"
followersMoreThanOrEq: "팔로워 수가 다음 이상인 사용자"
followingLessThanOrEq: "팔로잉 수가 다음 이하인 사용자"
followingMoreThanOrEq: "팔로잉 수가 다음 이상인 사용자"
notesLessThanOrEq: "노트 수가 다음 이하인 사용자"
notesMoreThanOrEq: "노트 수가 다음 이상인 사용자"
and: "다음을 모두 만족"
or: "다음을 하나라도 만족"
not: "다음을 만족하지 않음"
@ -1830,7 +1844,7 @@ _ffVisibility:
private: "비공개"
_signup:
almostThere: "거의 다 끝났어요!"
emailAddressInfo: "사용할 메일 주소를 입력해 주세요. 이메일 주소는 다른 유저에게 공개되지 않아요."
emailAddressInfo: "사용할 메일 주소를 입력해 주세요. 이메일 주소는 다른 사용자에게 공개되지 않아요."
emailSent: "입력한 메일 주소({email})로 확인 메일을 보내드렸어요! 가입을 완료하려면 보내드린 메일에 있는 링크로 접속해 주세요.\n만약 메일이 오지 않는다면 스팸 메일함을 확인해 주세요!"
_accountDelete:
accountDelete: "계정 삭제"
@ -1892,7 +1906,7 @@ _registry:
domain: "도메인"
createKey: "키 생성"
_aboutMisskey:
about: "CherryPick은 Misskey를 기반으로 2021년부터 개발되어 오고 있는 커스터마이즈 클라이언트에요."
about: "CherryPick은 Misskey를 기반으로 2021년부터 개발되어 오고 있는 커스터마이즈 오픈소스 소프트웨어에요."
contributors: "주요 기여자"
allContributors: "모든 기여자"
source: "소스 코드"
@ -1905,7 +1919,6 @@ _aboutMisskey:
serverStatus: "서버 상태"
donate: "코코넥트에 기부하기"
_cherrypick:
about: "이 Misskey는 NoriDev에 의해 커스텀 되었어요!"
translation: "CherryPick 번역하기"
donate: "CherryPick에 기부하기"
relayServer: "릴레이 서버"
@ -1919,7 +1932,7 @@ _mfm:
intro: "MFM는 Misskey 기반 클라이언트의 다양한 곳에서 사용할 수 있는 전용 마크업 언어에요. 여기에서 MFM에서 사용할 수 있는 구문을 확인할 수 있어요."
dummy: "CherryPick으로 연합우주의 세계가 펼쳐집니다"
mention: "멘션"
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있어요."
mentionDescription: "골뱅이표(@) 뒤에 사용자 이름을 넣어 특정 사용자를 지정할 수 있어요."
hashtag: "해시태그"
hashtagDescription: "샵 또는 우물정자(#)를 앞에 붙여서 해시태그를 나타낼 수 있어요."
url: "URL"
@ -1994,7 +2007,7 @@ _mfm:
rubyDescription: "글자 위에 루비를 표시해요."
_instanceTicker:
none: "보이지 않음"
remote: "리모트 유저에게만 보이기"
remote: "리모트 사용자에게만 보이기"
always: "항상 보이기"
_serverDisconnectedBehavior:
reload: "자동으로 새로고침"
@ -2095,7 +2108,7 @@ _theme:
driveFolderBg: "드라이브 폴더 배경"
wallpaperOverlay: "배경화면 오버레이"
badge: "배지"
messageBg: "채팅 배경"
messageBg: "대화 배경"
accentDarken: "강조 색상 (어두움)"
accentLighten: "강조 색상 (밝음)"
fgHighlighted: "강조된 텍스트"
@ -2108,6 +2121,14 @@ _sfx:
chatBg: "대화 (백그라운드)"
antenna: "안테나 수신"
channel: "채널 알림"
reaction: "리액션 선택"
_soundSettings:
driveFile: "드라이브에 있는 오디오 사용"
driveFileWarn: "드라이브에 있는 파일을 선택해 주세요."
driveFileTypeWarn: "이 파일은 지원되지 않는 형식이에요."
driveFileTypeWarnDescription: "오디오 파일을 선택해 주세요."
driveFileDurationWarn: "오디오가 너무 길어요."
driveFileDurationWarnDescription: "긴 오디오를 사용하는 경우 CherryPick 사용자 경험에 영향을 끼칠 수 있어요. 그래도 사용하시겠어요?"
_ago:
future: "미래"
justNow: "방금 전"
@ -2119,6 +2140,14 @@ _ago:
monthsAgo: "{n}개월 전"
yearsAgo: "{n}년 전"
invalid: "없음"
_timeIn:
seconds: "{n}초 후"
minutes: "{n}분 후"
hours: "{n}시간 후"
days: "{n}일 후"
weeks: "{n}주 후"
months: "{n}개월 후"
years: "{n}년 후"
_time:
second: "초"
minute: "분"
@ -2178,8 +2207,8 @@ _permissions:
"write:pages": "페이지를 편집합니다"
"read:page-likes": "페이지의 좋아요를 확인합니다"
"write:page-likes": "페이지에 좋아요를 추가하거나 취소합니다"
"read:user-groups": "유저 그룹을 조회합니다"
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
"read:user-groups": "사용자 그룹을 조회합니다"
"write:user-groups": "사용자 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
"read:channels": "채널을 보기"
"write:channels": "채널을 추가하거나 삭제합니다"
"read:gallery": "갤러리를 봅니다"
@ -2202,11 +2231,11 @@ _auth:
pleaseLogin: "애플리케이션의 접근을 허가하려면 먼저 로그인해 주세요."
_antennaSources:
all: "모든 노트"
homeTimeline: "팔로우중인 유저의 노트"
users: "지정한 유저의 노트"
userList: "지정한 리스트에 속한 유저의 노트"
userGroup: "지정한 그룹에 속한 유저의 노트"
userBlacklist: "지정한 유저를 제외한 모든 노트"
homeTimeline: "팔로우중인 사용자의 노트"
users: "지정한 사용자의 노트"
userList: "지정한 리스트에 속한 사용자의 노트"
userGroup: "지정한 그룹에 속한 사용자의 노트"
userBlacklist: "지정한 사용자를 제외한 모든 노트"
_weekday:
sunday: "일요일"
monday: "월요일"
@ -2235,16 +2264,17 @@ _widgets:
postForm: "글 입력란"
slideshow: "슬라이드 쇼"
button: "버튼"
onlineUsers: "온라인 유저"
onlineUsers: "온라인 상태인 사용자"
jobQueue: "작업 대기열"
serverMetric: "서버 통계"
aiscript: "AiScript 콘솔"
aiscriptApp: "AiScript 앱"
aichan: "아이"
userList: "유저 리스트"
userList: "사용자 리스트"
_userList:
chooseList: "리스트 선택"
clicker: "클리커"
birthdayFollowings: "오늘 생일인 사용자"
_cw:
hide: "숨기기"
show: "더 보기"
@ -2274,13 +2304,13 @@ _poll:
remainingSeconds: "종료까지 앞으로 {s}초"
_visibility:
public: "공개"
publicDescription: "모든 유저에게 공개"
publicDescription: "모든 사용자에게 공개"
home: "홈"
homeDescription: "홈 타임라인에만 공개"
followers: "팔로워"
followersDescription: "팔로워에게만 공개"
specified: "다이렉트"
specifiedDescription: "지정한 유저에게만 공개"
specifiedDescription: "지정한 사용자에게만 공개"
disableFederation: "연합에 보내지 않기"
disableFederationDescription: "다른 서버로 보내지 않을래요"
_postForm:
@ -2297,7 +2327,7 @@ _postForm:
f: "작성해주시길 기다리고 있어요..."
_profile:
name: "이름"
username: "유저명"
username: "사용자 이름"
description: "자기소개"
youCanIncludeHashtags: "해시 태그를 포함할 수 있어요."
metadata: "추가 정보"
@ -2315,15 +2345,15 @@ _exportOrImport:
muteList: "뮤트"
blockingList: "차단"
userLists: "리스트"
excludeMutingUsers: "뮤트한 유저 제외하기"
excludeMutingUsers: "뮤트한 사용자 제외하기"
excludeInactiveUsers: "휴면 중인 계정 제외하기"
withReplies: "가져오기한 유저의 답글을 타임라인에 포함"
withReplies: "가져오기한 사용자의 답글을 타임라인에 포함"
_charts:
federation: "연합"
apRequest: "요청"
usersIncDec: "유저 수 증감"
usersTotal: "유저 수 합계"
activeUsers: "활성 유저 수"
usersIncDec: "사용자 수 증감"
usersTotal: "사용자 수 합계"
activeUsers: "활성 사용자 수"
notesIncDec: "노트 수 증감"
localNotesIncDec: "로컬 노트 수 증감"
remoteNotesIncDec: "리모트 노트 수 증감"
@ -2334,8 +2364,8 @@ _charts:
storageUsageTotal: "스토리지 사용량 합계"
_instanceCharts:
requests: "요청"
users: "유저 수 증감"
usersTotal: "누적 유저 수"
users: "사용자 수 증감"
usersTotal: "누적 사용자 수"
notes: "노트 수 증감"
notesTotal: "누적 노트 수"
ff: "팔로잉/팔로워 증감"
@ -2443,7 +2473,7 @@ _notification:
followedBySomeUsers: "{n}명에게 팔로우됨"
_types:
all: "전부"
note: "유저의 새 게시물"
note: "사용자의 새 게시물"
follow: "팔로잉"
mention: "멘션"
reply: "답글"
@ -2530,11 +2560,11 @@ _moderationLogTypes:
deleteDriveFile: "파일 삭제"
deleteNote: "노트 삭제"
createGlobalAnnouncement: "전역 공지사항 생성"
createUserAnnouncement: "유저 공지사항 생성"
createUserAnnouncement: "사용자 공지사항 생성"
updateGlobalAnnouncement: "전역 공지사항 편집"
updateUserAnnouncement: "유저 공지사항 편집"
updateUserAnnouncement: "사용자 공지사항 편집"
deleteGlobalAnnouncement: "전역 공지사항 삭제"
deleteUserAnnouncement: "유저 공지사항 삭제"
deleteUserAnnouncement: "사용자 공지사항 삭제"
resetPassword: "비밀번호 재설정"
suspendRemoteInstance: "리모트 서버를 정지"
unsuspendRemoteInstance: "리모트 서버의 정지를 해제"
@ -2545,9 +2575,11 @@ _moderationLogTypes:
createAd: "광고 생성"
deleteAd: "광고 삭제"
updateAd: "광고 편집"
createAvatarDecoration: "아이콘 장식 추가"
updateAvatarDecoration: "아이콘 장식 편집"
deleteAvatarDecoration: "아이콘 장식 삭제"
createAvatarDecoration: "아바타 장식 추가"
updateAvatarDecoration: "아바타 장식 편집"
deleteAvatarDecoration: "아바타 장식 삭제"
unsetUserAvatar: "이 사용자의 아바타 제거"
unsetUserBanner: "이 사용자의 배너 제거"
_fileViewer:
title: "파일 상세"
type: "파일 유형"
@ -2588,16 +2620,16 @@ _externalResourceInstaller:
description: "제공된 데이터의 무결성을 확인하지 못했어요. 보안을 위해 설치가 중단되었어요. 사이트 관리자에게 문의해 주세요."
_pluginParseFailed:
title: "AiScript 오류"
description: "데이터는 가져올 수 있었으나, AiScript 구문 분석에서 오류가 발생해 불러오지 못했어요. 플러그인 제작자에게 문의해 주세요. 오류에 대한 자세한 내용은 자바스크립트 콘솔에서 확인할 수 있어요."
description: "데이터는 가져올 수 있었으나, AiScript 구문 분석에서 오류가 발생해 불러오지 못했어요. 플러그인 제작자에게 문의해 주세요. 오류에 대한 자세한 내용은 브라우저에 내장된 개발자 도구의 JavaScript 콘솔에서 확인하실 수 있어요."
_pluginInstallFailed:
title: "플러그인 설치에 실패했어요"
description: "플러그인 설치 중 문제가 발생했어요. 다시 시도해 주세요. 오류에 대한 자세한 내용은 자바스크립트 콘솔을 참조해 주세요."
description: "플러그인 설치 중 문제가 발생했어요. 다시 시도해 주세요. 오류에 대한 자세한 내용은 브라우저에 내장된 개발자 도구의 JavaScript 콘솔에서 확인하실 수 있어요."
_themeParseFailed:
title: "테마 분석 오류"
description: "데이터는 가져올 수 있었으나, 테마 파일 분석 중 오류가 발생해 불러오지 못했어요. 테마 제작자에게 문의해 주세요. 오류에 대한 자세한 내용은 자바스크립트 콘솔에서 확인할 수 있어요."
description: "데이터는 가져올 수 있었으나, 테마 파일 분석 중 오류가 발생해 불러오지 못했어요. 테마 제작자에게 문의해 주세요. 오류에 대한 자세한 내용은 브라우저에 내장된 개발자 도구의 JavaScript 콘솔에서 확인하실 수 있어요."
_themeInstallFailed:
title: "테마 설치에 실패했어요"
description: "테마를 설치하는 동안 문제가 발생했어요. 다시 시도해 주세요. 오류에 대한 자세한 내용은 자바스크립트 콘솔을 참고해 주세요."
description: "테마를 설치하는 동안 문제가 발생했어요. 다시 시도해 주세요. 오류에 대한 자세한 내용은 브라우저에 내장된 개발자 도구의 JavaScript 콘솔에서 확인하실 수 있어요."
_dataSaver:
_media:
title: "미디어 불러오기 방지"
@ -2609,8 +2641,8 @@ _dataSaver:
title: "URL 미리보기 썸네일"
description: "URL 미리보기의 썸네일 이미지를 불러오지 않아요."
_code:
title: "코드 하이라이트"
description: "MFM 등에서 코드 하이라이트 기법을 사용하는 경우, 탭하기 전까지는 코드 하이라이트를 불러오지 않아요. 코드 하이라이트는 강조할 언어마다 해당 정의 파일을 불러와야 하지만, 이를 자동으로 불러오지 않기 때문에 통신량 감소를 기대할 수 있어요."
title: "코드 문법 강조"
description: "MFM 등에서 코드 문법 강조 기법을 사용할 때, 탭하기 전까지는 불러오지 않아요. 코드 문법 강조 기능은 강조할 언어마다 해당 정의 파일을 불러와야 하지만, 이를 자동으로 불러오지 않게 되어 데이터 사용량을 줄일 수 있어요."
_abuse:
_resolver:
1hour: "1시간"

View file

@ -320,7 +320,6 @@ administrator: "ຜູ້ບໍລິຫານ"
token: "ໂທເຄັນ"
share: "ແບ່ງປັນ"
notFound: "ບໍ່ພົບ"
cacheClear: "ລຶບລ້າງແຄສ"
help: "ຊ່ວຍເຫຼືອ"
close: "ປິດ"
invites: "ເຊີນ"

View file

@ -396,7 +396,6 @@ reduceUiAnimation: "Verminder beweging in de UI"
share: "Delen"
notFound: "Niet gevonden"
uploadFolder: "Standaardmap voor uploaden"
cacheClear: "Cache verwijderen"
markAsReadAllNotifications: "Markeer alle meldingen als gelezen"
markAsReadAllUnreadNotes: "Markeer alle berichten als gelezen"
markAsReadAllTalkMessages: "Markeer alle berichten als gelezen"

View file

@ -407,7 +407,6 @@ share: "Udostępnij"
notFound: "Nie znaleziono"
notFoundDescription: "Nie ma strony odpowiadającej określonemu adresowi URL."
uploadFolder: "Domyślne położenie wysłanych"
cacheClear: "Wyczyść pamięć podręczną"
markAsReadAllNotifications: "Oznacz wszystkie powiadomienia jako przeczytane"
markAsReadAllUnreadNotes: "Oznacz wszystkie wpisy jako przeczytane"
markAsReadAllTalkMessages: "Oznacz wszystkie wiadomości jako przeczytane"

View file

@ -431,7 +431,6 @@ share: "Compartilhar"
notFound: "Não encontrado"
notFoundDescription: "Não havia página correspondente ao URL especificado."
uploadFolder: "Destino de upload padrão"
cacheClear: "Excluir memória transitória"
markAsReadAllNotifications: "Marcar todas as notificações como lidas"
markAsReadAllUnreadNotes: "Marcar todas as postagens como lidas"
markAsReadAllTalkMessages: "Marcar todas as conversas como lidas"

View file

@ -2,6 +2,7 @@
_lang_: "Română"
headlineMisskey: "O rețea conectată prin note"
introMisskey: "Bine ai venit! CherryPick este un serviciu de microblogging open source și decentralizat.\nCreează \"note\" cu care să îți poți împărți gândurile cu oricine din jurul tău. 📡\nCu \"reacții\" îți poți expirma rapid părerea despre notele oricui. 👍\nHai să explorăm o lume nouă! 🚀"
poweredByMisskeyDescription: "{name} este unul dintre serviciile care se folosește de platforma open source <b>CherryPick</b>."
monthAndDay: "{day}/{month}"
search: "Caută"
notifications: "Notificări"
@ -12,12 +13,14 @@ fetchingAsApObject: "Se aduce din Fediverse..."
ok: "OK"
gotIt: "Am înțeles!"
cancel: "Anulează"
noThankYou: "Nu, mulțumesc."
enterUsername: "Introdu numele de utilizator"
renotedBy: "Re-notat de {user}"
noNotes: "Nicio notă"
noNotifications: "Nicio notificare"
instance: "Instanță"
settings: "Setări"
notificationSettings: "Setări notificări"
basicSettings: "Setări generale"
otherSettings: "Alte Setări"
openInWindow: "Deschide într-o fereastră"
@ -42,12 +45,20 @@ pin: "Fixează pe profil"
unpin: "Anulati fixare"
copyContent: "Copiază conținutul"
copyLink: "Copiază link-ul"
copyLinkRenote: "Copiază linkul pentru renote"
delete: "Şterge"
deleteAndEdit: "Șterge și editează"
deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi? Vei pierde reacțiile, re-notele și răspunsurile acesteia."
addToList: "Adaugă în listă"
addToAntenna: "Adaugă la antenă"
sendMessage: "Trimite un mesaj"
copyRSS: "Copiază RSS"
copyUsername: "Copiază numele de utilizator"
copyUserId: "Copiază numele de utilizator"
copyNoteId: "Copiază ID-ul notiței"
copyFileId: "Copiază ID-ul fișierului"
copyFolderId: "Copiază ID-ul folderului"
copyProfileUrl: "Copiază URL profil"
searchUser: "Caută un utilizator"
reply: "Răspunde"
loadMore: "Incarcă mai mult"
@ -100,6 +111,8 @@ renoted: "Re-notat."
cantRenote: "Această postare nu poate fi re-notată."
cantReRenote: "O re-notă nu poate fi re-notată."
quote: "Citează"
inChannelRenote: "Renotează în canal"
inChannelQuote: "Citează în canal"
pinnedNote: "Notă fixată"
pinned: "Fixat pe profil"
you: "Tu"
@ -117,6 +130,8 @@ unmarkAsSensitive: "Demarchează ca NSFW"
enterFileName: "Introduceţi numele fişierului"
mute: "Amuțește"
unmute: "Înlătură amuțirea"
renoteMute: "Renotări pe modul silențios"
renoteUnmute: "Scoate renotările de pe modul silențios"
block: "Blochează"
unblock: "Deblochează"
suspend: "Suspendă"
@ -126,7 +141,10 @@ unblockConfirm: "Ești sigur ca vrei să deblochezi acest cont?"
suspendConfirm: "Ești sigur ca vrei să suspendezi acest cont?"
unsuspendConfirm: "Ești sigur ca vrei să nu mai suspendezi acest cont?"
selectList: "Selectează o listă"
editList: "Editați lista"
selectChannel: "Selectaţi canalul"
selectAntenna: "Selectează o antenă"
editAntenna: "Editează antena"
selectWidget: "Selectați un widget"
editWidgets: "Editează widget-urile"
editWidgetsExit: "Terminat"
@ -139,6 +157,7 @@ addEmoji: "Adaugă un emoji"
settingGuide: "Setări recomandate"
cacheRemoteFiles: "Ține fișierele externe in cache"
cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea spațiului de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor fi generate."
youCanCleanRemoteFilesCache: "Poți goli cache-ul prin a apăsa pe butonul de 🗑️ din fereastra de gestionare a fișierelor."
flagAsBot: "Marchează acest cont ca bot"
flagAsBotDescription: "Activează această opțiune dacă acest cont este controlat de un program. Daca e activată, aceasta va juca rolul unui indicator pentru dezvoltatori pentru a preveni interacțiunea în lanțuri infinite cu ceilalți boți și ajustează sistemele interne al CherryPick pentru a trata acest cont drept un bot."
flagAsCat: "Marchează acest cont ca pisică"
@ -393,7 +412,6 @@ share: "Distribuie"
notFound: "Nu a fost găsit"
notFoundDescription: "N-a fost găsită nicio pagină cu acest URL."
uploadFolder: "Folder implicit pentru încărcări"
cacheClear: "Golește cache-ul"
markAsReadAllNotifications: "Marchează toate notificările drept citit"
markAsReadAllUnreadNotes: "Marchează toate notele drept citit"
markAsReadAllTalkMessages: "Marchează toate mesajele drept citit"
@ -650,6 +668,8 @@ _sfx:
chat: "Chat"
_ago:
invalid: "Nu e nimic de văzut aici"
_2fa:
renewTOTPCancel: "Nu, mulțumesc."
_widgets:
profile: "Profil"
instanceInfo: "Informații despre instanță"

View file

@ -61,7 +61,7 @@ copyProfileUrl: "Скопировать URL профиля "
searchUser: "Поиск людей"
reply: "Ответ"
loadMore: "Показать еще"
showMore: "Показать еще"
showMore: "Показать ещё"
showLess: "Закрыть"
youGotNewFollower: "Новый подписчик"
receiveFollowRequest: "Получен запрос на подписку"
@ -429,7 +429,6 @@ share: "Поделиться"
notFound: "Не найдено"
notFoundDescription: "Страница по указанной ссылке не найдена"
uploadFolder: "Место загрузки по умолчанию"
cacheClear: "Очистка кэша"
markAsReadAllNotifications: "Отметить все уведомления как прочитанные"
markAsReadAllUnreadNotes: "Отметить все заметки как прочитанные"
markAsReadAllTalkMessages: "Отметить все реплики как прочитанные"
@ -655,7 +654,7 @@ create: "Создать"
notificationSetting: "Настройки уведомлений"
notificationSettingDesc: "Выберите тип уведомлений для отображения"
useGlobalSetting: "Использовать глобальные настройки"
useGlobalSettingDesc: "Если включено, будут использоваться настройки учётной записи. Если включить, этот виджет можно будет настроить индивидуально."
useGlobalSettingDesc: "Если включено, будут использоваться настройки учётной записи. Если отключить, этот виджет можно будет настроить индивидуально."
other: "Другие"
regenerateLoginToken: "Создать новый токен для входа"
regenerateLoginTokenDescription: "Создаёт новый токен, используемый внутри программы во время входа. Обычно в этом нет необходимости. При создании все устройства будут отключены."
@ -693,7 +692,7 @@ createNewClip: "Новая подборка"
unclip: "Убрать из подборки"
confirmToUnclipAlreadyClippedNote: "Эта заметка уже есть в подборке «{name}». Удалить из этой подборки?"
public: "Общедоступно"
private: "Показываются только вам"
private: "Личное"
i18nInfo: "CherryPick переводят на разные языки добровольцы со всего света. Ваша помощь тоже пригодится здесь: {link}."
manageAccessTokens: "Управление токенами доступа"
accountInfo: "Сведения об учётной записи"
@ -969,7 +968,7 @@ numberOfProfileView: "Количество профилей для просмо
like: "Нравится!"
unlike: "Отменить «нравится»"
numberOfLikes: "Количество лайков"
show: "Отображение"
show: "Показать"
neverShow: "Больше не показывать"
remindMeLater: "Напомнить позже"
didYouLikeMisskey: "Вам нравится CherryPick?"
@ -1072,7 +1071,7 @@ specifyUser: "Указанный пользователь"
failedToPreviewUrl: "Предварительный просмотр недоступен"
update: "Обновить"
later: "Позже"
goToMisskey: "К Misskey"
goToMisskey: "К CherryPick"
additionalEmojiDictionary: "Дополнительные словари эмодзи"
installed: "Установлено"
branding: "Бренд"
@ -1085,6 +1084,7 @@ doYouAgree: "Согласны?"
icon: "Аватар"
replies: "Ответы"
renotes: "Репост"
loadReplies: "Показать ответы"
flip: "Переворот"
_initialAccountSetting:
accountCreated: "Аккаунт успешно создан!"
@ -1095,7 +1095,12 @@ _initialAccountSetting:
skipAreYouSure: "Пропустить настройку?"
_initialTutorial:
_note:
description: "Посты в Misskey называются 'Заметками.' Заметки отсортированы в хронологическом порядке в ленте и обновляются в режиме реального времени."
description: "Посты в CherryPick называются 'Заметками.' Заметки отсортированы в хронологическом порядке в ленте и обновляются в режиме реального времени."
_timelineDescription:
home: "В персональной ленте располагаются заметки тех, на которых вы подписаны."
local: "Местная лента показывает заметки всех пользователей этого сайта."
social: "В социальной ленте собирается всё, что есть в персональной и местной лентах."
global: "В глобальную ленту попадает вообще всё со связанных инстансов."
_serverSettings:
iconUrl: "Адрес на иконку роли"
_achievements:
@ -1674,6 +1679,14 @@ _ago:
monthsAgo: "{n} мес. назад"
yearsAgo: "{n} г. назад"
invalid: "Ничего нет"
_timeIn:
seconds: "Через {n} с"
minutes: "Через {n} мин"
hours: "Через {n} ч"
days: "Через {n} сут"
weeks: "Через {n} нед."
months: "Через {n} мес."
years: "Через {n} г."
_time:
second: "с"
minute: "мин"
@ -1790,7 +1803,7 @@ _widgets:
clicker: "Счётчик щелчков"
_cw:
hide: "Спрятать"
show: "Показать еще"
show: "Показать"
chars: "знаков: {count}"
files: "файлов: {count}"
_poll:

View file

@ -411,7 +411,6 @@ share: "Zdieľať"
notFound: "Nenájdené"
notFoundDescription: "Nenašla sa žiadna stránka na zadanej URL."
uploadFolder: "Predvolený priečinok pre nahrávanie"
cacheClear: "Vyčistiť cache"
markAsReadAllNotifications: "Označiť všetky oznámenia ako prečítané"
markAsReadAllUnreadNotes: "Označiť všetky poznámky ako prečítané"
markAsReadAllTalkMessages: "Označiť všetky správy ako prečítané"

View file

@ -195,6 +195,7 @@ perHour: "ทุกชั่วโมง"
perDay: "ต่อวัน"
stopActivityDelivery: "หยุดส่งกิจกรรม"
blockThisInstance: "บล็อกอินสแตนซ์นี้"
silenceThisInstance: "ปกปิดอินสแตนซ์นี้"
operations: "ดำเนินการ"
software: "ซอฟต์แวร์"
version: "เวอร์ชั่น"
@ -214,6 +215,7 @@ clearCachedFiles: "ล้างแคช"
clearCachedFilesConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะลบไฟล์ระยะไกลที่แคชไว้ทั้งหมด?"
blockedInstances: "อินสแตนซ์ที่ ถูกบล็อก"
blockedInstancesDescription: "ระบุชื่อโฮสต์ของอินสแตนซ์ที่คุณต้องการบล็อก อินสแตนซ์ที่อยู่ในรายการนั้นจะไม่สามารถพูดคุยกับอินสแตนซ์นี้ได้อีกต่อไป"
silencedInstances: "ปกปิดอินสแตนซ์นี้แล้ว"
muteAndBlock: "ปิดเสียงและบล็อก"
mutedUsers: "ผู้ใช้ที่ถูกปิดเสียง"
blockedUsers: "ผู้ใช้ที่ถูกบล็อก"
@ -434,7 +436,6 @@ share: "แชร์"
notFound: "ไม่พบหน้าที่ต้องการ"
notFoundDescription: "ไม่พบหน้าที่สอดคล้องตรงกันกับ URL นี้นะ"
uploadFolder: "โฟลเดอร์เริ่มต้นสำหรับอัพโหลด"
cacheClear: "ล้างแคช"
markAsReadAllNotifications: "ทำเครื่องหมายการแจ้งเตือนทั้งหมดว่าอ่านแล้ว"
markAsReadAllUnreadNotes: "ทำเครื่องหมายโน้ตทั้งหมดว่าอ่านแล้ว"
markAsReadAllTalkMessages: "ทำเครื่องหมายข้อความทั้งหมดว่าอ่านแล้ว"
@ -572,6 +573,10 @@ output: "เอาท์พุต"
script: "สคริปต์"
disablePagesScript: "ปิดการใช้งาน AiScript บนเพจ"
updateRemoteUser: "อัปเดตข้อมูลผู้ใช้งานระยะไกล"
unsetUserAvatar: "เลิกตั้งอวตาร"
unsetUserAvatarConfirm: "คุณแน่ใจหรือไม่ว่าต้องการเลิกตั้งอวตาร?"
unsetUserBanner: "เลิกตั้งแบนเนอร์"
unsetUserBannerConfirm: "คุณแน่ใจหรือไม่ว่าต้องการเลิกตั้งแบนเนอร์เลยมั้ย?"
deleteAllFiles: "ลบไฟล์ทั้งหมด"
deleteAllFilesConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะลบไฟล์ทั้งหมด?"
removeAllFollowing: "เลิกติดตามผู้ใช้ที่ติดตามทั้งหมด"
@ -643,6 +648,7 @@ smtpSecure: "ใช้โดยนัย SSL/TLS สำหรับการเ
smtpSecureInfo: "ปิดสิ่งนี้เมื่อใช้ STARTTLS"
testEmail: "ทดสอบการส่งอีเมล"
wordMute: "ปิดเสียงคำ"
hardWordMute: "ปิดเสียงคำยาก"
regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป"
regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:"
instanceMute: "ปิดเสียง อินสแตนซ์"
@ -989,6 +995,7 @@ assign: "กำหนด"
unassign: "ยังไม่มอบหมาย"
color: "สี"
manageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
manageAvatarDecorations: "จัดการตกแต่งอวตาร"
youCannotCreateAnymore: "คุณถึงขีดจํากัดการสร้างแล้วนะ"
cannotPerformTemporary: "ไม่สามารถใช้การได้ชั่วคราว"
cannotPerformTemporaryDescription: "ไม่สามารถดําเนินการได้ชั่วคราว เนื่องจากเกินขีดจํากัดการดําเนินการ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง"
@ -1146,7 +1153,19 @@ impressumUrl: "URL อิมเพรสชั่น"
privacyPolicy: "นโยบายความเป็นส่วนตัว"
privacyPolicyUrl: "URL นโยบายความเป็นส่วนตัว"
tosAndPrivacyPolicy: "เงื่อนไขในการให้บริการและนโยบายความเป็นส่วนตัว"
avatarDecorations: "การตกแต่งอวตาร"
attach: "แนบ"
detach: "นำออก"
angle: "แองเกิล"
flip: "ย้อนกลับ"
showAvatarDecorations: "แสดงตกแต่งอวตาร"
releaseToRefresh: "ปล่อยเพื่อรีเฟรช"
refreshing: "กำลังรีเฟรช..."
pullDownToRefresh: "ดึงลงเพื่อรีเฟรช"
disableStreamingTimeline: "ปิดใช้งานอัปเดตไทม์ไลน์แบบเรียลไทม์"
useGroupedNotifications: "แสดงผลการแจ้งเตือนแบบกลุ่มแล้ว"
signupPendingError: "มีปัญหาในการตรวจสอบที่อยู่อีเมลลิงก์อาจหมดอายุแล้ว"
doReaction: "เพิ่มรีแอคชั่น"
_announcement:
forExistingUsers: "ผู้ใช้งานที่มีอยู่เท่านั้น"
forExistingUsersDescription: "การประกาศนี้จะแสดงต่อผู้ใช้ที่มีอยู่ ณ จุดที่เผยแพร่นั้นๆถ้าหากเปิดใช้งาน ถ้าหากปิดใช้งานผู้ที่กำลังสมัครใหม่หลังจากโพสต์แล้วนั้นก็จะเห็นเช่นกัน"
@ -1156,6 +1175,7 @@ _announcement:
tooManyActiveAnnouncementDescription: "การมีประกาศที่ใช้งานมากเกินไปนั้นอาจจะทำให้ประสบการณ์ของผู้ใช้งานนั้นดูแย่ลง โปรดกรุณาพิจารณาการเก็บประกาศที่ล้าสมัยด้วยนะค่ะ"
readConfirmTitle: "ทำเครื่องหมายบอกว่าอ่านแล้วเลยมั้ย?"
readConfirmText: "การดำเนินการนี้จะทำเครื่องหมายเนื้อหาของ \"{title}\" บอกว่าอ่านแล้วนะ"
silence: "ไม่มีการแจ้งเตือน"
_initialAccountSetting:
accountCreated: "คุณได้สร้างบัญชีของคุณสำเร็จเรียบร้อยแล้ว!"
letsStartAccountSetup: "สำหรับผู้เริ่มต้นมาตั้งค่าโปรไฟล์ของคุณกันเถอะ"
@ -1168,8 +1188,31 @@ _initialAccountSetting:
pushNotificationDescription: "กำลังเปิดใช้งานการแจ้งเตือนแบบพุชจะช่วยให้คุณได้รับการแจ้งเตือนจาก {name} โดยตรงบนอุปกรณ์ของคุณนะ"
initialAccountSettingCompleted: "ตั้งค่าโปรไฟล์เสร็จสมบูรณ์แล้ว!"
haveFun: "ขอให้สนุก {name}!"
startTutorial: "เริ่มการฝึกสอน"
skipAreYouSure: "ต้องการข้ามการตั้งค่าโปรไฟล์จริงๆแบบนั้นหรอ?"
laterAreYouSure: "ต้องการตั้งค่าโปรไฟล์ในภายหลังจริงๆอย่างงั้นหรอ?"
_initialTutorial:
launchTutorial: "เริ่มบทช่วยสอน"
title: "บทช่วยสอน"
wellDone: "ทำได้ดีมาก!"
skipAreYouSure: "ต้องการออกจากบทช่วยสอนใช่ไหม?"
_landing:
title: "ยินดีต้อนรับสู่บทช่วยสอน"
_note:
title: "โน้ตคืออะไร?"
_reaction:
title: "รีแอคชั่นคืออะไร?"
_timeline:
title: "แนวคิดเรื่องของไทม์ไลน์"
_postNote:
title: "ตั้งค่ากำลังโพสต์โน้ต"
_visibility:
description: "คุณสามารถจำกัดผู้ที่สามารถดูโน้ตของคุณได้นะ"
public: "โน้ตของคุณนั้นจะปรากฏแก่ผู้ใช้งานทุกคน"
_cw:
title: "คำเตือนเกี่ยวกับเนื้อหา"
_exampleNote:
cw: "นี่อาจจะทำให้คุณหิวอย่างแน่นอน!"
_serverRules:
description: "ชุดของกฎที่จะแสดงก่อนการลงทะเบียนเราขอแนะนำให้ตั้งค่าสรุปข้อกำหนดในการให้บริการ"
_serverSettings:
@ -1482,6 +1525,7 @@ _role:
inviteLimitCycle: "จำกัดการเชิญไว้คูลดาวน์"
inviteExpirationTime: "วันหมดอายุของรหัสการเชิญ"
canManageCustomEmojis: "จัดการอีโมจิแบบกำหนดเอง"
canManageAvatarDecorations: "จัดการตกแต่งอวตาร"
driveCapacity: "ความจุของไดรฟ์"
alwaysMarkNsfw: "ทำเครื่องหมายไฟล์ว่าเป็น NSFW เสมอ"
pinMax: "จํานวนสูงสุดของโน้ตที่ปักหมุดไว้"
@ -2222,3 +2266,15 @@ _fileViewer:
uploadedAt: "วันที่เข้าร่วม"
attachedNotes: "โน้ตที่แนบมาด้วย"
thisPageCanBeSeenFromTheAuthor: "หน้าเพจนี้จะสามารถปรากฏได้โดยผู้ใช้ที่อัปโหลดไฟล์นี้เท่านั้น"
_externalResourceInstaller:
_plugin:
metaTitle: "ข้อมูลส่วนเสริม"
_theme:
metaTitle: "ข้อมูลธีม"
_vendorInfo:
title: "ข้อมูลผู้จัดจำหน่าย"
_errors:
_pluginParseFailed:
title: "ข้อผิดพลาด AiScript"
_themeParseFailed:
title: "การแยกวิเคราะห์ธีมล้มเหลว"

View file

@ -408,7 +408,6 @@ share: "Поділитись"
notFound: "Не знайдено"
notFoundDescription: "Сторінка за вказаною адресою не знайдена."
uploadFolder: "Місце для завантаження за замовчуванням"
cacheClear: "Очистити кеш"
markAsReadAllNotifications: "Позначити всі сповіщення як прочитані"
markAsReadAllUnreadNotes: "Позначити всі нотатки як прочитані"
markAsReadAllTalkMessages: "Позначити всі повідомлення як прочитані"

View file

@ -428,7 +428,6 @@ share: "Yuborish"
notFound: "Topilmadi"
notFoundDescription: "Ushbu sahifa topilmadi"
uploadFolder: "Jildni yuklash"
cacheClear: "Keshni tozalash"
markAsReadAllNotifications: "Bildirishnomalarni o'qilgan deb belgilash"
markAsReadAllUnreadNotes: "Barch xabarlarni oq'ilgan deb belgilash"
markAsReadAllTalkMessages: "Barcha suhbatlarni o'qilgan deb belgilang"
@ -650,7 +649,7 @@ createNewClip: "Yangi klip yaratish"
unclip: "qirqish\n"
confirmToUnclipAlreadyClippedNote: "Ushbu xat allaqachon \"{name}\" klipga tegishli. Uni ushbu klipdan olib tashlashni xohlaysizmi?"
public: "Ommaviy"
i18nInfo: "Misskey bir qancha volontyorlar yordamida bir qancha tillarga tarjima qilingan. Ushbu {link} orqali ularga yordam berishingiz mumkin."
i18nInfo: "CherryPick bir qancha volontyorlar yordamida bir qancha tillarga tarjima qilingan. Ushbu {link} orqali ularga yordam berishingiz mumkin."
manageAccessTokens: "Kirish tokenlarini boshqarish"
accountInfo: "Akkount haqida ma'lumot"
notesCount: "Xatlar soni"
@ -778,7 +777,7 @@ hashtags: "Hashteglar"
troubleshooting: "Muammolarni bartaraf qilish"
useBlurEffect: "Interfeysda xiralashtiruvchi effektlardan foydalanish"
learnMore: "Batafsilroq"
misskeyUpdated: "Misskey yangilandi!"
misskeyUpdated: "CherryPick yangilandi!"
whatIsNew: "O'zgarishlarni ko'rish"
translate: "Tarjima qilish"
translatedFrom: "{x} tilidan tarjima qilindi"

View file

@ -433,7 +433,6 @@ share: "Chia sẻ"
notFound: "Không tìm thấy"
notFoundDescription: "Không tìm thấy trang nào tương ứng với URL này."
uploadFolder: "Thư mục tải lên mặc định"
cacheClear: "Xóa bộ nhớ đệm"
markAsReadAllNotifications: "Đánh dấu tất cả các thông báo là đã đọc"
markAsReadAllUnreadNotes: "Đánh dấu tất cả các tút là đã đọc"
markAsReadAllTalkMessages: "Đánh dấu tất cả các tin nhắn là đã đọc"
@ -1037,7 +1036,7 @@ position: "Vị trí"
serverRules: "Luật của máy chủ"
youFollowing: "Đang theo dõi"
later: "Để sau"
goToMisskey: "Tới Misskey"
goToMisskey: "Tới CherryPick"
installed: "Đã tải xuống"
branding: "Thương hiệu"
turnOffToImprovePerformance: "Tắt mục này có thể cải thiện hiệu năng."
@ -1092,7 +1091,7 @@ _accountMigration:
moveFromLabel: "Tài khoản gốc #{n}"
moveTo: "Chuyển tài khoản này vào một tài khoản khác"
moveCannotBeUndone: "Việc chuyển tài khoản không thể huỷ."
moveAccountDescription: "Điều này sẽ chuyển tài khoản này sang một tài khoản khác.\n ・Những người theo dõi sẽ tự động được chuyển sang tài khoản mới\n ・Tài khoản này sẽ tự bỏ theo dõi những người mà bạn đã theo dõi trước đây\n ・Bạn sẽ không thể đăng tút mới, v.v trên tài khoản này\n\nDù việc chuyển người theo dõi được diễn ra tự động, bạn vẫn phải tự chuẩn bị một vài bước để chuyển danh sách những người dùng bạn đang theo dõi. Để làm vậy, vui lòng thực hiện việc xuất dữ liệu những người dùng đã theo dõi mà sau này bạn sẽ dùng để nhập vào tài khoản mới ở menu Cài đặt. Hành động tương tự áp dụng với danh sách những người dùng bị chặn hoặc tắt tiếng.\n\n(Điều này áp dụng cho phiên bản Misskey v13.12.0 và sau này. Các phần mềm ActivityPub khác , ví dụ như Mastodon, sẽ có thể hoạt động khác đi.)"
moveAccountDescription: "Điều này sẽ chuyển tài khoản này sang một tài khoản khác.\n ・Những người theo dõi sẽ tự động được chuyển sang tài khoản mới\n ・Tài khoản này sẽ tự bỏ theo dõi những người mà bạn đã theo dõi trước đây\n ・Bạn sẽ không thể đăng tút mới, v.v trên tài khoản này\n\nDù việc chuyển người theo dõi được diễn ra tự động, bạn vẫn phải tự chuẩn bị một vài bước để chuyển danh sách những người dùng bạn đang theo dõi. Để làm vậy, vui lòng thực hiện việc xuất dữ liệu những người dùng đã theo dõi mà sau này bạn sẽ dùng để nhập vào tài khoản mới ở menu Cài đặt. Hành động tương tự áp dụng với danh sách những người dùng bị chặn hoặc tắt tiếng.\n\n(Điều này áp dụng cho phiên bản CherryPick v13.12.0 và sau này. Các phần mềm ActivityPub khác , ví dụ như Mastodon, sẽ có thể hoạt động khác đi.)"
startMigration: "Chuyển"
movedAndCannotBeUndone: "\nTài khoản này đã được chuyển đi.\nViệc di chuyển tài khoản không thể bị huỷ bỏ."
movedTo: "Tài khoản mới:"
@ -1168,7 +1167,7 @@ _achievements:
title: "Khách hàng thường xuyên cấp III"
description: "Tổng số ngày đăng nhập đạt 400 ngày"
_login1000:
flavor: "Cảm ơn bạn đã sử dụng Misskey!"
flavor: "Cảm ơn bạn đã sử dụng CherryPick!"
_noteFavorited1:
title: "Nhà thiên văn học"
_myNoteFavorited1:
@ -1231,9 +1230,9 @@ _achievements:
description: "Tìm thấy được những kho báu cất giấu"
_client30min:
title: "Giải lao xỉu"
description: "Giữ Misskey mở trong ít nhất 30 phút"
description: "Giữ CherryPick mở trong ít nhất 30 phút"
_client60min:
description: "Giữ Misskey mở trong ít nhất 60 phút"
description: "Giữ CherryPick mở trong ít nhất 60 phút"
_noteDeletedWithin1min:
title: "Xem như không có gì đâu nha"
_postedAtLateNight:

View file

@ -311,6 +311,7 @@ folderName: "文件夹名称"
createFolder: "创建文件夹"
renameFolder: "重命名文件夹"
deleteFolder: "删除文件夹"
folder: "文件夹"
addFile: "添加文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
@ -437,7 +438,6 @@ share: "分享"
notFound: "未找到"
notFoundDescription: "没有与指定 URL 对应的页面。"
uploadFolder: "默认上传文件夹"
cacheClear: "清空缓存"
markAsReadAllNotifications: "将所有通知标为已读"
markAsReadAllUnreadNotes: "将所有帖子标记为已读"
markAsReadAllTalkMessages: "将所有聊天标记为已读"
@ -1145,6 +1145,7 @@ mutualFollow: "互相关注"
fileAttachedOnly: "仅限媒体"
showRepliesToOthersInTimeline: "在时间线上显示给其他人的回复"
hideRepliesToOthersInTimeline: "在时间线上隐藏给其他人的回复"
avatarDecorations: "头像挂件"
flip: "翻转"
_announcement:
forExistingUsers: "仅限现有用户"
@ -1792,6 +1793,9 @@ _ago:
monthsAgo: "{n} 月前"
yearsAgo: "{n} 年前"
invalid: "没有"
_timeIn:
seconds: "{n}秒后"
days: "{n}天后"
_time:
second: "秒"
minute: "分"
@ -2215,3 +2219,7 @@ _moderationLogTypes:
_fileViewer:
url: "URL"
uploadedAt: "添加日期"
_externalResourceInstaller:
_errors:
_pluginParseFailed:
title: "AiScript 错误"

View file

@ -261,6 +261,7 @@ removed: "已刪除"
removeAreYouSure: "確定要刪掉「{x}」嗎?"
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
resetAreYouSure: "確定要重設嗎?"
areYouSure: "您確定要移除所有裝飾嗎?"
saved: "已儲存"
messaging: "聊天"
upload: "上傳"
@ -292,13 +293,13 @@ birthday: "生日"
yearsOld: "{age} 歲"
registeredDate: "註冊日期"
location: "位置"
theme: "外觀主題"
themeForLightMode: "在淺色模式下使用的主題"
themeForDarkMode: "在深色模式下使用的主題"
theme: "佈景主題"
themeForLightMode: "在淺色模式下使用的佈景主題"
themeForDarkMode: "在深色模式下使用的佈景主題"
light: "淺色"
dark: "深色"
lightThemes: "淺色主題"
darkThemes: "深色主題"
lightThemes: "淺色佈景主題"
darkThemes: "深色佈景主題"
syncDeviceDarkMode: "與設備的深色模式同步"
drive: "雲端硬碟"
fileName: "檔案名稱"
@ -311,6 +312,7 @@ folderName: "資料夾名稱"
createFolder: "新增資料夾"
renameFolder: "重新命名資料夾"
deleteFolder: "刪除資料夾"
folder: "資料夾"
addFile: "加入附件"
emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
@ -437,7 +439,6 @@ share: "分享"
notFound: "查無項目"
notFoundDescription: "查無此頁"
uploadFolder: "預設上傳資料夾"
cacheClear: "清除快取"
markAsReadAllNotifications: "標記所有通知為已讀"
markAsReadAllUnreadNotes: "標記所有貼文為已讀"
markAsReadAllTalkMessages: "標記所有訊息為已讀"
@ -556,6 +557,8 @@ showInPage: "在頁面中顯示"
popout: "彈出式視窗"
volume: "音量"
masterVolume: "主音量"
notUseSound: "關閉音效"
useSoundOnlyWhenActive: "瀏覽器在前景運作時CherryPick 才會發出音效"
details: "詳細資訊"
chooseEmoji: "選擇您的表情符號"
unableToProcess: "操作無法完成"
@ -576,6 +579,10 @@ output: "輸出"
script: "腳本"
disablePagesScript: "停用頁面的 AiScript 腳本"
updateRemoteUser: "更新遠端使用者資訊"
unsetUserAvatar: "移除使用者的大頭貼"
unsetUserAvatarConfirm: "確定要移除使用者的大頭貼嗎?"
unsetUserBanner: "移除使用者的橫幅圖像"
unsetUserBannerConfirm: "確定要移除使用者的橫幅圖像嗎?"
deleteAllFiles: "刪除所有檔案"
deleteAllFilesConfirm: "要刪除所有檔案嗎?"
removeAllFollowing: "解除所有追隨"
@ -601,12 +608,12 @@ deletedNote: "已刪除的貼文"
invisibleNote: "私密的貼文"
enableInfiniteScroll: "啟用自動滾動頁面模式"
visibility: "可見性"
poll: "票"
poll: "選活動"
useCw: "隱藏內容"
enablePlayer: "開啟播放器"
disablePlayer: "關閉播放器"
expandTweet: "展開推文"
themeEditor: "主題編輯器"
themeEditor: "佈景主題編輯器"
description: "描述"
describeFile: "新增標題"
enterFileDescription: "輸入標題"
@ -647,6 +654,7 @@ smtpSecure: "在 SMTP 連接中使用隱式 SSL/TLS"
smtpSecureInfo: "使用 STARTTLS 時關閉。"
testEmail: "測試郵件發送"
wordMute: "被靜音的文字"
hardWordMute: "硬文字靜音"
regexpError: "正規表達式錯誤"
regexpErrorDescription: "{tab} 靜音文字的第 {line} 行的正規表達式有錯誤:"
instanceMute: "被靜音的實例"
@ -843,7 +851,7 @@ previewNoteText: "預覽文本"
customCss: "自定義 CSS"
customCssWarn: "這個設定必須由具備相關知識的人員操作,不當的設定可能導致客戶端無法正常使用。"
global: "全域"
squareAvatars: "頭像以方形顯示"
squareAvatars: "大頭貼以方形顯示"
sent: "發送"
received: "收取"
searchResult: "搜尋結果"
@ -896,13 +904,13 @@ overridedDeviceKind: "裝置類型"
smartphone: "智慧型手機"
tablet: "平板"
auto: "自動"
themeColor: "主題顏色"
themeColor: "佈景主題顏色"
size: "大小"
numberOfColumn: "列數"
searchByGoogle: "搜尋"
instanceDefaultLightTheme: "實例預設的淺色主題"
instanceDefaultDarkTheme: "實例預設的深色主題"
instanceDefaultThemeDescription: "輸入物件形式的主題代碼"
instanceDefaultLightTheme: "實例預設的淺色佈景主題"
instanceDefaultDarkTheme: "實例預設的深色佈景主題"
instanceDefaultThemeDescription: "輸入物件形式的佈景主題代碼"
mutePeriod: "靜音的期限"
period: "期限"
indefinitely: "無期限"
@ -1034,6 +1042,8 @@ resetPasswordConfirm: "重設密碼?"
sensitiveWords: "敏感詞"
sensitiveWordsDescription: "將含有設定詞彙的貼文可見性設為發送至首頁。可以用換行來進行複數的設定。"
sensitiveWordsDescription2: "空格代表「以及」AND斜線包圍關鍵字代表使用正規表達式。"
hiddenTags: "隱藏標籤"
hiddenTagsDescription: "設定的標籤不會在趨勢中顯示,換行可以設定多個標籤。"
notesSearchNotAvailable: "無法使用搜尋貼文功能。"
license: "授權"
unfavoriteConfirm: "要取消收錄我的最愛嗎?"
@ -1046,6 +1056,7 @@ enableChartsForRemoteUser: "生成遠端使用者的圖表"
enableChartsForFederatedInstances: "生成遠端伺服器的圖表"
showClipButtonInNoteFooter: "新增摘錄按鈕至貼文"
reactionsDisplaySize: "反應的顯示尺寸"
limitWidthOfReaction: "限制反應的最大寬度,並縮小顯示尺寸。"
noteIdOrUrl: "貼文ID或URL"
video: "影片"
videos: "影片"
@ -1161,6 +1172,7 @@ tosAndPrivacyPolicy: "服務條款和隱私政策"
avatarDecorations: "頭像裝飾"
attach: "裝上"
detach: "取下"
detachAll: "移除所有裝飾"
angle: "角度"
flip: "翻轉"
showAvatarDecorations: "顯示頭像裝飾"
@ -1172,6 +1184,9 @@ useGroupedNotifications: "分組顯示通知訊息"
signupPendingError: "驗證您的電子郵件地址時出現問題。連結可能已過期。"
cwNotationRequired: "如果開啟「隱藏內容」,則需要註解說明。"
doReaction: "做出反應"
code: "程式碼"
reloadRequiredToApplySettings: "需要重新載入頁面設定才能生效。"
remainingN: "剩餘:{n}"
_announcement:
forExistingUsers: "僅限既有的使用者"
forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。"
@ -1555,7 +1570,9 @@ _role:
assignTarget: "指派目標"
descriptionOfAssignTarget: "<b>手動</b>是以手動管理這個角色包含的人員。\n<b>符合條件</b>是設定條件以自動包含符合條件的使用者。"
manual: "手動"
manualRoles: "手動角色"
conditional: "符合條件"
conditionalRoles: "有條件的角色"
condition: "條件"
isConditionalRole: "這是條件角色。"
isPublic: "角色為公開"
@ -1605,6 +1622,7 @@ _role:
canHideAds: "不顯示廣告"
canSearchNotes: "可否搜尋貼文"
canUseTranslator: "使用翻譯功能"
avatarDecorationLimit: "頭像裝飾的最大設置量"
_condition:
isLocal: "本地使用者"
isRemote: "遠端使用者"
@ -1816,17 +1834,17 @@ _instanceMute:
title: "將隱藏被設定的實例貼文。"
heading: "將實例靜音"
_theme:
explore: "取得佈景主題"
explore: "探索佈景主題"
install: "安裝佈景主題"
manage: "佈景主題管理員"
code: "主題代碼"
manage: "管理佈景主題"
code: "佈景主題代碼"
description: "描述"
installed: "{name}已安裝"
installedThemes: "已經安裝的主題"
builtinThemes: "標準主題"
alreadyInstalled: "此主題已經安裝"
invalid: "主題格式錯誤"
make: "製作主題"
installedThemes: "已經安裝的佈景主題"
builtinThemes: "標準佈景主題"
alreadyInstalled: "已安裝佈景主題"
invalid: "佈景主題格式錯誤"
make: "製作佈景主題"
base: "基於"
addConstant: "添加常數"
constant: "常數"
@ -1843,7 +1861,7 @@ _theme:
darken: "暗度"
lighten: "亮度"
inputConstantName: "請輸入常數名稱"
importInfo: "您可以在此貼上主題代碼,將其匯入編輯器中"
importInfo: "您可以在此貼上佈景主題代碼,將其匯入編輯器中"
deleteConstantConfirm: "確定要刪除常數{const}嗎?"
keys:
accent: "重點色彩"
@ -1894,6 +1912,14 @@ _sfx:
chatBg: "聊天背景"
antenna: "天線接收"
channel: "頻道通知"
reaction: "選擇反應時"
_soundSettings:
driveFile: "使用雲端硬碟的音效檔案"
driveFileWarn: "請選擇雲端硬碟中的檔案"
driveFileTypeWarn: "不支援此檔案"
driveFileTypeWarnDescription: "請選擇音效檔案"
driveFileDurationWarn: "音效太長了"
driveFileDurationWarnDescription: "使用長音效檔可能會影響 CherryPick 的使用體驗。仍要使用此檔案嗎?"
_ago:
future: "未來"
justNow: "剛剛"
@ -2039,6 +2065,7 @@ _widgets:
_userList:
chooseList: "選擇清單"
clicker: "點擊器"
birthdayFollowings: "今天生日的使用者"
_cw:
hide: "隱藏"
show: "顯示內容"
@ -2048,7 +2075,7 @@ _poll:
noOnlyOneChoice: "需要至少兩個選項。"
choiceN: "選項 {n}"
noMore: "沒辦法再添加選項了"
canMultipleVote: "可以多次投票"
canMultipleVote: "允許複選"
expiration: "期限"
infinite: "無期限"
at: "結束時間"
@ -2057,7 +2084,7 @@ _poll:
deadlineTime: "小時"
duration: "時長"
votesCount: "{n} 票"
totalVotes: "合共 {n} 票"
totalVotes: "一共{n}票"
vote: "投票"
showResult: "顯示結果"
voted: "已投票"
@ -2101,6 +2128,7 @@ _profile:
changeAvatar: "更換大頭貼"
changeBanner: "變更橫幅圖像"
verifiedLinkDescription: "如果輸入包含您個人資料的網站 URL欄位旁邊將出現驗證圖示。"
avatarDecorationMax: "最多可以設置{max}個裝飾。"
_exportOrImport:
allNotes: "所有貼文"
favoritedNotes: "「我的最愛」貼文"
@ -2115,7 +2143,7 @@ _charts:
federation: "聯邦宇宙"
apRequest: "請求"
usersIncDec: "使用者增減"
usersTotal: "使用者合共"
usersTotal: "使用者總數"
activeUsers: "活躍使用者"
notesIncDec: "貼文増減"
localNotesIncDec: "本地貼文増減"
@ -2342,6 +2370,8 @@ _moderationLogTypes:
createAvatarDecoration: "建立頭像裝飾"
updateAvatarDecoration: "更新頭像裝飾"
deleteAvatarDecoration: "刪除頭像裝飾"
unsetUserAvatar: "移除使用者的大頭貼"
unsetUserBanner: "移除使用者的橫幅圖像"
_fileViewer:
title: "檔案詳細資訊"
type: "檔案類型 "
@ -2357,8 +2387,8 @@ _externalResourceInstaller:
title: "要安裝此外掛嘛?"
metaTitle: "外掛資訊"
_theme:
title: "要安裝此外觀主題嘛"
metaTitle: "外觀主題資訊"
title: "要安裝此佈景主題嗎"
metaTitle: "佈景主題資訊"
_meta:
base: "基本配色方案"
_vendorInfo:
@ -2386,8 +2416,21 @@ _externalResourceInstaller:
title: "外掛安裝失敗"
description: "安裝插件時出現問題。請再試一次。請參閱 Javascript 控制台以取得錯誤詳細資訊。"
_themeParseFailed:
title: "外觀主題解析錯誤"
description: "已取得資料但解析外觀主題時發生錯誤,導致無法載入。請聯絡主題作者。請檢查 Javascript 控制台以取得錯誤詳細資訊。"
title: "佈景主題解析錯誤"
description: "已取得資料但解析佈景主題時發生錯誤,導致無法載入。請聯絡佈景主題作者。請檢查 Javascript 控制台以取得錯誤詳細資訊。"
_themeInstallFailed:
title: "無法安裝外觀主題"
description: "安裝外觀主題時出現問題。請再試一次。請參閱 Javascript 控制台以取得錯誤詳細資訊。"
title: "無法安裝佈景主題"
description: "安裝佈景主題時出現問題。請再試一次。請參閱 Javascript 控制台以取得錯誤詳細資訊。"
_dataSaver:
_media:
title: "載入媒體檔案"
description: "防止自動載入圖片和影片。點擊隱藏的圖片/影片即可載入。"
_avatar:
title: "大頭貼"
description: "停止顯示大頭貼的動畫。由於動畫圖片的檔案大小可能比普通圖片大,這可以進一步減少資料流量。"
_urlPreview:
title: "網址預覽縮圖"
description: "將不再自動載入網址預覽縮圖。"
_code:
title: "程式碼突出顯示"
description: "如果使用了 MFM 的程式碼突顯標記,則在點擊之前不會載入。程式碼突顯要求加載每種程式語言的突顯定義檔案,但由於這些檔案不再自動載入,因此有望減少資料流量。"

View file

@ -1,7 +1,7 @@
{
"name": "cherrypick",
"version": "4.6.0-beta.3",
"basedMisskeyVersion": "2023.12.0-beta.3",
"basedMisskeyVersion": "2023.12.0-beta.4",
"codename": "nasubi",
"repository": {
"type": "git",
@ -57,8 +57,8 @@
"typescript": "5.3.3"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "6.13.2",
"@typescript-eslint/parser": "6.13.2",
"@typescript-eslint/eslint-plugin": "6.14.0",
"@typescript-eslint/parser": "6.14.0",
"cross-env": "7.0.3",
"cypress": "13.6.1",
"eslint": "8.55.0",

View file

@ -11,7 +11,7 @@
"decoratorMetadata": true
},
"experimental": {
"keepImportAttributes": true
"keepImportAssertions": true
},
"baseUrl": "src",
"paths": {

View file

@ -93,7 +93,7 @@
"bcryptjs": "2.4.3",
"blurhash": "2.0.5",
"body-parser": "1.20.2",
"bullmq": "4.15.2",
"bullmq": "4.15.3",
"cacheable-lookup": "7.0.0",
"cbor": "9.0.1",
"chalk": "5.3.0",
@ -106,7 +106,7 @@
"content-disposition": "0.5.4",
"date-fns": "2.30.0",
"deep-email-validator": "0.1.21",
"fastify": "4.24.3",
"fastify": "4.25.0",
"fastify-raw-body": "4.3.0",
"feed": "4.2.2",
"file-type": "18.7.0",
@ -152,7 +152,7 @@
"ratelimiter": "3.4.1",
"re2": "1.20.9",
"redis-lock": "0.1.4",
"reflect-metadata": "0.1.14",
"reflect-metadata": "0.2.0",
"rename": "1.0.4",
"rss-parser": "3.13.0",
"rxjs": "7.8.1",
@ -176,7 +176,7 @@
"ulid": "2.3.0",
"vary": "1.1.2",
"web-push": "3.6.6",
"ws": "8.14.2",
"ws": "8.15.1",
"xev": "3.0.2"
},
"devDependencies": {
@ -222,8 +222,8 @@
"@types/vary": "1.1.3",
"@types/web-push": "3.6.3",
"@types/ws": "8.5.10",
"@typescript-eslint/eslint-plugin": "6.13.2",
"@typescript-eslint/parser": "6.13.2",
"@typescript-eslint/eslint-plugin": "6.14.0",
"@typescript-eslint/parser": "6.14.0",
"aws-sdk-client-mock": "3.0.0",
"cross-env": "7.0.3",
"eslint": "8.55.0",

View file

@ -36,7 +36,7 @@ html
link(rel='prefetch' href=infoImageUrl)
link(rel='prefetch' href=notFoundImageUrl)
//- https://github.com/misskey-dev/misskey/issues/9842
link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.37.0')
link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.44.0')
link(rel='modulepreload' href=`/vite/${clientEntry.file}`)
if !config.clientManifestExists

View file

@ -11,7 +11,7 @@
"decoratorMetadata": true
},
"experimental": {
"keepImportAttributes": true
"keepImportAssertions": true
},
"baseUrl": "src",
"paths": {

View file

@ -25,8 +25,8 @@
"@swc/jest": "0.2.29",
"@types/jest": "29.5.11",
"@types/node": "20.10.4",
"@typescript-eslint/eslint-plugin": "6.13.2",
"@typescript-eslint/parser": "6.13.2",
"@typescript-eslint/eslint-plugin": "6.14.0",
"@typescript-eslint/parser": "6.14.0",
"eslint": "8.55.0",
"jest": "29.7.0",
"jest-fetch-mock": "3.0.3",

View file

@ -1,6 +1,6 @@
<link rel="preload" href="https://github.com/kokonect-link/cherrypick/blob/master/packages/frontend/assets/about-icon.png?raw=true" as="image" type="image/png" crossorigin="anonymous">
<link rel="preload" href="https://github.com/kokonect-link/cherrypick/blob/master/packages/frontend/assets/fedi.jpg?raw=true" as="image" type="image/jpeg" crossorigin="anonymous">
<link rel="stylesheet" href="https://unpkg.com/@tabler/icons-webfont@2.37.0/tabler-icons.min.css">
<link rel="stylesheet" href="https://unpkg.com/@tabler/icons-webfont@2.44.0/tabler-icons.min.css">
<link rel="stylesheet" href="https://unpkg.com/@fontsource/m-plus-rounded-1c/index.css">
<style>
html {

View file

@ -21,13 +21,13 @@
"@fontsource/jetbrains-mono": "^5.0.12",
"@github/webauthn-json": "2.1.1",
"@rollup/plugin-alias": "5.1.0",
"@rollup/plugin-json": "6.0.1",
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-replace": "5.0.5",
"@rollup/pluginutils": "5.1.0",
"@syuilo/aiscript": "0.16.0",
"@tabler/icons-webfont": "2.37.0",
"@vitejs/plugin-vue": "4.5.1",
"@vue/compiler-sfc": "3.3.9",
"@tabler/icons-webfont": "2.44.0",
"@vitejs/plugin-vue": "4.5.2",
"@vue/compiler-sfc": "3.3.11",
"astring": "1.8.6",
"autosize": "6.0.1",
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.0.6",
@ -61,7 +61,7 @@
"prismjs": "1.29.0",
"punycode": "2.3.1",
"querystring": "0.2.1",
"rollup": "4.7.0",
"rollup": "4.9.0",
"sanitize-html": "2.11.0",
"shiki": "0.14.6",
"sass": "1.69.5",
@ -79,7 +79,7 @@
"uuid": "9.0.1",
"v-code-diff": "1.7.2",
"vanilla-tilt": "1.8.1",
"vite": "5.0.7",
"vite": "5.0.8",
"vue": "3.3.11",
"vue-prism-editor": "2.0.0-alpha.2",
"vuedraggable": "next"
@ -118,8 +118,8 @@
"@types/uuid": "9.0.7",
"@types/websocket": "1.0.10",
"@types/ws": "8.5.10",
"@typescript-eslint/eslint-plugin": "6.13.2",
"@typescript-eslint/parser": "6.13.2",
"@typescript-eslint/eslint-plugin": "6.14.0",
"@typescript-eslint/parser": "6.14.0",
"@vitest/coverage-v8": "0.34.6",
"@vue/runtime-core": "3.3.11",
"acorn": "8.11.2",
@ -135,7 +135,7 @@
"msw": "1.3.2",
"msw-storybook-addon": "1.10.0",
"nodemon": "3.0.2",
"prettier": "3.1.0",
"prettier": "3.1.1",
"react": "18.2.0",
"react-dom": "18.2.0",
"start-server-and-test": "2.0.3",

View file

@ -17,7 +17,7 @@ import { unisonReload, reloadChannel } from '@/scripts/unison-reload.js';
// TODO: 他のタブと永続化されたstateを同期
type Account = Misskey.entities.MeDetailed;
type Account = Misskey.entities.MeDetailed & { token: string };
const accountData = miLocalStorage.getItem('account');

View file

@ -122,10 +122,11 @@ import { $i } from '@/account.js';
const props = withDefaults(defineProps<{
showPinned?: boolean;
asReactionPicker?: boolean;
pinnedEmojis?: string[];
maxHeight?: number;
asDrawer?: boolean;
asWindow?: boolean;
asReactionPicker?: boolean; // 使使
}>(), {
showPinned: true,
});
@ -138,18 +139,16 @@ const searchEl = shallowRef<HTMLInputElement>();
const emojisEl = shallowRef<HTMLDivElement>();
const {
reactions: pinnedReactions,
reactionPickerSize,
reactionPickerWidth,
reactionPickerHeight,
disableShowingAnimatedImages,
emojiPickerScale,
emojiPickerWidth,
emojiPickerHeight,
recentlyUsedEmojis,
} = defaultStore.reactiveState;
const pinned = computed(() => props.asReactionPicker ? pinnedReactions.value : []); // TODO: pinned
const size = computed(() => props.asReactionPicker ? reactionPickerSize.value : 1);
const width = computed(() => props.asReactionPicker ? reactionPickerWidth.value : 3);
const height = computed(() => props.asReactionPicker ? reactionPickerHeight.value : 2);
const pinned = computed(() => props.pinnedEmojis);
const size = computed(() => emojiPickerScale.value);
const width = computed(() => emojiPickerWidth.value);
const height = computed(() => emojiPickerHeight.value);
const q = ref<string>('');
const searchResultCustom = ref<Misskey.entities.EmojiSimple[]>([]);
const searchResultUnicode = ref<UnicodeEmojiDef[]>([]);
@ -369,7 +368,7 @@ function chosen(emoji: any, ev?: MouseEvent) {
emit('chosen', key);
// 使
if (!pinned.value.includes(key)) {
if (!pinned.value?.includes(key)) {
let recents = defaultStore.state.recentlyUsedEmojis;
recents = recents.filter((emoji: any) => emoji !== key);
recents.unshift(key);

View file

@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
ref="modal"
v-slot="{ type, maxHeight }"
:zPriority="'middle'"
:preferType="asReactionPicker && defaultStore.state.reactionPickerUseDrawerForMobile === false ? 'popup' : 'auto'"
:preferType="!defaultStore.state.emojiPickerUseDrawerForMobile ? 'popup' : 'auto'"
:transparentBg="true"
:manualShowing="manualShowing"
:src="src"
@ -22,6 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
class="_shadow"
:class="{ [$style.drawer]: type === 'drawer', _popup: !defaultStore.state.useBlurEffect || !defaultStore.state.useBlurEffectForModal || !defaultStore.state.removeModalBgColorForBlur, _popupAcrylic: defaultStore.state.useBlurEffect && defaultStore.state.useBlurEffectForModal && defaultStore.state.removeModalBgColorForBlur }"
:showPinned="showPinned"
:pinnedEmojis="pinnedEmojis"
:asReactionPicker="asReactionPicker"
:asDrawer="type === 'drawer'"
:max-height="maxHeight"
@ -40,11 +41,13 @@ const props = withDefaults(defineProps<{
manualShowing?: boolean | null;
src?: HTMLElement;
showPinned?: boolean;
pinnedEmojis?: string[],
asReactionPicker?: boolean;
choseAndClose?: boolean;
}>(), {
manualShowing: null,
showPinned: true,
pinnedEmojis: undefined,
asReactionPicker: false,
choseAndClose: true,
});

View file

@ -26,11 +26,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ i18n.ts.optional }})</span></template>
<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
</MkInput>
<MkInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model="values[item]" type="text">
<MkInput v-else-if="form[item].type === 'string' && !form[item].multiline" v-model="values[item]" type="text" :mfmAutocomplete="form[item].treatAsMfm">
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ i18n.ts.optional }})</span></template>
<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
</MkInput>
<MkTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model="values[item]">
<MkTextarea v-else-if="form[item].type === 'string' && form[item].multiline" v-model="values[item]" :mfmAutocomplete="form[item].treatAsMfm" :mfmPreview="form[item].treatAsMfm">
<template #label><span v-text="form[item].label || item"></span><span v-if="form[item].required === false"> ({{ i18n.ts.optional }})</span></template>
<template v-if="form[item].description" #caption>{{ form[item].description }}</template>
</MkTextarea>

View file

@ -43,11 +43,12 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { onMounted, nextTick, ref, shallowRef, watch, computed, toRefs } from 'vue';
import { onMounted, onUnmounted, nextTick, ref, shallowRef, watch, computed, toRefs } from 'vue';
import { debounce } from 'throttle-debounce';
import MkButton from '@/components/MkButton.vue';
import { useInterval } from '@/scripts/use-interval.js';
import { i18n } from '@/i18n.js';
import { Autocomplete, SuggestionType } from '@/scripts/autocomplete.js';
const props = defineProps<{
modelValue: string | number | null;
@ -59,6 +60,7 @@ const props = defineProps<{
placeholder?: string;
autofocus?: boolean;
autocomplete?: string;
mfmAutocomplete?: boolean | SuggestionType[],
autocapitalize?: string;
spellcheck?: boolean;
step?: any;
@ -93,6 +95,7 @@ const height =
props.small ? 33 :
props.large ? 39 :
36;
let autocomplete: Autocomplete;
const focus = () => inputEl.value.focus();
const onInput = (ev: KeyboardEvent) => {
@ -166,6 +169,16 @@ onMounted(() => {
focus();
}
});
if (props.mfmAutocomplete) {
autocomplete = new Autocomplete(inputEl.value, v, props.mfmAutocomplete === true ? null : props.mfmAutocomplete);
}
});
onUnmounted(() => {
if (autocomplete) {
autocomplete.detach();
}
});
defineExpose({

View file

@ -923,7 +923,7 @@ async function insertEmoji(ev: MouseEvent) {
},
() => {
textAreaReadOnly.value = false;
focus();
nextTick(() => focus());
},
);
}

View file

@ -162,12 +162,13 @@ if (!mock) {
<style lang="scss" module>
.root {
display: inline-flex;
align-items: center;
height: 38px;
margin: 2px;
padding: 0 12px;
font-size: 1.35em;
border-radius: 999px;
align-items: center;
justify-content: center;
&.canToggle {
background: var(--buttonBg);
@ -206,7 +207,7 @@ if (!mock) {
&.reacted, &.reacted:hover {
background: var(--accentedBg);
color: var(--accent);
box-shadow: 0 0 0px 1px var(--accent) inset;
box-shadow: 0 0 0 1px var(--accent) inset;
> .count {
color: var(--accent);

View file

@ -26,16 +26,21 @@ SPDX-License-Identifier: AGPL-3.0-only
></textarea>
</div>
<div :class="$style.caption"><slot name="caption"></slot></div>
<button style="font-size: 0.85em;" class="_textButton" type="button" @click="preview = !preview">{{ i18n.ts.preview }}</button>
<div v-show="preview" v-panel :class="$style.mfmPreview">
<Mfm :text="v"/>
</div>
<MkButton v-if="manualSave && changed" primary :class="$style.save" @click="updated"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
</div>
</template>
<script lang="ts" setup>
import { onMounted, nextTick, ref, watch, computed, toRefs, shallowRef } from 'vue';
import { onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs, shallowRef } from 'vue';
import { debounce } from 'throttle-debounce';
import MkButton from '@/components/MkButton.vue';
import { i18n } from '@/i18n.js';
import { Autocomplete, SuggestionType } from '@/scripts/autocomplete.js';
const props = defineProps<{
modelValue: string | null;
@ -46,6 +51,8 @@ const props = defineProps<{
placeholder?: string;
autofocus?: boolean;
autocomplete?: string;
mfmAutocomplete?: boolean | SuggestionType[],
mfmPreview?: boolean;
spellcheck?: boolean;
debounce?: boolean;
manualSave?: boolean;
@ -68,6 +75,8 @@ const changed = ref(false);
const invalid = ref(false);
const filled = computed(() => v.value !== '' && v.value != null);
const inputEl = shallowRef<HTMLTextAreaElement>();
const preview = ref(false);
let autocomplete: Autocomplete;
const focus = () => inputEl.value.focus();
const onInput = (ev) => {
@ -113,6 +122,16 @@ onMounted(() => {
focus();
}
});
if (props.mfmAutocomplete) {
autocomplete = new Autocomplete(inputEl.value, v, props.mfmAutocomplete === true ? null : props.mfmAutocomplete);
}
});
onUnmounted(() => {
if (autocomplete) {
autocomplete.detach();
}
});
</script>
@ -194,4 +213,12 @@ onMounted(() => {
.save {
margin: 8px 0 0 0;
}
.mfmPreview {
padding: 12px;
border-radius: var(--radius);
box-sizing: border-box;
min-height: 130px;
pointer-events: none;
}
</style>

View file

@ -6,6 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<div :class="[$style.root, { [$style.rootFirst]: first }]">
<div :class="[$style.label, { [$style.labelFirst]: first }]"><slot name="label"></slot></div>
<div :class="[$style.description]"><slot name="description"></slot></div>
<div :class="$style.main">
<slot></slot>
</div>
@ -31,7 +32,7 @@ defineProps<{
.label {
font-weight: bold;
padding: 1.5em 0 0 0;
margin: 0 0 16px 0;
margin: 0 0 8px 0;
&:empty {
display: none;
@ -45,4 +46,10 @@ defineProps<{
.main {
margin: 1.5em 0 0 0;
}
.description {
font-size: 0.85em;
color: var(--fgTransparentWeak);
margin: 0 0 8px 0;
}
</style>

View file

@ -49,7 +49,7 @@ const props = withDefaults(defineProps<{
target?: string | null;
link?: boolean;
preview?: boolean;
decorations?: Misskey.entities.UserDetailed['avatarDecorations'][number][];
decorations?: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>[];
forceShowDecoration?: boolean;
}>(), {
target: null,
@ -81,24 +81,24 @@ function onClick(ev: MouseEvent): void {
emit('click', ev);
}
function getDecorationAngle(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationAngle(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const angle = decoration.angle ?? 0;
return angle === 0 ? undefined : `${angle * 360}deg`;
}
function getDecorationScale(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationScale(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const scaleX = decoration.flipH ? -1 : 1;
return scaleX === 1 ? undefined : `${scaleX} 1`;
}
function getDecorationTransform(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationTransform(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const scale = decoration.scale ?? 1;
const moveX = decoration.moveX ?? 0;
const moveY = decoration.moveY ?? 0;
return `${scale === 1 ? '' : `scale(${scale})`} ${moveX === 0 && moveY === 0 ? '' : `translate(${moveX}%, ${moveY}%)`}`;
}
function getDecorationOpacity(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationOpacity(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const opacity = decoration.opacity ?? 1;
return opacity === 1 ? undefined : opacity;
}

View file

@ -71,7 +71,7 @@ const props = withDefaults(defineProps<{
link?: boolean;
preview?: boolean;
indicator?: boolean;
decorations?: Misskey.entities.UserDetailed['avatarDecorations'][number][];
decorations?: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>[];
forceShowDecoration?: boolean;
}>(), {
target: null,
@ -104,24 +104,24 @@ function onClick(ev: MouseEvent): void {
emit('click', ev);
}
function getDecorationAngle(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationAngle(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const angle = decoration.angle ?? 0;
return angle === 0 ? undefined : `${angle * 360}deg`;
}
function getDecorationScale(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationScale(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const scaleX = decoration.flipH ? -1 : 1;
return scaleX === 1 ? undefined : `${scaleX} 1`;
}
function getDecorationTransform(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationTransform(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const scale = decoration.scale ?? 1;
const moveX = decoration.moveX ?? 0;
const moveY = decoration.moveY ?? 0;
return `${scale === 1 ? '' : `scale(${scale})`} ${moveX === 0 && moveY === 0 ? '' : `translate(${moveX}%, ${moveY}%)`}`;
}
function getDecorationOpacity(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationOpacity(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const opacity = decoration.opacity ?? 1;
return opacity === 1 ? undefined : opacity;
}

View file

@ -38,7 +38,7 @@ type MfmProps = {
isNote?: boolean;
emojiUrls?: string[];
rootScale?: number;
nyaize: boolean | 'respect';
nyaize?: boolean | 'respect';
parsedNodes?: mfm.MfmNode[] | null;
enableEmojiMenu?: boolean;
enableEmojiMenuReaction?: boolean;

View file

@ -4,33 +4,33 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<component :is="link ? MkA : 'span'" v-user-preview="preview ? user.id : undefined" v-bind="bound" class="_noSelect" :class="$style.root" :style="{ color }" :title="acct(user)" @click.stop="onClick">
<MkImgWithBlurhash
:class="$style.inner"
:src="url"
:hash="user.avatarBlurhash"
:cover="true"
:onlyAvgColor="true"
@mouseover="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = true : ''"
@mouseout="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = false : ''"
@touchstart="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = true : ''"
@touchend="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = false : ''"
/>
<template v-if="showDecoration">
<img
v-for="decoration in decorations ?? user.avatarDecorations"
:class="[$style.decoration]"
:src="decoration.url"
:style="{
<component :is="link ? MkA : 'span'" v-user-preview="preview ? user.id : undefined" v-bind="bound" class="_noSelect" :class="$style.root" :style="{ color }" :title="acct(user)" @click.stop="onClick">
<MkImgWithBlurhash
:class="$style.inner"
:src="url"
:hash="user.avatarBlurhash"
:cover="true"
:onlyAvgColor="true"
@mouseover="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = true : ''"
@mouseout="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = false : ''"
@touchstart="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = true : ''"
@touchend="defaultStore.state.showingAnimatedImages === 'interaction' ? playAnimation = false : ''"
/>
<template v-if="showDecoration">
<img
v-for="decoration in decorations ?? user.avatarDecorations"
:class="[$style.decoration]"
:src="decoration.url"
:style="{
rotate: getDecorationAngle(decoration),
scale: getDecorationScale(decoration),
transform: getDecorationTransform(decoration),
opacity: getDecorationOpacity(decoration),
}"
alt=""
>
</template>
</component>
alt=""
>
</template>
</component>
</template>
<script lang="ts" setup>
@ -48,7 +48,7 @@ const props = withDefaults(defineProps<{
target?: string | null;
link?: boolean;
preview?: boolean;
decorations?: Misskey.entities.UserDetailed['avatarDecorations'][number][];
decorations?: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>[];
forceShowDecoration?: boolean;
}>(), {
target: null,
@ -80,24 +80,24 @@ function onClick(ev: MouseEvent): void {
emit('click', ev);
}
function getDecorationAngle(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationAngle(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const angle = decoration.angle ?? 0;
return angle === 0 ? undefined : `${angle * 360}deg`;
}
function getDecorationScale(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationScale(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const scaleX = decoration.flipH ? -1 : 1;
return scaleX === 1 ? undefined : `${scaleX} 1`;
}
function getDecorationTransform(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationTransform(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const scale = decoration.scale ?? 1;
const moveX = decoration.moveX ?? 0;
const moveY = decoration.moveY ?? 0;
return `${scale === 1 ? '' : `scale(${scale})`} ${moveX === 0 && moveY === 0 ? '' : `translate(${moveX}%, ${moveY}%)`}`;
}
function getDecorationOpacity(decoration: Misskey.entities.UserDetailed['avatarDecorations'][number]) {
function getDecorationOpacity(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) {
const opacity = decoration.opacity ?? 1;
return opacity === 1 ? undefined : opacity;
}

View file

@ -25,7 +25,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkInput v-model="announcement.title">
<template #label>{{ i18n.ts.title }}</template>
</MkInput>
<MkTextarea v-model="announcement.text">
<MkTextarea v-model="announcement.text" mfmAutocomplete :mfmPreview="true">
<template #label>{{ i18n.ts.text }}</template>
</MkTextarea>
<MkInput v-model="announcement.imageUrl" type="url">
@ -75,7 +75,6 @@ import { ref, computed } from 'vue';
import XHeader from './_header_.vue';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkRadios from '@/components/MkRadios.vue';
import MkInfo from '@/components/MkInfo.vue';
@ -83,6 +82,7 @@ import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import MkFolder from '@/components/MkFolder.vue';
import MkTextarea from '@/components/MkTextarea.vue';
const announcements = ref<any[]>([]);

View file

@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #label>{{ i18n.ts.name }}</template>
</MkInput>
<MkTextarea v-model="description">
<MkTextarea v-model="description" mfmAutocomplete :mfmPreview="true">
<template #label>{{ i18n.ts.description }}</template>
</MkTextarea>
@ -70,7 +70,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed, ref, watch, defineAsyncComponent } from 'vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkColorInput from '@/components/MkColorInput.vue';
@ -81,6 +80,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
import { i18n } from '@/i18n.js';
import MkFolder from '@/components/MkFolder.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkTextarea from '@/components/MkTextarea.vue';
const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default));

View file

@ -101,6 +101,7 @@ const headerActions = computed(() => clip.value && isOwned.value ? [{
type: 'string',
required: false,
multiline: true,
treatAsMfm: true,
label: i18n.ts.description,
default: clip.value.description,
},

View file

@ -57,6 +57,7 @@ async function create() {
type: 'string',
required: false,
multiline: true,
treatAsMfm: true,
label: i18n.ts.description,
},
isPublic: {

View file

@ -9,16 +9,17 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #header><i class="ti ti-align-left"></i> {{ i18n.ts._pages.blocks.text }}</template>
<section>
<textarea v-model="text" :class="$style.textarea"></textarea>
<textarea ref="inputEl" v-model="text" :class="$style.textarea"></textarea>
</section>
</XContainer>
</template>
<script lang="ts" setup>
/* eslint-disable vue/no-mutating-props */
import { watch, ref } from 'vue';
import { watch, ref, shallowRef, onMounted, onUnmounted } from 'vue';
import XContainer from '../page-editor.container.vue';
import { i18n } from '@/i18n.js';
import { Autocomplete } from '@/scripts/autocomplete.js';
const props = defineProps<{
modelValue: any
@ -28,7 +29,10 @@ const emit = defineEmits<{
(ev: 'update:modelValue', value: any): void;
}>();
let autocomplete: Autocomplete;
const text = ref(props.modelValue.text ?? '');
const inputEl = shallowRef<HTMLTextAreaElement | null>(null);
watch(text, () => {
emit('update:modelValue', {
@ -36,6 +40,14 @@ watch(text, () => {
text: text.value,
});
});
onMounted(() => {
autocomplete = new Autocomplete(inputEl.value, text);
});
onUnmounted(() => {
autocomplete.detach();
});
</script>
<style lang="scss" module>

View file

@ -0,0 +1,274 @@
<!--
SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div class="_gaps_m">
<MkFolder :defaultOpen="true">
<template #icon><i class="ti ti-pin"></i></template>
<template #label>{{ i18n.ts.pinned }} ({{ i18n.ts.reaction }})</template>
<template #caption>{{ i18n.ts.pinnedEmojisForReactionSettingDescription }}</template>
<div class="_gaps">
<div>
<div v-panel style="border-radius: 6px;">
<Sortable
v-model="pinnedEmojisForReaction"
:class="$style.emojis"
:itemKey="item => item"
:animation="150"
:delay="100"
:delayOnTouchOnly="true"
>
<template #item="{element}">
<button class="_button" :class="$style.emojisItem" @click="removeReaction(element, $event)">
<MkCustomEmoji v-if="element[0] === ':'" :name="element" :normal="true"/>
<MkEmoji v-else :emoji="element" :normal="true"/>
</button>
</template>
<template #footer>
<button class="_button" :class="$style.emojisAdd" @click="chooseReaction">
<i class="ti ti-plus"></i>
</button>
</template>
</Sortable>
</div>
<div :class="$style.editorCaption">{{ i18n.ts.reactionSettingDescription2 }}</div>
</div>
<div class="_buttons">
<MkButton inline @click="previewReaction"><i class="ti ti-eye"></i> {{ i18n.ts.preview }}</MkButton>
<MkButton inline danger @click="setDefaultReaction"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</MkButton>
<MkButton inline danger @click="copyFromPinnedEmojis"><i class="ti ti-copy"></i> {{ i18n.ts.copyFromPinnedEmojis }}</MkButton>
</div>
</div>
</MkFolder>
<MkFolder>
<template #icon><i class="ti ti-pin"></i></template>
<template #label>{{ i18n.ts.pinned }} ({{ i18n.ts.general }})</template>
<template #caption>{{ i18n.ts.pinnedEmojisSettingDescription }}</template>
<div class="_gaps">
<div>
<div v-panel style="border-radius: 6px;">
<Sortable
v-model="pinnedEmojis"
:class="$style.emojis"
:itemKey="item => item"
:animation="150"
:delay="100"
:delayOnTouchOnly="true"
>
<template #item="{element}">
<button class="_button" :class="$style.emojisItem" @click="removeEmoji(element, $event)">
<MkCustomEmoji v-if="element[0] === ':'" :name="element" :normal="true"/>
<MkEmoji v-else :emoji="element" :normal="true"/>
</button>
</template>
<template #footer>
<button class="_button" :class="$style.emojisAdd" @click="chooseEmoji">
<i class="ti ti-plus"></i>
</button>
</template>
</Sortable>
</div>
<div :class="$style.editorCaption">{{ i18n.ts.reactionSettingDescription2 }}</div>
</div>
<div class="_buttons">
<MkButton inline @click="previewEmoji"><i class="ti ti-eye"></i> {{ i18n.ts.preview }}</MkButton>
<MkButton inline danger @click="setDefaultEmoji"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</MkButton>
<MkButton inline danger @click="copyFromPinnedEmojisForReaction"><i class="ti ti-copy"></i> {{ i18n.ts.copyFromPinnedEmojisForReaction }}</MkButton>
</div>
</div>
</MkFolder>
<FormSection>
<template #label>{{ i18n.ts.emojiPickerDisplay }}</template>
<div class="_gaps_m">
<MkRadios v-model="emojiPickerScale">
<template #label>{{ i18n.ts.size }}</template>
<option :value="1">{{ i18n.ts.small }}</option>
<option :value="2">{{ i18n.ts.medium }}</option>
<option :value="3">{{ i18n.ts.large }}</option>
</MkRadios>
<MkRadios v-model="emojiPickerWidth">
<template #label>{{ i18n.ts.numberOfColumn }}</template>
<option :value="1">5</option>
<option :value="2">6</option>
<option :value="3">7</option>
<option :value="4">8</option>
<option :value="5">9</option>
</MkRadios>
<MkRadios v-model="emojiPickerHeight">
<template #label>{{ i18n.ts.height }}</template>
<option :value="1">{{ i18n.ts.small }}</option>
<option :value="2">{{ i18n.ts.medium }}</option>
<option :value="3">{{ i18n.ts.large }}</option>
<option :value="4">{{ i18n.ts.large }}+</option>
</MkRadios>
<MkSwitch v-model="emojiPickerUseDrawerForMobile">
{{ i18n.ts.useDrawerReactionPickerForMobile }}
<template #caption>{{ i18n.ts.needReloadToApply }}</template>
</MkSwitch>
</div>
</FormSection>
</div>
</template>
<script lang="ts" setup>
import { computed, ref, Ref, watch } from 'vue';
import Sortable from 'vuedraggable';
import MkRadios from '@/components/MkRadios.vue';
import MkButton from '@/components/MkButton.vue';
import FormSection from '@/components/form/section.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import * as os from '@/os.js';
import { defaultStore } from '@/store.js';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { deepClone } from '@/scripts/clone.js';
import { reactionPicker } from '@/scripts/reaction-picker.js';
import { emojiPicker } from '@/scripts/emoji-picker.js';
import MkCustomEmoji from '@/components/global/MkCustomEmoji.vue';
import MkEmoji from '@/components/global/MkEmoji.vue';
import MkFolder from '@/components/MkFolder.vue';
const pinnedEmojisForReaction: Ref<string[]> = ref(deepClone(defaultStore.state.reactions));
const pinnedEmojis: Ref<string[]> = ref(deepClone(defaultStore.state.pinnedEmojis));
const emojiPickerScale = computed(defaultStore.makeGetterSetter('emojiPickerScale'));
const emojiPickerWidth = computed(defaultStore.makeGetterSetter('emojiPickerWidth'));
const emojiPickerHeight = computed(defaultStore.makeGetterSetter('emojiPickerHeight'));
const emojiPickerUseDrawerForMobile = computed(defaultStore.makeGetterSetter('emojiPickerUseDrawerForMobile'));
const removeReaction = (reaction: string, ev: MouseEvent) => remove(pinnedEmojisForReaction, reaction, ev);
const chooseReaction = (ev: MouseEvent) => pickEmoji(pinnedEmojisForReaction, ev);
const setDefaultReaction = () => setDefault(pinnedEmojisForReaction);
const removeEmoji = (reaction: string, ev: MouseEvent) => remove(pinnedEmojis, reaction, ev);
const chooseEmoji = (ev: MouseEvent) => pickEmoji(pinnedEmojis, ev);
const setDefaultEmoji = () => setDefault(pinnedEmojis);
function previewReaction(ev: MouseEvent) {
reactionPicker.show(getHTMLElement(ev));
}
function previewEmoji(ev: MouseEvent) {
emojiPicker.show(getHTMLElement(ev));
}
async function copyFromPinnedEmojis() {
const { canceled } = await os.confirm({
type: 'warning',
text: 'a',
});
if (canceled) {
return;
}
pinnedEmojisForReaction.value = [...pinnedEmojis.value];
}
async function copyFromPinnedEmojisForReaction() {
const { canceled } = await os.confirm({
type: 'warning',
text: 'a',
});
if (canceled) {
return;
}
pinnedEmojis.value = [...pinnedEmojisForReaction.value];
}
function remove(itemsRef: Ref<string[]>, reaction: string, ev: MouseEvent) {
os.popupMenu([{
text: i18n.ts.remove,
action: () => {
itemsRef.value = itemsRef.value.filter(x => x !== reaction);
},
}], getHTMLElement(ev));
}
async function setDefault(itemsRef: Ref<string[]>) {
const { canceled } = await os.confirm({
type: 'warning',
text: i18n.ts.resetAreYouSure,
});
if (canceled) return;
itemsRef.value = deepClone(defaultStore.def.reactions.default);
}
async function pickEmoji(itemsRef: Ref<string[]>, ev: MouseEvent) {
os.pickEmoji(getHTMLElement(ev), {
showPinned: false,
}).then(it => {
const emoji = it as string;
if (!itemsRef.value.includes(emoji)) {
itemsRef.value.push(emoji);
}
});
}
function getHTMLElement(ev: MouseEvent): HTMLElement {
const target = ev.currentTarget ?? ev.target;
return target as HTMLElement;
}
watch(pinnedEmojisForReaction, () => {
defaultStore.set('reactions', pinnedEmojisForReaction.value);
}, {
deep: true,
});
watch(pinnedEmojis, () => {
defaultStore.set('pinnedEmojis', pinnedEmojis.value);
}, {
deep: true,
});
definePageMetadata({
title: i18n.ts.emojiPicker,
icon: 'ti ti-mood-happy',
});
</script>
<style lang="scss" module>
.tab {
margin: calc(var(--margin) / 2) 0;
padding: calc(var(--margin) / 2) 0;
background: var(--bg);
}
.emojis {
padding: 12px;
font-size: 1.1em;
}
.emojisItem {
display: inline-block;
padding: 8px;
cursor: move;
}
.emojisAdd {
display: inline-block;
padding: 8px;
}
.editorCaption {
font-size: 0.85em;
padding: 8px 0 0 0;
color: var(--fgTransparentWeak);
}
</style>

View file

@ -74,9 +74,9 @@ const menuDef = computed(() => [{
active: currentPage.value?.route.name === 'privacy',
}, {
icon: 'ti ti-mood-happy',
text: i18n.ts.reaction,
to: '/settings/reaction',
active: currentPage.value?.route.name === 'reaction',
text: i18n.ts.emojiPicker,
to: '/settings/emoji-picker',
active: currentPage.value?.route.name === 'emojiPicker',
}, {
icon: 'ti ti-cloud',
text: i18n.ts.drive,

View file

@ -84,10 +84,10 @@ const defaultStoreSaveKeys: (keyof typeof defaultStore['state'])[] = [
'useReactionPickerForContextMenu',
'showGapBetweenNotesInTimeline',
'instanceTicker',
'reactionPickerSize',
'reactionPickerWidth',
'reactionPickerHeight',
'reactionPickerUseDrawerForMobile',
'emojiPickerScale',
'emojiPickerWidth',
'emojiPickerHeight',
'emojiPickerUseDrawerForMobile',
'defaultSideView',
'menuDisplay',
'reportError',

View file

@ -0,0 +1,67 @@
<!--
SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div
:class="[$style.root, { [$style.active]: active }]"
@click="emit('click')"
>
<div :class="$style.name"><MkCondensedLine :minScale="0.5">{{ decoration.name }}</MkCondensedLine></div>
<MkAvatar style="width: 60px; height: 60px;" :user="$i" :decorations="[{ url: decoration.url, angle, flipH }]" forceShowDecoration/>
<i v-if="decoration.roleIdsThatCanBeUsedThisDecoration.length > 0 && !$i.roles.some(r => decoration.roleIdsThatCanBeUsedThisDecoration.includes(r.id))" :class="$style.lock" class="ti ti-lock"></i>
</div>
</template>
<script lang="ts" setup>
import { } from 'vue';
import { $i } from '@/account.js';
const props = defineProps<{
active?: boolean;
decoration: {
id: string;
url: string;
name: string;
roleIdsThatCanBeUsedThisDecoration: string[];
};
angle?: number;
flipH?: boolean;
}>();
const emit = defineEmits<{
(ev: 'click'): void;
}>();
</script>
<style lang="scss" module>
.root {
cursor: pointer;
padding: 16px 16px 28px 16px;
border: solid 2px var(--divider);
border-radius: 8px;
text-align: center;
font-size: 90%;
overflow: clip;
contain: content;
}
.active {
background-color: var(--accentedBg);
border-color: var(--accent);
}
.name {
position: relative;
z-index: 10;
font-weight: bold;
margin-bottom: 20px;
}
.lock {
position: absolute;
bottom: 12px;
right: 12px;
}
</style>

View file

@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSpacer :marginMin="20" :marginMax="28">
<div style="text-align: center;">
<div :class="$style.name">{{ decoration.name }}</div>
<MkAvatar style="width: 64px; height: 64px; margin-bottom: 20px;" :user="$i" :decorations="[...$i.avatarDecorations, { url: decoration.url, angle, flipH, scale, moveX, moveY, opacity }]" forceShowDecoration/>
<MkAvatar style="width: 64px; height: 64px; margin-bottom: 20px;" :user="$i" :decorations="decorationsForPreview" forceShowDecoration/>
</div>
<div class="_gaps_s">
<MkRange v-model="angle" continuousUpdate :min="-0.5" :max="0.5" :step="0.025" :textConverter="(v) => `${Math.floor(v * 360)}°`">
@ -42,9 +42,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkSpacer>
<div :class="$style.footer" class="_buttonsCenter">
<MkButton v-if="using" primary rounded @click="attach"><i class="ti ti-check"></i> {{ i18n.ts.update }}</MkButton>
<MkButton v-if="using" rounded @click="detach"><i class="ti ti-x"></i> {{ i18n.ts.detach }}</MkButton>
<MkButton v-else primary rounded @click="attach"><i class="ti ti-check"></i> {{ i18n.ts.attach }}</MkButton>
<MkButton v-if="usingIndex != null" primary rounded @click="update"><i class="ti ti-check"></i> {{ i18n.ts.update }}</MkButton>
<MkButton v-if="usingIndex != null" rounded @click="detach"><i class="ti ti-x"></i> {{ i18n.ts.detach }}</MkButton>
<MkButton v-else :disabled="exceeded" primary rounded @click="attach"><i class="ti ti-check"></i> {{ i18n.ts.attach }}</MkButton>
</div>
</div>
</MkModalWindow>
@ -56,40 +56,52 @@ import MkButton from '@/components/MkButton.vue';
import MkModalWindow from '@/components/MkModalWindow.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
import MkFolder from '@/components/MkFolder.vue';
import MkInfo from '@/components/MkInfo.vue';
import MkRange from '@/components/MkRange.vue';
import { $i } from '@/account.js';
const props = defineProps<{
usingIndex: number | null;
decoration: {
id: string;
url: string;
name: string;
}
};
}>();
const emit = defineEmits<{
(ev: 'closed'): void;
(ev: 'attach', payload: {
angle: number;
flipH: boolean;
scale: number;
moveX: number;
moveY: number;
opacity: number;
}): void;
(ev: 'update', payload: {
angle: number;
flipH: boolean;
scale: number;
moveX: number;
moveY: number;
opacity: number;
}): void;
(ev: 'detach'): void;
}>();
const dialog = shallowRef<InstanceType<typeof MkModalWindow>>();
const using = computed(() => $i.avatarDecorations.some(x => x.id === props.decoration.id));
const angle = ref(using.value ? $i.avatarDecorations.find(x => x.id === props.decoration.id).angle ?? 0 : 0);
const flipH = ref(using.value ? $i.avatarDecorations.find(x => x.id === props.decoration.id).flipH ?? false : false);
const scale = ref(using.value ? $i.avatarDecorations.find(x => x.id === props.decoration.id).scale ?? 1 : 1);
const moveX = ref(using.value ? $i.avatarDecorations.find(x => x.id === props.decoration.id).moveX ?? 0 : 0);
const moveY = ref(using.value ? $i.avatarDecorations.find(x => x.id === props.decoration.id).moveY ?? 0 : 0);
const opacity = ref(using.value ? $i.avatarDecorations.find(x => x.id === props.decoration.id).opacity ?? 1 : 1);
const exceeded = computed(() => ($i.policies.avatarDecorationLimit - $i.avatarDecorations.length) <= 0);
const angle = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].angle : null) ?? 0);
const flipH = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].flipH : null) ?? false);
const scale = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].scale : null) ?? 1);
const moveX = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].moveX : null) ?? 0);
const moveY = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].moveY : null) ?? 0);
const opacity = ref((props.usingIndex != null ? $i.avatarDecorations[props.usingIndex].opacity : null) ?? 1);
function cancel() {
dialog.value.close();
}
async function attach() {
const decorationsForPreview = computed(() => {
const decoration = {
id: props.decoration.id,
url: props.decoration.url,
angle: angle.value,
flipH: flipH.value,
scale: scale.value,
@ -97,22 +109,45 @@ async function attach() {
moveY: moveY.value,
opacity: opacity.value,
};
const update = [...$i.avatarDecorations, decoration];
await os.apiWithDialog('i/update', {
avatarDecorations: update,
});
$i.avatarDecorations = update;
const decorations = [...$i.avatarDecorations];
if (props.usingIndex != null) {
decorations[props.usingIndex] = decoration;
} else {
decorations.push(decoration);
}
return decorations;
});
function cancel() {
dialog.value.close();
}
async function update() {
emit('update', {
angle: angle.value,
flipH: flipH.value,
scale: scale.value,
moveX: moveX.value,
moveY: moveY.value,
opacity: opacity.value,
});
dialog.value.close();
}
async function attach() {
emit('attach', {
angle: angle.value,
flipH: flipH.value,
scale: scale.value,
moveX: moveX.value,
moveY: moveY.value,
opacity: opacity.value,
});
dialog.value.close();
}
async function detach() {
const update = $i.avatarDecorations.filter(x => x.id !== props.decoration.id);
await os.apiWithDialog('i/update', {
avatarDecorations: update,
});
$i.avatarDecorations = update;
emit('detach');
dialog.value.close();
}
</script>

View file

@ -0,0 +1,125 @@
<!--
SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div v-if="!loading" class="_gaps">
<MkInfo>{{ i18n.t('_profile.avatarDecorationMax', { max: $i.policies.avatarDecorationLimit }) }} ({{ i18n.t('remainingN', { n: $i.policies.avatarDecorationLimit - $i.avatarDecorations.length }) }})</MkInfo>
<div v-if="$i.avatarDecorations.length > 0" v-panel :class="$style.current" class="_gaps_s">
<div>{{ i18n.ts.inUse }}</div>
<div :class="$style.decorations">
<XDecoration
v-for="(avatarDecoration, i) in $i.avatarDecorations"
:decoration="avatarDecorations.find(d => d.id === avatarDecoration.id)"
:angle="avatarDecoration.angle"
:flipH="avatarDecoration.flipH"
:active="true"
@click="openDecoration(avatarDecoration, i)"
/>
</div>
<MkButton danger @click="detachAllDecorations">{{ i18n.ts.detachAll }}</MkButton>
</div>
<div :class="$style.decorations">
<XDecoration
v-for="avatarDecoration in avatarDecorations"
:key="avatarDecoration.id"
:decoration="avatarDecoration"
@click="openDecoration(avatarDecoration)"
/>
</div>
</div>
<div v-else>
<MkLoading/>
</div>
</template>
<script lang="ts" setup>
import { ref, defineAsyncComponent } from 'vue';
import * as Misskey from 'cherrypick-js';
import XDecoration from './profile.avatar-decoration.decoration.vue';
import MkButton from '@/components/MkButton.vue';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import MkInfo from '@/components/MkInfo.vue';
const loading = ref(true);
const avatarDecorations = ref<Misskey.entities.GetAvatarDecorationsResponse>([]);
os.api('get-avatar-decorations').then(_avatarDecorations => {
avatarDecorations.value = _avatarDecorations;
loading.value = false;
});
function openDecoration(avatarDecoration, index?: number) {
os.popup(defineAsyncComponent(() => import('./profile.avatar-decoration.dialog.vue')), {
decoration: avatarDecoration,
usingIndex: index,
}, {
'attach': async (payload) => {
const decoration = {
id: avatarDecoration.id,
angle: payload.angle,
flipH: payload.flipH,
};
const update = [...$i.avatarDecorations, decoration];
await os.apiWithDialog('i/update', {
avatarDecorations: update,
});
$i.avatarDecorations = update;
},
'update': async (payload) => {
const decoration = {
id: avatarDecoration.id,
angle: payload.angle,
flipH: payload.flipH,
};
const update = [...$i.avatarDecorations];
update[index] = decoration;
await os.apiWithDialog('i/update', {
avatarDecorations: update,
});
$i.avatarDecorations = update;
},
'detach': async () => {
const update = [...$i.avatarDecorations];
update.splice(index, 1);
await os.apiWithDialog('i/update', {
avatarDecorations: update,
});
$i.avatarDecorations = update;
},
}, 'closed');
}
function detachAllDecorations() {
os.confirm({
type: 'warning',
text: i18n.ts.areYouSure,
}).then(async ({ canceled }) => {
if (canceled) return;
await os.apiWithDialog('i/update', {
avatarDecorations: [],
});
$i.avatarDecorations = [];
});
}
</script>
<style lang="scss" module>
.current {
padding: 16px;
border-radius: var(--radius);
}
.decorations {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
grid-gap: 12px;
}
</style>

View file

@ -13,11 +13,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkButton primary rounded :class="$style.bannerEdit" @click="changeBanner">{{ i18n.ts._profile.changeBanner }}</MkButton>
</div>
<MkInput v-model="profile.name" :max="30" manualSave>
<MkInput v-model="profile.name" :max="30" manualSave :mfmAutocomplete="['emoji']">
<template #label>{{ i18n.ts._profile.name }}</template>
</MkInput>
<MkTextarea v-model="profile.description" :max="500" tall manualSave>
<MkTextarea v-model="profile.description" :max="500" tall manualSave mfmAutocomplete :mfmPreview="true" :nyaize="$i?.isCat ? 'respect' : undefined" :author="($i as Misskey.entities.UserLite)">
<template #label>{{ i18n.ts._profile.description }}</template>
<template #caption>{{ i18n.ts._profile.youCanIncludeHashtags }}</template>
</MkTextarea>
@ -87,24 +87,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #icon><i class="ti ti-sparkles"></i></template>
<template #label>{{ i18n.ts.avatarDecorations }}</template>
<div class="_gaps">
<MkInfo>{{ i18n.t('_profile.avatarDecorationMax', { max: $i?.policies.avatarDecorationLimit }) }} ({{ i18n.t('remainingN', { n: $i?.policies.avatarDecorationLimit - $i.avatarDecorations.length }) }})</MkInfo>
<MkButton v-if="$i.avatarDecorations.length > 0" danger @click="detachAllDecorations">{{ i18n.ts.detachAll }}</MkButton>
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); grid-gap: 12px;">
<div
v-for="avatarDecoration in avatarDecorations"
:key="avatarDecoration.id"
:class="[$style.avatarDecoration, { [$style.avatarDecorationActive]: $i.avatarDecorations.some(x => x.id === avatarDecoration.id) }]"
@click="openDecoration(avatarDecoration)"
>
<div :class="$style.avatarDecorationName"><MkCondensedLine :minScale="0.5">{{ avatarDecoration.name }}</MkCondensedLine></div>
<MkAvatar style="width: 60px; height: 60px;" :user="$i" :decorations="[{ url: avatarDecoration.url }]" forceShowDecoration/>
<i v-if="avatarDecoration.roleIdsThatCanBeUsedThisDecoration.length > 0 && !$i.roles.some(r => avatarDecoration.roleIdsThatCanBeUsedThisDecoration.includes(r.id))" :class="$style.avatarDecorationLock" class="ti ti-lock"></i>
</div>
</div>
</div>
<XAvatarDecoration/>
</MkFolder>
<MkFolder>
@ -128,10 +111,11 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, reactive, ref, watch, defineAsyncComponent, onMounted, onUnmounted } from 'vue';
import { computed, reactive, ref, watch, defineAsyncComponent } from 'vue';
import * as Misskey from 'cherrypick-js';
import XAvatarDecoration from './profile.avatar-decoration.vue';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkSelect from '@/components/MkSelect.vue';
import FormSplit from '@/components/form/split.vue';
@ -147,11 +131,11 @@ import { claimAchievement } from '@/scripts/achievements.js';
import { defaultStore } from '@/store.js';
import { unisonReload } from '@/scripts/unison-reload.js';
import MkInfo from '@/components/MkInfo.vue';
import MkTextarea from '@/components/MkTextarea.vue';
const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default));
const reactionAcceptance = computed(defaultStore.makeGetterSetter('reactionAcceptance'));
const avatarDecorations = ref<any[]>([]);
const profile = reactive({
name: $i.name,
@ -172,10 +156,6 @@ watch(() => profile, () => {
const fields = ref($i?.fields.map(field => ({ id: Math.random().toString(), name: field.name, value: field.value })) ?? []);
const fieldEditMode = ref(false);
os.api('get-avatar-decorations').then(_avatarDecorations => {
avatarDecorations.value = _avatarDecorations;
});
function addField() {
fields.value.push({
id: Math.random().toString(),
@ -285,25 +265,6 @@ function changeBanner(ev) {
});
}
function openDecoration(avatarDecoration) {
os.popup(defineAsyncComponent(() => import('./profile.avatar-decoration-dialog.vue')), {
decoration: avatarDecoration,
}, {}, 'closed');
}
function detachAllDecorations() {
os.confirm({
type: 'warning',
text: i18n.ts.areYouSure,
}).then(async ({ canceled }) => {
if (canceled) return;
await os.apiWithDialog('i/update', {
avatarDecorations: [],
});
$i.avatarDecorations = [];
});
}
async function reloadAsk() {
const { canceled } = await os.confirm({
type: 'info',
@ -408,33 +369,4 @@ definePageMetadata({
.dragItemForm {
flex-grow: 1;
}
.avatarDecoration {
cursor: pointer;
padding: 16px 16px 28px 16px;
border: solid 2px var(--divider);
border-radius: 8px;
text-align: center;
font-size: 90%;
overflow: clip;
contain: content;
}
.avatarDecorationActive {
background-color: var(--accentedBg);
border-color: var(--accent);
}
.avatarDecorationName {
position: relative;
z-index: 10;
font-weight: bold;
margin-bottom: 20px;
}
.avatarDecorationLock {
position: absolute;
bottom: 12px;
right: 12px;
}
</style>

View file

@ -1,159 +0,0 @@
<!--
SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div class="_gaps_m">
<FromSlot>
<template #label>{{ i18n.ts.reactionSettingDescription }}</template>
<div v-panel style="border-radius: 6px;">
<Sortable v-model="reactions" :class="$style.reactions" :itemKey="item => item" :animation="150" :delay="100" :delayOnTouchOnly="true">
<template #item="{element}">
<button class="_button" :class="$style.reactionsItem" @click="remove(element, $event)">
<MkCustomEmoji v-if="element[0] === ':'" :name="element" :normal="true"/>
<MkEmoji v-else :emoji="element" :normal="true"/>
</button>
</template>
<template #footer>
<button class="_button" :class="$style.reactionsAdd" @click="chooseEmoji"><i class="ti ti-plus"></i></button>
</template>
</Sortable>
</div>
<template #caption>{{ i18n.ts.reactionSettingDescription2 }} <button class="_textButton" @click="preview">{{ i18n.ts.preview }}</button></template>
</FromSlot>
<MkRadios v-model="reactionPickerSize">
<template #label>{{ i18n.ts.size }}</template>
<option :value="1">{{ i18n.ts.small }}</option>
<option :value="2">{{ i18n.ts.medium }}</option>
<option :value="3">{{ i18n.ts.large }}</option>
</MkRadios>
<MkRadios v-model="reactionPickerWidth">
<template #label>{{ i18n.ts.numberOfColumn }}</template>
<option :value="1">5</option>
<option :value="2">6</option>
<option :value="3">7</option>
<option :value="4">8</option>
<option :value="5">9</option>
</MkRadios>
<MkRadios v-model="reactionPickerHeight">
<template #label>{{ i18n.ts.height }}</template>
<option :value="1">{{ i18n.ts.small }}</option>
<option :value="2">{{ i18n.ts.medium }}</option>
<option :value="3">{{ i18n.ts.large }}</option>
<option :value="4">{{ i18n.ts.large }}+</option>
</MkRadios>
<MkSwitch v-model="reactionPickerUseDrawerForMobile">
{{ i18n.ts.useDrawerReactionPickerForMobile }}
<template #caption>{{ i18n.ts.needReloadToApply }}</template>
</MkSwitch>
<FormSection>
<div class="_buttons">
<MkButton inline @click="preview"><i class="ti ti-eye"></i> {{ i18n.ts.preview }}</MkButton>
<MkButton inline danger @click="setDefault"><i class="ti ti-reload"></i> {{ i18n.ts.default }}</MkButton>
</div>
</FormSection>
</div>
</template>
<script lang="ts" setup>
import { defineAsyncComponent, watch, ref, computed } from 'vue';
import Sortable from 'vuedraggable';
import MkRadios from '@/components/MkRadios.vue';
import FromSlot from '@/components/form/slot.vue';
import MkButton from '@/components/MkButton.vue';
import FormSection from '@/components/form/section.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import * as os from '@/os.js';
import { defaultStore } from '@/store.js';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { deepClone } from '@/scripts/clone.js';
const reactions = ref(deepClone(defaultStore.state.reactions));
const reactionPickerSize = computed(defaultStore.makeGetterSetter('reactionPickerSize'));
const reactionPickerWidth = computed(defaultStore.makeGetterSetter('reactionPickerWidth'));
const reactionPickerHeight = computed(defaultStore.makeGetterSetter('reactionPickerHeight'));
const reactionPickerUseDrawerForMobile = computed(defaultStore.makeGetterSetter('reactionPickerUseDrawerForMobile'));
function save() {
defaultStore.set('reactions', reactions.value);
}
function remove(reaction, ev: MouseEvent) {
os.popupMenu([{
text: i18n.ts.remove,
action: () => {
reactions.value = reactions.value.filter(x => x !== reaction);
},
}], ev.currentTarget ?? ev.target);
}
function preview(ev: MouseEvent) {
os.popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
asReactionPicker: true,
src: ev.currentTarget ?? ev.target,
}, {}, 'closed');
}
async function setDefault() {
const { canceled } = await os.confirm({
type: 'warning',
text: i18n.ts.resetAreYouSure,
});
if (canceled) return;
reactions.value = deepClone(defaultStore.def.reactions.default);
}
function chooseEmoji(ev: MouseEvent) {
os.pickEmoji(ev.currentTarget ?? ev.target, {
showPinned: false,
}).then(emoji => {
if (!reactions.value.includes(emoji)) {
reactions.value.push(emoji);
}
});
}
watch(reactions, () => {
save();
}, {
deep: true,
});
const headerActions = computed(() => []);
const headerTabs = computed(() => []);
definePageMetadata({
title: i18n.ts.reaction,
icon: 'ti ti-mood-happy',
action: {
icon: 'ti ti-eye',
handler: preview,
},
});
</script>
<style lang="scss" module>
.reactions {
padding: 12px;
font-size: 1.1em;
}
.reactionsItem {
display: inline-block;
padding: 8px;
cursor: move;
}
.reactionsAdd {
display: inline-block;
padding: 8px;
}
</style>

View file

@ -197,14 +197,14 @@ async function chooseChannel(ev: MouseEvent): Promise<void> {
const channels = await os.api('channels/my-favorites', {
limit: 100,
});
const items = [
const items: MenuItem[] = [
...channels.map(channel => ({
type: 'link' as const,
text: channel.name,
indicate: channel.hasUnreadNote,
to: `/channels/${channel.id}`,
})),
(channels.length === 0 ? undefined : null),
(channels.length === 0 ? undefined : { type: 'divider' }),
{
type: 'link' as const,
icon: 'ti ti-plus',

View file

@ -63,9 +63,9 @@ export const routes = [{
name: 'privacy',
component: page(() => import('./pages/settings/privacy.vue')),
}, {
path: '/reaction',
name: 'reaction',
component: page(() => import('./pages/settings/reaction.vue')),
path: '/emoji-picker',
name: 'emojiPicker',
component: page(() => import('./pages/settings/emoji-picker.vue')),
}, {
path: '/drive',
name: 'drive',

View file

@ -8,6 +8,8 @@ import getCaretCoordinates from 'textarea-caret';
import { toASCII } from 'punycode/';
import { popup } from '@/os.js';
export type SuggestionType = 'user' | 'hashtag' | 'emoji' | 'mfmTag';
export class Autocomplete {
private suggestion: {
x: Ref<number>;
@ -19,6 +21,7 @@ export class Autocomplete {
private currentType: string;
private textRef: Ref<string>;
private opening: boolean;
private onlyType: SuggestionType[];
private get text(): string {
// Use raw .value to get the latest value
@ -35,7 +38,7 @@ export class Autocomplete {
/**
*
*/
constructor(textarea: HTMLInputElement | HTMLTextAreaElement, textRef: Ref<string>) {
constructor(textarea: HTMLInputElement | HTMLTextAreaElement, textRef: Ref<string>, onlyType?: SuggestionType[]) {
//#region BIND
this.onInput = this.onInput.bind(this);
this.complete = this.complete.bind(this);
@ -46,6 +49,7 @@ export class Autocomplete {
this.textarea = textarea;
this.textRef = textRef;
this.opening = false;
this.onlyType = onlyType ?? ['user', 'hashtag', 'emoji', 'mfmTag'];
this.attach();
}
@ -95,7 +99,7 @@ export class Autocomplete {
let opened = false;
if (isMention) {
if (isMention && this.onlyType.includes('user')) {
const username = text.substring(mentionIndex + 1);
if (username !== '' && username.match(/^[a-zA-Z0-9_]+$/)) {
this.open('user', username);
@ -106,7 +110,7 @@ export class Autocomplete {
}
}
if (isHashtag && !opened) {
if (isHashtag && !opened && this.onlyType.includes('hashtag')) {
const hashtag = text.substring(hashtagIndex + 1);
if (!hashtag.includes(' ')) {
this.open('hashtag', hashtag);
@ -114,7 +118,7 @@ export class Autocomplete {
}
}
if (isEmoji && !opened) {
if (isEmoji && !opened && this.onlyType.includes('emoji')) {
const emoji = text.substring(emojiIndex + 1);
if (!emoji.includes(' ')) {
this.open('emoji', emoji);
@ -122,7 +126,7 @@ export class Autocomplete {
}
}
if (isMfmTag && !opened) {
if (isMfmTag && !opened && this.onlyType.includes('mfmTag')) {
const mfmTag = text.substring(mfmTagIndex + 1);
if (!mfmTag.includes(' ')) {
this.open('mfmTag', mfmTag.replace('[', ''));

View file

@ -3,8 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { defineAsyncComponent, Ref, ref } from 'vue';
import { defineAsyncComponent, Ref, ref, computed, ComputedRef } from 'vue';
import { popup } from '@/os.js';
import { defaultStore } from '@/store.js';
/**
*
@ -23,8 +24,10 @@ class EmojiPicker {
}
public async init() {
const emojisRef = defaultStore.reactiveState.pinnedEmojis;
await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
src: this.src,
pinnedEmojis: emojisRef,
asReactionPicker: false,
manualShowing: this.manualShowing,
choseAndClose: false,
@ -44,8 +47,8 @@ class EmojiPicker {
public show(
src: HTMLElement,
onChosen: EmojiPicker['onChosen'],
onClosed: EmojiPicker['onClosed'],
onChosen?: EmojiPicker['onChosen'],
onClosed?: EmojiPicker['onClosed'],
) {
this.src.value = src;
this.manualShowing.value = true;

View file

@ -5,6 +5,7 @@
import { defineAsyncComponent, Ref, ref } from 'vue';
import { popup } from '@/os.js';
import { defaultStore } from '@/store.js';
class ReactionPicker {
private src: Ref<HTMLElement | null> = ref(null);
@ -17,25 +18,27 @@ class ReactionPicker {
}
public async init() {
const reactionsRef = defaultStore.reactiveState.reactions;
await popup(defineAsyncComponent(() => import('@/components/MkEmojiPickerDialog.vue')), {
src: this.src,
pinnedEmojis: reactionsRef,
asReactionPicker: true,
manualShowing: this.manualShowing,
}, {
done: reaction => {
this.onChosen!(reaction);
if (this.onChosen) this.onChosen(reaction);
},
close: () => {
this.manualShowing.value = false;
},
closed: () => {
this.src.value = null;
this.onClosed!();
if (this.onClosed) this.onClosed();
},
});
}
public show(src: HTMLElement, onChosen: ReactionPicker['onChosen'], onClosed: ReactionPicker['onClosed']) {
public show(src: HTMLElement, onChosen?: ReactionPicker['onChosen'], onClosed?: ReactionPicker['onClosed']) {
this.src.value = src;
this.manualShowing.value = true;
this.onChosen = onChosen;

View file

@ -123,6 +123,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'account',
default: ['👍', '❤️', '😆', '🤔', '😮', '🎉', '💢', '😥', '😇', '🍮'],
},
pinnedEmojis: {
where: 'account',
default: [],
},
reactionAcceptance: {
where: 'account',
default: null as 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote' | null,
@ -288,19 +292,19 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: 'remote' as 'always' | 'remote' | 'none',
},
reactionPickerSize: {
emojiPickerScale: {
where: 'device',
default: 3,
},
reactionPickerWidth: {
emojiPickerWidth: {
where: 'device',
default: 2,
},
reactionPickerHeight: {
emojiPickerHeight: {
where: 'device',
default: 3,
},
reactionPickerUseDrawerForMobile: {
emojiPickerUseDrawerForMobile: {
where: 'device',
default: true,
},

View file

@ -14,7 +14,7 @@
"cherrypick-js": "workspace:*"
},
"devDependencies": {
"@typescript-eslint/parser": "6.13.2",
"@typescript-eslint/parser": "6.14.0",
"@typescript/lib-webworker": "npm:@types/serviceworker@0.0.67",
"eslint": "8.55.0",
"eslint-plugin-import": "2.29.0",

File diff suppressed because it is too large Load diff