Compare commits

...

98 Commits

Author SHA1 Message Date
42849da497 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-20 14:29:53 +09:00
f044ea7c85 2.11.0 2018-05-20 14:29:45 +09:00
d1f8b4e8d6 Merge pull request #1613 from syuilo/l10n_master
New Crowdin translations
2018-05-20 14:28:32 +09:00
69520b7c96 New translations ja.yml (English) 2018-05-20 14:20:52 +09:00
43d09a19c5 Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-20 14:13:07 +09:00
c85caef2d0 Clean up 2018-05-20 14:12:58 +09:00
8c02039e44 Merge pull request #1612 from syuilo/l10n_master
New Crowdin translations
2018-05-20 14:11:04 +09:00
6245555e9a New translations ja.yml (Korean) 2018-05-20 14:10:53 +09:00
d119f2a0f1 New translations ja.yml (Polish) 2018-05-20 14:10:51 +09:00
ee8d1cfdc9 New translations ja.yml (Chinese Simplified) 2018-05-20 14:10:49 +09:00
69a79fa191 New translations ja.yml (Italian) 2018-05-20 14:10:47 +09:00
ee48a049fe New translations ja.yml (Russian) 2018-05-20 14:10:46 +09:00
e7908ab8bb New translations ja.yml (English) 2018-05-20 14:10:44 +09:00
c2edb0e393 New translations ja.yml (Spanish) 2018-05-20 14:10:42 +09:00
ec5b2ce30b New translations ja.yml (German) 2018-05-20 14:10:39 +09:00
4c36e545ba New translations ja.yml (French) 2018-05-20 14:10:37 +09:00
7f846f114d Update dependencies 🚀 2018-05-20 14:10:30 +09:00
58abaa723d 🎨 2018-05-20 14:10:22 +09:00
853ee415ae Better mobile setting 2018-05-20 14:01:47 +09:00
ff6409be3f Merge pull request #1611 from syuilo/l10n_master
New Crowdin translations
2018-05-20 09:12:07 +09:00
7ce7bd8a30 New translations ja.yml (Korean) 2018-05-20 09:10:49 +09:00
6af37026c9 New translations ja.yml (Polish) 2018-05-20 09:10:47 +09:00
a4966573a8 New translations ja.yml (Chinese Simplified) 2018-05-20 09:10:45 +09:00
18b2a5f105 New translations ja.yml (Italian) 2018-05-20 09:10:44 +09:00
03bdbd13c8 New translations ja.yml (Russian) 2018-05-20 09:10:42 +09:00
5e60e81a98 New translations ja.yml (English) 2018-05-20 09:10:40 +09:00
91d2738d6c New translations ja.yml (Spanish) 2018-05-20 09:10:38 +09:00
01db424280 New translations ja.yml (German) 2018-05-20 09:10:37 +09:00
532e0bcf01 New translations ja.yml (French) 2018-05-20 09:10:35 +09:00
32de11c4bb wip 2018-05-20 09:04:48 +09:00
3187cb69ec Merge pull request #1610 from syuilo/l10n_master
New Crowdin translations
2018-05-20 07:31:16 +09:00
aec8a9f70d New translations ja.yml (Polish) 2018-05-20 07:30:43 +09:00
0cc9f4661b Merge pull request #1609 from syuilo/l10n_master
New Crowdin translations
2018-05-20 07:03:45 +09:00
0483412c3c New translations ja.yml (Korean) 2018-05-20 07:01:31 +09:00
e22a08d8c9 New translations ja.yml (Polish) 2018-05-20 07:01:29 +09:00
2aa94faa50 New translations ja.yml (Chinese Simplified) 2018-05-20 07:01:27 +09:00
575b00b7b1 New translations ja.yml (Italian) 2018-05-20 07:01:25 +09:00
d66c57dabe New translations ja.yml (Russian) 2018-05-20 07:01:24 +09:00
07f7b33fd9 New translations ja.yml (English) 2018-05-20 07:01:22 +09:00
8abb20d24e New translations ja.yml (Spanish) 2018-05-20 07:01:20 +09:00
dfdff31b3c New translations ja.yml (German) 2018-05-20 07:01:18 +09:00
32e34bc72d New translations ja.yml (French) 2018-05-20 07:01:16 +09:00
29e69785c6 Merge pull request #1608 from m4sk1n/master
moar and moar i18n
2018-05-20 06:58:14 +09:00
01e7c0175e moar and moar i18n
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-19 23:36:26 +02:00
e52246a5f0 Merge branch 'master' into l10n_master 2018-05-19 20:50:43 +09:00
7d78972528 New translations ja.yml (Korean) 2018-05-19 20:42:02 +09:00
2be5b2eb03 New translations ja.yml (Polish) 2018-05-19 20:42:00 +09:00
d379d295db New translations ja.yml (Chinese Simplified) 2018-05-19 20:41:58 +09:00
eabd6f2b0e New translations ja.yml (Italian) 2018-05-19 20:41:56 +09:00
b05d80a7e6 New translations ja.yml (Russian) 2018-05-19 20:41:55 +09:00
9e518e8b66 New translations ja.yml (English) 2018-05-19 20:41:53 +09:00
7981bd3080 New translations ja.yml (Spanish) 2018-05-19 20:41:50 +09:00
880f552001 New translations ja.yml (German) 2018-05-19 20:41:49 +09:00
6e75942dda New translations ja.yml (French) 2018-05-19 20:41:47 +09:00
254fbbbc75 [wip] better mobile setting 2018-05-19 20:31:13 +09:00
a97296df45 Revert "Rename"
This reverts commit 53eeb0e446.
2018-05-19 08:48:22 +09:00
7e83dfd4bc Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-19 08:42:06 +09:00
53eeb0e446 Rename 2018-05-19 08:42:04 +09:00
f3e1e27b61 Merge pull request #1605 from syuilo/l10n_master
New Crowdin translations
2018-05-19 08:02:50 +09:00
4952a6050b New translations ja.yml (English) 2018-05-19 08:01:07 +09:00
48a9eee425 Updaye docs 2018-05-19 07:55:28 +09:00
670ccead0b Update 2018-05-19 07:51:34 +09:00
1bfaf1728f Merge pull request #1604 from syuilo/l10n_master
New Crowdin translations
2018-05-19 07:51:17 +09:00
4ff138c35e New translations ja.yml (English) 2018-05-19 07:50:52 +09:00
07162ff341 Merge pull request #1603 from syuilo/l10n_master
New Crowdin translations
2018-05-19 07:42:17 +09:00
bf3100b012 New translations ja.yml (Korean) 2018-05-19 07:41:29 +09:00
724675378f New translations ja.yml (Polish) 2018-05-19 07:41:27 +09:00
cafb702d87 New translations ja.yml (Chinese Simplified) 2018-05-19 07:41:25 +09:00
2b41542330 New translations ja.yml (Italian) 2018-05-19 07:41:23 +09:00
8db7797ed7 New translations ja.yml (Russian) 2018-05-19 07:41:22 +09:00
de92233314 New translations ja.yml (English) 2018-05-19 07:41:20 +09:00
1942305b77 New translations ja.yml (Spanish) 2018-05-19 07:41:14 +09:00
590e13a2bf New translations ja.yml (German) 2018-05-19 07:41:12 +09:00
94e8661441 New translations ja.yml (French) 2018-05-19 07:41:10 +09:00
cda3baa1ae Merge pull request #1602 from syuilo/l10n_master
New Crowdin translations
2018-05-19 07:35:46 +09:00
e6eb1b2ae1 Clean up 2018-05-19 07:33:34 +09:00
ddad9da1c1 Fix 2018-05-19 07:22:39 +09:00
db4cbbd9fa New translations ja.yml (Polish) 2018-05-19 06:51:36 +09:00
81ef070129 New translations ja.yml (English) 2018-05-19 06:51:34 +09:00
cab6699ac6 New translations ja.yml (Polish) 2018-05-19 06:41:09 +09:00
5bb4ab1a2c New translations ja.yml (English) 2018-05-19 06:41:07 +09:00
93af018037 New translations ja.yml (Polish) 2018-05-19 06:30:49 +09:00
30148d47b1 New translations ja.yml (Polish) 2018-05-19 06:20:59 +09:00
0a4460f035 Merge pull request #1601 from syuilo/l10n_master
New Crowdin translations
2018-05-19 06:12:59 +09:00
4de7eb6e62 New translations ja.yml (Polish) 2018-05-19 06:12:06 +09:00
3942fb4707 Merge pull request #1600 from syuilo/l10n_master
New Crowdin translations
2018-05-19 06:02:33 +09:00
41d0881f51 New translations ja.yml (Korean) 2018-05-19 06:01:22 +09:00
794a49a591 New translations ja.yml (Polish) 2018-05-19 06:01:17 +09:00
1dd9821da2 New translations ja.yml (Chinese Simplified) 2018-05-19 06:01:15 +09:00
b1eb2aadbc New translations ja.yml (Italian) 2018-05-19 06:01:13 +09:00
706028b20a New translations ja.yml (Russian) 2018-05-19 06:01:11 +09:00
1a2d0303bf New translations ja.yml (English) 2018-05-19 06:01:09 +09:00
c0d7cbca88 New translations ja.yml (Spanish) 2018-05-19 06:01:07 +09:00
1af05ed96a New translations ja.yml (German) 2018-05-19 06:01:05 +09:00
96b05f7884 New translations ja.yml (French) 2018-05-19 06:01:03 +09:00
553e1890d1 Merge pull request #1599 from m4sk1n/master
even moar i18n
2018-05-19 05:54:22 +09:00
cc486a3313 even moar i18n
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-18 20:49:37 +02:00
565d61674d Update dependecy 🚀 2018-05-18 16:52:31 +09:00
85 changed files with 2546 additions and 2247 deletions

View File

@ -1,12 +1,8 @@
Misskey's Translation - English version Misskey's Translation
============ =====================
How to add a new language?
----------------------
Copy a language file to `/locales` and rename it after the language you wish to add.
If you find an untranslated part on Misskey: If you find an untranslated part on Misskey:
------------------------------- --------------------------------------------
1. Look for untranslated parts in the miskey's source code. 1. Look for untranslated parts in the miskey's source code.
- For instance, if you find an untranslated part in: `src/client/app/mobile/views/pages/home.vue`. - For instance, if you find an untranslated part in: `src/client/app/mobile/views/pages/home.vue`.

View File

@ -1,12 +1,8 @@
Traduction de Misskey - Version Française Traduction de Misskey
============ =====================
Comment ajouter une nouvelle langue ?
----------------------
Veuillez copier un fichier de langue dans /locales puis renommez-le du nom de la langue que vous voulez ajouter et modifier.
Si vous trouvez un segment non-traduit sur Misskey : Si vous trouvez un segment non-traduit sur Misskey :
------------------------------- ----------------------------------------------------
1. Veuillez chercher des parties non-traduites dans le code source de Misskey. 1. Veuillez chercher des parties non-traduites dans le code source de Misskey.
- Par exemple, supposons que vous trouviez un segment non-traduit dans : `src/client/app/mobile/views/pages/home.vue`. - Par exemple, supposons que vous trouviez un segment non-traduit dans : `src/client/app/mobile/views/pages/home.vue`.

View File

@ -1,10 +1,6 @@
Misskeyの翻訳 Misskeyの翻訳
============ ============
新たな言語を追加するには
----------------------
/locales 内に既にある何らかの言語ファイルをコピーして、追加したい言語名にリネームして編集してください。
Misskey内の未翻訳箇所を見つけたら Misskey内の未翻訳箇所を見つけたら
------------------------------- -------------------------------

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "Ein Verzeichnis erstellen" create-folder: "Ein Verzeichnis erstellen"
upload: "Eine Datei hochladen" upload: "Eine Datei hochladen"
url-upload: "Von einer URL hochladen" url-upload: "Von einer URL hochladen"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "Nachrichten" title: "Nachrichten"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Auch geteilt von" reposted-by: "Auch geteilt von"
reply: "Antworten" reply: "Antworten"
renote: "Anmerken" renote: "Anmerken"
add-reaction: "Eine Reaktion hinzufügen" add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details" detail: "Zeige Details"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "Mehr" more: "Mehr"
empty: "Keine Benachrichtigungen" empty: "Keine Benachrichtigungen"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "Antworten" reply: "Antworten"
attaches: "{} Medien hinzugefügt" attaches: "{} Medien hinzugefügt"
uploading-media: "Lade {} Medien hoch" uploading-media: "Lade {} Medien hoch"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Zitieren..." quote: "Zitieren..."
cancel: "Abbrechen" cancel: "Abbrechen"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "Profil aktualisieren" save: "Profil aktualisieren"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "Home" home: "Home"
local: "Lokal" local: "Lokal"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "Vorheriger Kommentar" prev: "Vorheriger Kommentar"
next: "Nächster Kommentar" next: "Nächster Kommentar"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "OK" ok: "OK"
cancel: "Abbrechen" cancel: "Abbrechen"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "おすすめユーザー" title: "おすすめユーザー"
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -522,8 +675,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -531,12 +684,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "English" lang: "English"
divider: " " divider: ""
common: common:
misskey: "Share everything with others using Misskey." misskey: "Share everything with others using Misskey."
time: time:
@ -22,7 +22,7 @@ common:
wednesday: "W" wednesday: "W"
thursday: "T" thursday: "T"
friday: "F" friday: "F"
saturday: "" saturday: "S"
reactions: reactions:
like: "Like" like: "Like"
love: "Love" love: "Love"
@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Server info" title: "Server info"
toggle: "Toggle views" toggle: "Toggle views"
commons/views/widgets/visibility-chooser.vue:
public: "Public"
home: "Home"
home-desc: "ホームタイムラインにのみ公開"
followers: "Followers"
followers-desc: "自分のフォロワーにのみ公開"
specified: "Direct"
specified-desc: "指定したユーザーにのみ公開"
private: "Private"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "Activity" title: "Activity"
toggle: "Toggle views" toggle: "Toggle views"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "Previous month" prev: "Previous month"
next: "Next month" next: "Next month"
go: "Click to naviguate" go: "Click to naviguate"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "Upload files from your PC"
cancel: "Cancel"
ok: "OK"
choose-prompt: "Choose a file"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "Cancel"
ok: "OK"
choose-prompt: "Choose a Folder"
desktop/views/components/crop-window.vue:
skip: "Skip cropping"
cancel: "Cancel"
ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "used" used: "used"
drive: "Drive" drive: "Drive"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "Create a folder" create-folder: "Create a folder"
upload: "Upload a file" upload: "Upload a file"
url-upload: "Upload from a URL" url-upload: "Upload from a URL"
desktop/views/components/follow-button.vue:
unfollow: "Unfollow"
follow: "Follow"
desktop/views/components/followers-window.vue:
followers: "Followers of {}"
desktop/views/components/followers.vue:
empty: "Seems that you dont have any followers."
desktop/views/components/following-window.vue:
following: "Following {}"
desktop/views/components/following.vue:
empty: "You dont follow anyone."
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "Similar users werent found."
fetching: "Loading…"
refresh: "More"
close: "Close"
desktop/views/components/game-window.vue:
game: "Othello"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "Submit" done: "Submit"
add-widget: "Add widget:" add-widget: "Add widget:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "Polls" polls: "Polls"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "Messaging" messaging: "Messaging"
channel: "Channel"
access-log: "Access log"
server: "Server info" server: "Server info"
donation: "Donation" donation: "Donation"
nav: "Navigation" nav: "Navigation"
tips: "Tips" tips: "Tips"
add: "Add" add: "Add"
desktop/views/input-dialog.vue:
cancel: "Cancel"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Messages:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "Messaging" title: "Messaging"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(this post is private)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Reposted by {}" reposted-by: "Reposted by {}"
reply: "Reply" reply: "Reply"
renote: "Renote" renote: "Renote"
add-reaction: "Add a reaction" add-reaction: "Add a reaction"
detail: "Show detail" detail: "Show detail"
desktop/views/components/notes.vue:
error: "Loading failed."
retry: "Retry"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "More" more: "More"
empty: "No notifications" empty: "No notifications"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "Reply" reply: "Reply"
attaches: "{} media attached" attaches: "{} media attached"
uploading-media: "Uploading {} media" uploading-media: "Uploading {} media"
desktop/views/components/progress-dialog.vue:
waiting: "Waiting"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Quote..." quote: "Quote..."
cancel: "Cancel" cancel: "Cancel"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "Two-factor authentication" 2fa: "Two-factor authentication"
other: "Other" other: "Other"
license: "License" license: "License"
behaviour: "Behavior"
fetch-on-scroll: "Fetch on scroll"
fetch-on-scroll-desc: "When you scroll down the page automatically fetches additional content."
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "Advanced settings"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "Design and display"
customize: "Customize Home"
dark-mode: "Dark Mode"
circle-icons: "Use circle icons"
gradient-window-header: "Use gradients on window headers"
post-form-on-timeline: "Display post form at the top of the timeline"
show-reply-target: "Display reply target"
show-my-renotes: "Show my renote in the timeline"
show-renoted-my-notes: "Show renoted my post in the timeline"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "Sound"
enable-sounds: "Enable sound"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "Volume"
test: "Test"
mobile: "Mobile"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "Language"
pick-language: "Select a language"
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify the language"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "Cache"
clean-cache: "Cleanup"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "Please reload the page."
auto-watch: "Auto watch"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "About Misskey"
operator: "The admin of this instance"
update: "Misskey Update"
version: "Version:"
latest-version: "Latest version:"
update-checking: "Checking for updates"
do-update: "Check for update"
update-settings: "Advanced settings"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!"
update-available-desc: "To reload the page and updates are applied."
advanced-settings: "Advanced"
debug-mode: "Enable the debug mode"
debug-mode-desc: "This setting is stored in the browser."
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "Enable experimental features"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "Tools"
task-manager: "Task Manager"
third-parties: "Third-party"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "If you set up 2-step verification, you will need not only a password at sign-in but also a pre-registered physical device (such as your smartphone), which will improve security. " intro: "If you set up 2-step verification, you will need not only a password at sign-in but also a pre-registered physical device (such as your smartphone), which will improve security. "
detail: "See details..." detail: "See details..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "Description" description: "Description"
birthday: "Birthday" birthday: "Birthday"
save: "Update profile" save: "Update profile"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "Task Manager"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "Home" home: "Home"
local: "Local" local: "Local"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "You know" iknow: "You know"
load-more: "More" load-more: "More"
fetching: "Loading…" fetching: "Loading…"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "Customize home"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "Previous note" prev: "Previous note"
next: "Next note" next: "Next note"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "OK" ok: "OK"
cancel: "Cancel" cancel: "Cancel"
upload: "Upload files from you PC" upload: "Upload files from you PC"
desktop/views/pages/user-list.users.vue:
users: "User"
add-user: "Add a user"
username: "Username"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "Followers you know" title: "Followers you know"
loading: "Loading" loading: "Loading"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mute" mute: "Mute"
muted: "Muting" muted: "Muting"
unmute: "Unmute" unmute: "Unmute"
desktop/views/pages/user/user.timeline.vue:
default: "Posts"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "Messaging" title: "Messaging"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "Post" title: "Post"
note: "Post" note: "Post"
placeholder: "What's happening?" placeholder: "What's happening?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "Trend" title: "Trend"
refresh: "Show others" refresh: "Show others"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "Recommended users" title: "Recommended users"
refresh: "Show others" refresh: "Show others"
no-one: "No one" no-one: "No one"
desktop/views/widgets/channel.vue:
title: "Channel"
settings: "Widget settings"
get-started: "Please click the cog in the upper right corner to specify a channel"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Drive" drive: "Drive"
used: "used" used: "used"
@ -476,9 +629,9 @@ mobile/views/components/notifications.vue:
empty: "No notifications" empty: "No notifications"
mobile/views/components/post-form.vue: mobile/views/components/post-form.vue:
submit: "Post" submit: "Post"
reply: "返信" reply: "Reply"
renote: "Renote" renote: "Renote"
renote-placeholder: "この投稿を引用... (オプション)" renote-placeholder: "Quote this post. (optional)"
reply-placeholder: "Reply to this note..." reply-placeholder: "Reply to this note..."
note-placeholder: "What's happening?" note-placeholder: "What's happening?"
mobile/views/components/sub-note-content.vue: mobile/views/components/sub-note-content.vue:
@ -522,21 +675,20 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "Notifications" notifications: "Notifications"
read-all: "Are you sure you want to mark all unread notifications as read?" read-all: "Are you sure you want to mark all unread notifications as read?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "Profile settings" title: "プロフィール"
will-be-published: "These profile settings will be updated." will-be-published: "これらのプロフィールは公開されます。"
name: "Name" name: "名前"
location: "Location" location: "場所"
description: "Description" description: "自己紹介"
birthday: "Birthday" birthday: "Birthday"
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
avatar-saved: "Avatar updated successfully" is-bot: "This account is a Bot"
banner-saved: "Banner updated successfully" save: "Update profile"
set-avatar: "Choose an avatar"
set-banner: "Choose a banner"
save: "Save"
saved: "Profile updated successfully" saved: "Profile updated successfully"
uploading: "Uploading"
upload-failed: "Upload failed"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Search" search: "Search"
empty: "No posts were found for '{}'" empty: "No posts were found for '{}'"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "Choose a file" select-file: "Choose a file"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}" signed-in-as: "Signed in as {}"
profile: "Profile" lang: "Language"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify the language"
design: "Design and display"
dark-mode: "Dark Mode"
circle-icons: "Use circle icons"
timeline: "Timeline"
show-reply-target: "Show reply target"
show-my-renotes: "Show my renotes"
show-renoted-my-notes: "Show renoted my notes"
behavior: "Behavior"
fetch-on-scroll: "Fetch on scroll"
disable-via-mobile: "Without the \"mobile posts\" flag"
twitter: "Twitter integration" twitter: "Twitter integration"
signin-history: "Sign in history" twitter-connect: "Connect to your Twitter account"
twitter-reconnect: "Reconnect"
twitter-disconnect: "Disconnect"
update: "Misskey Update"
version: "Current version:"
latest-version: "Latest version:"
update-checking: "Checking for updates"
check-for-updates: "Check for update"
no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!"
update-available-desc: "To reload the page and updates are applied."
settings: "Settings" settings: "Settings"
signout: "Sign out" signout: "Sign out"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成" create-folder: "フォルダーを作成"
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "返信" reply: "返信"
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中" uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "引用する..." quote: "引用する..."
cancel: "キャンセル" cancel: "キャンセル"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "決定" ok: "決定"
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "おすすめユーザー" title: "おすすめユーザー"
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -522,8 +675,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -531,12 +684,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Info sur le serveur" title: "Info sur le serveur"
toggle: "Afficher les vues" toggle: "Afficher les vues"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "Activitié" title: "Activitié"
toggle: "Afficher les vues" toggle: "Afficher les vues"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "Mois dernier" prev: "Mois dernier"
next: "Mois prochain" next: "Mois prochain"
go: "Cliquer pour naviguer" go: "Cliquer pour naviguer"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "utilisé" used: "utilisé"
drive: "Drive" drive: "Drive"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "Créer un dossier" create-folder: "Créer un dossier"
upload: "Uploader un fichier" upload: "Uploader un fichier"
url-upload: "Uploader d'un URL" url-upload: "Uploader d'un URL"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "Messagerie" title: "Messagerie"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Reposté par {}" reposted-by: "Reposté par {}"
reply: "Répondre" reply: "Répondre"
renote: "Renote" renote: "Renote"
add-reaction: "Ajouter votre reaction" add-reaction: "Ajouter votre reaction"
detail: "Afficher les détails" detail: "Afficher les détails"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "Plus" more: "Plus"
empty: "Pas de notifications" empty: "Pas de notifications"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "Répondre" reply: "Répondre"
attaches: "{} media joint(s)" attaches: "{} media joint(s)"
uploading-media: "Upload du media {}" uploading-media: "Upload du media {}"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Citer..." quote: "Citer..."
cancel: "Annuler" cancel: "Annuler"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "Vérification en deux étapes" 2fa: "Vérification en deux étapes"
other: "Autres" other: "Autres"
license: "License" license: "License"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte." intro: "Si vous configurez la vérication en deux étapes vous aurez non seulement besoin de votre mot de passe mais aussi un appareil déjà pré-enregistré(tel que votre smartphone) ce qui ameliora grandement la sécurité de votre compte."
detail: "Voir les détails..." detail: "Voir les détails..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "Description" description: "Description"
birthday: "Date de naissance" birthday: "Date de naissance"
save: "Mettre à jour le profil" save: "Mettre à jour le profil"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "Note précédente" prev: "Note précédente"
next: "Note suivante" next: "Note suivante"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "OK" ok: "OK"
cancel: "Annuler" cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC" upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "Abonnés que vous connaissez" title: "Abonnés que vous connaissez"
loading: "Chargement en cours" loading: "Chargement en cours"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mettre en sourdine" mute: "Mettre en sourdine"
muted: "Muting" muted: "Muting"
unmute: "Enlever la sourdine" unmute: "Enlever la sourdine"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "Messagerie" title: "Messagerie"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "Post" title: "Post"
note: "Post" note: "Post"
placeholder: "Qu'est-ce qu'il se passe?" placeholder: "Qu'est-ce qu'il se passe?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "Tendances" title: "Tendances"
refresh: "Afficher d'autres" refresh: "Afficher d'autres"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "Utilisateurs" title: "Utilisateurs"
refresh: "Afficher d'autres" refresh: "Afficher d'autres"
no-one: "Personne" no-one: "Personne"
desktop/views/widgets/channel.vue:
title: "Cannal"
settings: "Réglages des widgets"
get-started: "Veuillez cliquer sur la dent en haute à droite pour choisir un channel"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Drive" drive: "Drive"
used: "utilisé" used: "utilisé"
@ -522,21 +675,20 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "Notifications" notifications: "Notifications"
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?" read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "Réglages du profiles" title: "プロフィール"
will-be-published: "Ces profiles vont être publier" will-be-published: "これらのプロフィールは公開されます。"
name: "Nom" name: "名前"
location: "Localisation" location: "場所"
description: "Description" description: "自己紹介"
birthday: "Anniversaire" birthday: "誕生日"
avatar: "Avatar" avatar: "アイコン"
banner: "Bannière" banner: "バナー"
avatar-saved: "Avatar mis à jour avec succès!" is-bot: "このアカウントはBotです"
banner-saved: "Bannière mise à jour avec succès!" save: "保存"
set-avatar: "Choisir un avatar" saved: "プロフィールを保存しました"
set-banner: "Choisir une bannière" uploading: "アップロード中"
save: "Sauvegarder" upload-failed: "アップロードに失敗しました"
saved: "Profil mis à jour avec succès"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Chercher" search: "Chercher"
empty: "Aucun message trouvé pour '{}' " empty: "Aucun message trouvé pour '{}' "
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "Choisissez un fichier" select-file: "Choisissez un fichier"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "Connecté en tant que {}" signed-in-as: "Connecté en tant que {}"
profile: "Profile" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "Historique de connexion" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "Réglages" settings: "Réglages"
signout: "Déconnexion" signout: "Déconnexion"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成" create-folder: "フォルダーを作成"
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "返信" reply: "返信"
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中" uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "引用する..." quote: "引用する..."
cancel: "キャンセル" cancel: "キャンセル"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "決定" ok: "決定"
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "おすすめユーザー" title: "おすすめユーザー"
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -522,8 +675,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -531,12 +684,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -191,6 +191,22 @@ common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -201,6 +217,23 @@ desktop/views/components/calendar.vue:
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -257,6 +290,32 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -275,17 +334,33 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
@ -293,6 +368,10 @@ desktop/views/components/notes.note.vue:
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
@ -324,6 +403,9 @@ desktop/views/components/post-form-window.vue:
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中" uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "引用する..." quote: "引用する..."
cancel: "キャンセル" cancel: "キャンセル"
@ -348,6 +430,80 @@ desktop/views/components/settings.vue:
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -398,6 +554,14 @@ desktop/views/components/settings.profile.vue:
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -442,6 +606,22 @@ desktop/views/components/users-list.vue:
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -452,6 +632,11 @@ desktop/views/pages/selectdrive.vue:
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -484,6 +669,12 @@ desktop/views/pages/user/user.profile.vue:
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
@ -501,6 +692,10 @@ desktop/views/widgets/post-form.vue:
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -511,11 +706,6 @@ desktop/views/widgets/users.vue:
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -616,8 +806,8 @@ mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -625,12 +815,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
@ -641,9 +830,34 @@ mobile/views/pages/selectdrive.vue:
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成" create-folder: "フォルダーを作成"
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "返信" reply: "返信"
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中" uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "引用する..." quote: "引用する..."
cancel: "キャンセル" cancel: "キャンセル"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "決定" ok: "決定"
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "おすすめユーザー" title: "おすすめユーザー"
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -522,8 +675,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -531,12 +684,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -1,6 +1,6 @@
--- ---
meta: meta:
lang: "日本語" lang: "japoński"
divider: "" divider: ""
common: common:
misskey: "Dziel się zawartością z innymi korzystając z Misskey." misskey: "Dziel się zawartością z innymi korzystając z Misskey."
@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Informacje o serwerze" title: "Informacje o serwerze"
toggle: "Przełącz widok" toggle: "Przełącz widok"
commons/views/widgets/visibility-chooser.vue:
public: "Publiczny"
home: "Lokalny"
home-desc: "Widoczny tylko na tej instancji"
followers: "Dla śledzących"
followers-desc: "Widoczny tylko dla osób, które Cię śledzą"
specified: "Bezpośredni"
specified-desc: "Tylko dla określonych użytkowników"
private: "Prywatny"
desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy"
replies: "Czerwony … Odpowiedzi"
renotes: "Czerwony … Udostępnienia"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "Aktywność" title: "Aktywność"
toggle: "Przełącz widok" toggle: "Przełącz widok"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "Poprzedni miesiąc" prev: "Poprzedni miesiąc"
next: "Następny miesiąc" next: "Następny miesiąc"
go: "Naciśnij, aby przejść" go: "Naciśnij, aby przejść"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Wybierz plik"
upload: "Wyślij pliki z Twojego komputera"
cancel: "Anuluj"
ok: "OK"
choose-prompt: "Wybierz plik"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "Anuluj"
ok: "OK"
choose-prompt: "Wybierz katalog"
desktop/views/components/crop-window.vue:
skip: "Pomiń przycinanie"
cancel: "Anuluj"
ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "wykorzystane" used: "wykorzystane"
drive: "Dysk" drive: "Dysk"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "Utwórz katalog" create-folder: "Utwórz katalog"
upload: "Wyślij plik" upload: "Wyślij plik"
url-upload: "Wyślij z adresu URL" url-upload: "Wyślij z adresu URL"
desktop/views/components/follow-button.vue:
unfollow: "Przestań śledzić"
follow: "Śledź"
desktop/views/components/followers-window.vue:
followers: "Śledzący"
desktop/views/components/followers.vue:
empty: "Wygląda na to, że nikt Cię nie śledzi…"
desktop/views/components/following-window.vue:
following: "Śledzeni przez {}"
desktop/views/components/following.vue:
empty: "Nikt Cię nie śledzi."
desktop/views/components/friends-maker.vue:
title: "Zacznij śledzić ludzi takich jak Ty:"
empty: "Nie znaleziono podobnych użytkowników."
fetching: "Ładowanie…"
refresh: "Więcej"
close: "Zamknij"
desktop/views/components/game-window.vue:
game: "Othello"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "Wyślij" done: "Wyślij"
add-widget: "Dodaj widżet:" add-widget: "Dodaj widżet:"
@ -236,27 +283,42 @@ desktop/views/components/home.vue:
photostream: "Photostream" photostream: "Photostream"
slideshow: "Pokaz slajdów" slideshow: "Pokaz slajdów"
version: "Wersja" version: "Wersja"
broadcast: "ブロードキャスト" broadcast: "Transmisja"
notifications: "Powiadomienia" notifications: "Powiadomienia"
users: "Polecani użytkownicy" users: "Polecani użytkownicy"
polls: "Ankiety" polls: "Ankiety"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "Wiadomości" messaging: "Wiadomości"
channel: "Kanał"
access-log: "アクセスログ"
server: "Informacje o serwerze" server: "Informacje o serwerze"
donation: "Dotacje" donation: "Dotacje"
nav: "Nawigacja" nav: "Nawigacja"
tips: "Wskazówki" tips: "Wskazówki"
add: "Dodaj" add: "Dodaj"
desktop/views/input-dialog.vue:
cancel: "Anuluj"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Wiadomości:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "Wiadomości" title: "Wiadomości"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(ten wpis jest prywatny)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "Udostępniono przez {}" reposted-by: "Udostępniono przez {}"
reply: "Odpowiedz" reply: "Odpowiedz"
renote: "Przeredaguj" renote: "Przeredaguj"
add-reaction: "Dodaj reakcję" add-reaction: "Dodaj reakcję"
detail: "Pokaż szczegóły" detail: "Pokaż szczegóły"
desktop/views/components/notes.vue:
error: "Ładowanie nie powiodło się."
retry: "Spróbuj ponownie"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "Więcej" more: "Więcej"
empty: "Brak powiadomień" empty: "Brak powiadomień"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "Odpowiedz" reply: "Odpowiedz"
attaches: "{} załączników multimedialnych" attaches: "{} załączników multimedialnych"
uploading-media: "Wysyłanie {} treści multimedialnych" uploading-media: "Wysyłanie {} treści multimedialnych"
desktop/views/components/progress-dialog.vue:
waiting: "Oczekiwanie"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Cytuj…" quote: "Cytuj…"
cancel: "Anuluj" cancel: "Anuluj"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "Uwierzytelnianie dwuetapowe" 2fa: "Uwierzytelnianie dwuetapowe"
other: "Inne" other: "Inne"
license: "Licencja" license: "Licencja"
behaviour: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
auto-popout: "Automatycznie pojawiające się okna"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "Język"
pick-language: "Wybierz język"
recommended: "Zalecane"
auto: "Automatycznie"
specify-language: "Wybierz język"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "Wyczyść"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "Nawet jeżeli opcja jest zaznaczona, aktualizacje mogą zostać wykonane. Opcja dotyczy tylko tego urządzenia."
no-updates: "Brak dostępnych aktualizacji"
no-updates-desc: "Twój Misskey jest aktualny."
update-available: "Dostępna jest nowa wersja"
update-available-desc: "Odśwież stronę, aby zastosować aktualizację."
advanced-settings: "Ustawienia zaawansowane"
debug-mode: "Włącz tryb debugowania"
debug-mode-desc: "To ustawienie jest przechowywane w przeglądarce."
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "Włącz eksperymentalne funkcje"
experimental-desc: "Aktywowanie eksperymentalnych funkcji może spowodować niestabilność Misskey. Opcja ta jest przechowywana w przeglądarce."
tools: "Narzędzia"
task-manager: "Menedżer zadań"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo." intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
detail: "Zobacz szczegóły…" detail: "Zobacz szczegóły…"
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "Opis" description: "Opis"
birthday: "Data urodzenia" birthday: "Data urodzenia"
save: "Aktualizuj profil" save: "Aktualizuj profil"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "Menedżer zadań"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "Strona główna" home: "Strona główna"
local: "Lokalne" local: "Lokalne"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "Znasz" iknow: "Znasz"
load-more: "Więcej" load-more: "Więcej"
fetching: "Ładowanie…" fetching: "Ładowanie…"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "Poprzedni wpis" prev: "Poprzedni wpis"
next: "Następny wpis" next: "Następny wpis"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "OK" ok: "OK"
cancel: "Anuluj" cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera" upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "Śledzący których znasz" title: "Śledzący których znasz"
loading: "Ładowanie" loading: "Ładowanie"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "Wycisz" mute: "Wycisz"
muted: "Wyciszyłeś" muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie" unmute: "Cofnij wyciszenie"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "Wiadomości" title: "Wiadomości"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "Wpis" title: "Wpis"
note: "Wpis" note: "Wpis"
placeholder: "Co się dzieje?" placeholder: "Co się dzieje?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "Na czasie" title: "Na czasie"
refresh: "Pokaż inne" refresh: "Pokaż inne"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "Polecani użytkownicy" title: "Polecani użytkownicy"
refresh: "Pokaż innych" refresh: "Pokaż innych"
no-one: "Pusto" no-one: "Pusto"
desktop/views/widgets/channel.vue:
title: "Kanał"
settings: "Ustawienia widżetu"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "Dysk" drive: "Dysk"
used: "użyto" used: "użyto"
@ -476,9 +629,9 @@ mobile/views/components/notifications.vue:
empty: "Brak powiadomień" empty: "Brak powiadomień"
mobile/views/components/post-form.vue: mobile/views/components/post-form.vue:
submit: "Wyślij" submit: "Wyślij"
reply: "返信" reply: "Odpowiedz"
renote: "Renote" renote: "Przeredaguj"
renote-placeholder: "この投稿を引用... (オプション)" renote-placeholder: "Zacytuj wpis… (nieobowiązkowe)"
reply-placeholder: "Odpowiedź na ten wpis…" reply-placeholder: "Odpowiedź na ten wpis…"
note-placeholder: "Co się dzieje?" note-placeholder: "Co się dzieje?"
mobile/views/components/sub-note-content.vue: mobile/views/components/sub-note-content.vue:
@ -522,21 +675,20 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "Powiadomienia" notifications: "Powiadomienia"
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?" read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "Ustawienia profilu" title: "プロフィール"
will-be-published: "Te ustawienia profilu zostaną zaktualizowane." will-be-published: "これらのプロフィールは公開されます。"
name: "Nazwa" name: "名前"
location: "Lokalizacja" location: "場所"
description: "Opis" description: "自己紹介"
birthday: "Data urodzenia" birthday: "誕生日"
avatar: "Awatar" avatar: "アイコン"
banner: "Baner" banner: "バナー"
avatar-saved: "Pomyślnie zaktualizowano awatar" is-bot: "このアカウントはBotです"
banner-saved: "Pomyślnie zaktualizowano baner" save: "保存"
set-avatar: "Wybierz awatar" saved: "プロフィールを保存しました"
set-banner: "Wybierz baner" uploading: "アップロード中"
save: "Zapisz" upload-failed: "アップロードに失敗しました"
saved: "Pomyślnie zaktualizowano profil"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Szukaj" search: "Szukaj"
empty: "Nie znaleziono wpisów zawierających '{}'" empty: "Nie znaleziono wpisów zawierających '{}'"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "Wybierz plik" select-file: "Wybierz plik"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "Zalogowany jako {}" signed-in-as: "Zalogowany jako {}"
profile: "Profil" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Połączenie z Twitterem" twitter: "Połączenie z Twitterem"
signin-history: "Historia logowań" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj" signout: "Wyloguj"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成" create-folder: "フォルダーを作成"
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "返信" reply: "返信"
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中" uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "引用する..." quote: "引用する..."
cancel: "キャンセル" cancel: "キャンセル"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "決定" ok: "決定"
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "おすすめユーザー" title: "おすすめユーザー"
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -522,8 +675,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -531,12 +684,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -165,6 +165,20 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue:
public: "公開"
home: "ホーム"
home-desc: "ホームタイムラインにのみ公開"
followers: "フォロワー"
followers-desc: "自分のフォロワーにのみ公開"
specified: "ダイレクト"
specified-desc: "指定したユーザーにのみ公開"
private: "非公開"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
replies: "Red ... Replies"
renotes: "Green ... Renotes"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "アクティビティ"
toggle: "表示を切り替え" toggle: "表示を切り替え"
@ -173,6 +187,20 @@ desktop/views/components/calendar.vue:
prev: "前の月" prev: "前の月"
next: "次の月" next: "次の月"
go: "クリックして時間遡行" go: "クリックして時間遡行"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中"
upload: "PCからドライブにファイルをアップロード"
cancel: "キャンセル"
ok: "決定"
choose-prompt: "ファイルを選択"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル"
ok: "決定"
choose-prompt: "フォルダを選択"
desktop/views/components/crop-window.vue:
skip: "クロップをスキップ"
cancel: "キャンセル"
ok: "決定"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ" drive: "ドライブ"
@ -224,6 +252,25 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成" create-folder: "フォルダーを作成"
upload: "ファイルをアップロード" upload: "ファイルをアップロード"
url-upload: "URLからアップロード" url-upload: "URLからアップロード"
desktop/views/components/follow-button.vue:
unfollow: "フォロー解除"
follow: "フォローする"
desktop/views/components/followers-window.vue:
followers: "{} のフォロワー"
desktop/views/components/followers.vue:
empty: "フォロワーはいないようです。"
desktop/views/components/following-window.vue:
following: "{} のフォロー"
desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。"
desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:"
empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます"
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "完了"
add-widget: "ウィジェットを追加:" add-widget: "ウィジェットを追加:"
@ -242,21 +289,36 @@ desktop/views/components/home.vue:
polls: "投票" polls: "投票"
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
channel: "チャンネル"
access-log: "アクセスログ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "寄付のお願い"
nav: "ナビゲーション" nav: "ナビゲーション"
tips: "ヒント" tips: "ヒント"
add: "追加" add: "追加"
desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む"
private: "(この投稿は非公開です)"
is-renote: "がRenote"
location: "位置情報"
renote: "Renote"
add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
reposted-by: "{}がRenote" reposted-by: "{}がRenote"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
detail: "詳細" detail: "詳細"
desktop/views/components/notes.vue:
error: "読み込みに失敗しました。"
retry: "リトライ"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "もっと見る" more: "もっと見る"
empty: "ありません!" empty: "ありません!"
@ -285,6 +347,8 @@ desktop/views/components/post-form-window.vue:
reply: "返信" reply: "返信"
attaches: "添付: {}メディア" attaches: "添付: {}メディア"
uploading-media: "{}個のメディアをアップロード中" uploading-media: "{}個のメディアをアップロード中"
desktop/views/components/progress-dialog.vue:
waiting: "待機中"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "引用する..." quote: "引用する..."
cancel: "キャンセル" cancel: "キャンセル"
@ -306,6 +370,70 @@ desktop/views/components/settings.vue:
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定"
api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示"
customize: "ホームをカスタマイズ"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
sound: "サウンド"
enable-sounds: "サウンドを有効にする"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム"
test: "テスト"
mobile: "モバイル"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
language: "言語"
pick-language: "言語を選択"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ"
clean-cache: "クリーンアップ"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました"
cache-cleared-desc: "ページを再度読み込みしてください。"
auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて"
operator: "このサーバーの運営者"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
do-update: "アップデートを確認"
update-settings: "詳細設定"
prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール"
task-manager: "タスクマネージャ"
third-parties: "サードパーティ"
desktop/views/components/settings.2fa.vue: desktop/views/components/settings.2fa.vue:
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。" intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
detail: "詳細..." detail: "詳細..."
@ -350,6 +478,12 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)"
media: "つのメディア"
poll: "投票"
desktop/views/components/taskmanager.vue:
title: "タスクマネージャ"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
home: "ホーム" home: "ホーム"
local: "ローカル" local: "ローカル"
@ -385,6 +519,17 @@ desktop/views/components/users-list.vue:
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "読み込んでいます"
desktop/views/components/users-list-item.vue:
followed: "フォローされています"
desktop/views/components/window.vue:
popout: "ポップアウト"
close: "閉じる"
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "さらに読み込む"
desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "前の投稿" prev: "前の投稿"
next: "次の投稿" next: "次の投稿"
@ -393,6 +538,10 @@ desktop/views/pages/selectdrive.vue:
ok: "決定" ok: "決定"
cancel: "キャンセル" cancel: "キャンセル"
upload: "PCからドライブにファイルをアップロード" upload: "PCからドライブにファイルをアップロード"
desktop/views/pages/user-list.users.vue:
users: "ユーザー"
add-user: "ユーザーを追加"
username: "ユーザー名"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "知り合いのフォロワー" title: "知り合いのフォロワー"
loading: "読み込み中" loading: "読み込み中"
@ -419,6 +568,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする" mute: "ミュートする"
muted: "ミュートしています" muted: "ミュートしています"
unmute: "ミュート解除" unmute: "ミュート解除"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
empty: "このユーザーはまだ何も投稿していないようです。"
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "メッセージ" title: "メッセージ"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@ -432,6 +586,9 @@ desktop/views/widgets/post-form.vue:
title: "投稿" title: "投稿"
note: "投稿" note: "投稿"
placeholder: "いまどうしてる?" placeholder: "いまどうしてる?"
desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集"
update-avatar: "クリックでアバター編集"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "トレンド" title: "トレンド"
refresh: "他を見る" refresh: "他を見る"
@ -440,10 +597,6 @@ desktop/views/widgets/users.vue:
title: "おすすめユーザー" title: "おすすめユーザー"
refresh: "他を見る" refresh: "他を見る"
no-one: "いません!" no-one: "いません!"
desktop/views/widgets/channel.vue:
title: "チャンネル"
settings: "ウィジェットの設定"
get-started: "右上の歯車をクリックして受信するチャンネルを指定してください"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ" drive: "ドライブ"
used: "使用中" used: "使用中"
@ -522,8 +675,8 @@ mobile/views/pages/note.vue:
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "通知" notifications: "通知"
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/profile-setting.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール設定" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。" will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
location: "場所" location: "場所"
@ -531,12 +684,11 @@ mobile/views/pages/profile-setting.vue:
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
avatar-saved: "アイコンを保存しました" is-bot: "このアカウントはBotです"
banner-saved: "バナーを保存しました"
set-avatar: "アイコンを選択する"
set-banner: "バナーを選択する"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中"
upload-failed: "アップロードに失敗しました"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "検索" search: "検索"
empty: "「{}」に関する投稿は見つかりませんでした。" empty: "「{}」に関する投稿は見つかりませんでした。"
@ -544,9 +696,34 @@ mobile/views/pages/selectdrive.vue:
select-file: "ファイルを選択" select-file: "ファイルを選択"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "{}としてサインイン中" signed-in-as: "{}としてサインイン中"
profile: "プロフィール" lang: "言語"
lang-tip: "変更はページの再読み込み後に反映されます。"
recommended: "推奨"
auto: "自動"
specify-language: "言語を指定"
design: "デザインと表示"
dark-mode: "ダークモード"
circle-icons: "円形のアイコンを使用"
timeline: "タイムライン"
show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
twitter: "Twitter連携" twitter: "Twitter連携"
signin-history: "サインイン履歴" twitter-connect: "Twitterアカウントに接続する"
twitter-reconnect: "再接続する"
twitter-disconnect: "切断する"
update: "Misskey Update"
version: "バージョン:"
latest-version: "最新のバージョン:"
update-checking: "アップデートを確認中"
check-for-updates: "アップデートを確認"
no-updates: "利用可能な更新はありません"
no-updates-desc: "お使いのMisskeyは最新です。"
update-available: "新しいバージョンが利用可能です"
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
settings: "設定" settings: "設定"
signout: "サインアウト" signout: "サインアウト"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.10.1", "version": "2.11.0",
"clientVersion": "1.0.5407", "clientVersion": "1.0.5516",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@ -65,7 +65,7 @@
"@types/mongodb": "3.0.18", "@types/mongodb": "3.0.18",
"@types/monk": "6.0.0", "@types/monk": "6.0.0",
"@types/ms": "0.7.30", "@types/ms": "0.7.30",
"@types/node": "10.1.0", "@types/node": "10.1.2",
"@types/nopt": "3.0.29", "@types/nopt": "3.0.29",
"@types/parse5": "3.0.0", "@types/parse5": "3.0.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
@ -80,7 +80,7 @@
"@types/speakeasy": "2.0.2", "@types/speakeasy": "2.0.2",
"@types/tmp": "0.0.33", "@types/tmp": "0.0.33",
"@types/uuid": "3.4.3", "@types/uuid": "3.4.3",
"@types/webpack": "4.1.7", "@types/webpack": "4.4.0",
"@types/webpack-stream": "3.2.10", "@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.39", "@types/websocket": "0.0.39",
"@types/ws": "5.1.1", "@types/ws": "5.1.1",
@ -98,8 +98,8 @@
"deepcopy": "0.6.3", "deepcopy": "0.6.3",
"diskusage": "0.2.4", "diskusage": "0.2.4",
"dompurify": "1.0.4", "dompurify": "1.0.4",
"elasticsearch": "14.2.2", "elasticsearch": "15.0.0",
"element-ui": "2.3.8", "element-ui": "2.3.9",
"emojilib": "2.2.12", "emojilib": "2.2.12",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "4.19.1", "eslint": "4.19.1",
@ -124,7 +124,7 @@
"gulp-typescript": "4.0.2", "gulp-typescript": "4.0.2",
"gulp-uglify": "3.0.0", "gulp-uglify": "3.0.0",
"gulp-util": "3.0.8", "gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.6.7", "hard-source-webpack-plugin": "0.6.9",
"highlight.js": "9.12.0", "highlight.js": "9.12.0",
"html-minifier": "3.5.15", "html-minifier": "3.5.15",
"http-signature": "1.2.0", "http-signature": "1.2.0",
@ -146,11 +146,11 @@
"koa-slow": "2.1.0", "koa-slow": "2.1.0",
"koa-views": "6.1.4", "koa-views": "6.1.4",
"kue": "0.11.6", "kue": "0.11.6",
"license-checker": "19.0.0", "license-checker": "20.0.0",
"loader-utils": "1.1.0", "loader-utils": "1.1.0",
"mecab-async": "0.1.2", "mecab-async": "0.1.2",
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
"mocha": "5.1.1", "mocha": "5.2.0",
"moji": "0.5.1", "moji": "0.5.1",
"mongodb": "3.0.8", "mongodb": "3.0.8",
"monk": "6.0.6", "monk": "6.0.6",
@ -186,7 +186,7 @@
"style-loader": "0.21.0", "style-loader": "0.21.0",
"stylus": "0.54.5", "stylus": "0.54.5",
"stylus-loader": "3.0.2", "stylus-loader": "3.0.2",
"summaly": "2.0.4", "summaly": "2.0.6",
"swagger-jsdoc": "1.9.7", "swagger-jsdoc": "1.9.7",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"tcp-port-used": "0.1.2", "tcp-port-used": "0.1.2",
@ -205,7 +205,8 @@
"vue-cropperjs": "2.2.0", "vue-cropperjs": "2.2.0",
"vue-js-modal": "1.3.13", "vue-js-modal": "1.3.13",
"vue-json-tree-view": "2.1.4", "vue-json-tree-view": "2.1.4",
"vue-loader": "15.0.11", "vue-loader": "15.1.0",
"vue-material": "^1.0.0-beta-10.2",
"vue-router": "3.0.1", "vue-router": "3.0.1",
"vue-template-compiler": "2.5.16", "vue-template-compiler": "2.5.16",
"vuedraggable": "2.16.0", "vuedraggable": "2.16.0",

View File

@ -7,6 +7,11 @@ html
cursor progress !important cursor progress !important
body body
// for md
font-size 16px !important
line-height initial !important
letter-spacing initial !important
overflow-wrap break-word overflow-wrap break-word
#error #error

View File

@ -1,15 +0,0 @@
/**
* Channels
*/
// Style
import './style.styl';
require('./tags');
import init from '../init';
/**
* init
*/
init(() => {
});

View File

@ -1,10 +0,0 @@
@import "../app"
html
padding 8px
background #efefef
#wait
top auto
bottom 15px
left 15px

View File

@ -1,409 +0,0 @@
<mk-channel>
<mk-header/>
<hr>
<main v-if="!fetching">
<h1>{ channel.title }</h1>
<div v-if="$root.$data.os.isSignedIn">
<p v-if="channel.isWatching">このチャンネルをウォッチしています <a @click="unwatch">ウォッチ解除</a></p>
<p v-if="!channel.isWatching"><a @click="watch">このチャンネルをウォッチする</a></p>
</div>
<div class="share">
<mk-twitter-button/>
<mk-line-button/>
</div>
<div class="body">
<p v-if="notesFetching">読み込み中<mk-ellipsis/></p>
<div v-if="!notesFetching">
<p v-if="notes == null || notes.length == 0">まだ投稿がありません</p>
<template v-if="notes != null">
<mk-channel-note each={ note in notes.slice().reverse() } note={ note } form={ parent.refs.form }/>
</template>
</div>
</div>
<hr>
<mk-channel-form v-if="$root.$data.os.isSignedIn" channel={ channel } ref="form"/>
<div v-if="!$root.$data.os.isSignedIn">
<p>参加するには<a href={ _URL_ }>ログインまたは新規登録</a>してください</p>
</div>
<hr>
<footer>
<small><a href={ _URL_ }>Misskey</a> ver { _VERSION_ } (葵 aoi)</small>
</footer>
</main>
<style lang="stylus" scoped>
:scope
display block
> main
> h1
font-size 1.5em
color #f00
> .share
> *
margin-right 4px
> .body
margin 8px 0 0 0
> mk-channel-form
max-width 500px
</style>
<script lang="typescript">
import Progress from '../../common/scripts/loading';
import ChannelStream from '../../common/scripts/streaming/channel-stream';
this.mixin('i');
this.mixin('api');
this.id = this.opts.id;
this.fetching = true;
this.notesFetching = true;
this.channel = null;
this.notes = null;
this.connection = new ChannelStream(this.id);
this.unreadCount = 0;
this.on('mount', () => {
document.documentElement.style.background = '#efefef';
Progress.start();
let fetched = false;
// チャンネル概要読み込み
this.$root.$data.os.api('channels/show', {
channelId: this.id
}).then(channel => {
if (fetched) {
Progress.done();
} else {
Progress.set(0.5);
fetched = true;
}
this.update({
fetching: false,
channel: channel
});
document.title = channel.title + ' | Misskey'
});
// 投稿読み込み
this.$root.$data.os.api('channels/notes', {
channelId: this.id
}).then(notes => {
if (fetched) {
Progress.done();
} else {
Progress.set(0.5);
fetched = true;
}
this.update({
notesFetching: false,
notes: notes
});
});
this.connection.on('note', this.onNote);
document.addEventListener('visibilitychange', this.onVisibilitychange, false);
});
this.on('unmount', () => {
this.connection.off('note', this.onNote);
this.connection.close();
document.removeEventListener('visibilitychange', this.onVisibilitychange);
});
this.onNote = note => {
this.notes.unshift(note);
this.update();
if (document.hidden && this.$root.$data.os.isSignedIn && note.userId !== this.$root.$data.os.i.id) {
this.unreadCount++;
document.title = `(${this.unreadCount}) ${this.channel.title} | Misskey`;
}
};
this.onVisibilitychange = () => {
if (!document.hidden) {
this.unreadCount = 0;
document.title = this.channel.title + ' | Misskey'
}
};
this.watch = () => {
this.$root.$data.os.api('channels/watch', {
channelId: this.id
}).then(() => {
this.channel.isWatching = true;
this.update();
}, e => {
alert('error');
});
};
this.unwatch = () => {
this.$root.$data.os.api('channels/unwatch', {
channelId: this.id
}).then(() => {
this.channel.isWatching = false;
this.update();
}, e => {
alert('error');
});
};
</script>
</mk-channel>
<mk-channel-note>
<header>
<a class="index" @click="reply">{ note.index }:</a>
<a class="name" href={ _URL_ + '/@' + acct }><b>{ getUserName(note.user) }</b></a>
<mk-time time={ note.createdAt }/>
<mk-time time={ note.createdAt } mode="detail"/>
<span>ID:<i>{ acct }</i></span>
</header>
<div>
<a v-if="note.reply">&gt;&gt;{ note.reply.index }</a>
{ note.text }
<div class="media" v-if="note.media">
<template each={ file in note.media }>
<a href={ file.url } target="_blank">
<img src={ file.url + '?thumbnail&size=512' } alt={ file.name } title={ file.name }/>
</a>
</template>
</div>
</div>
<style lang="stylus" scoped>
:scope
display block
margin 0
padding 0
> header
position -webkit-sticky
position sticky
z-index 1
top 0
background rgba(239, 239, 239, 0.9)
> .index
margin-right 0.25em
color #000
> .name
margin-right 0.5em
color #008000
> mk-time
margin-right 0.5em
&:first-of-type
display none
@media (max-width 600px)
> mk-time
&:first-of-type
display initial
&:last-of-type
display none
> div
padding 0 0 1em 2em
> .media
> a
display inline-block
> img
max-width 100%
vertical-align bottom
</style>
<script lang="typescript">
import getAcct from '../../../../acct/render';
import getUserName from '../../../../renderers/get-user-name';
this.note = this.opts.note;
this.form = this.opts.form;
this.acct = getAcct(this.note.user);
this.name = getUserName(this.note.user);
this.reply = () => {
this.form.update({
reply: this.note
});
};
</script>
</mk-channel-note>
<mk-channel-form>
<p v-if="reply"><b>&gt;&gt;{ reply.index }</b> ({ getUserName(reply.user) }): <a @click="clearReply">[x]</a></p>
<textarea ref="text" disabled={ wait } oninput={ update } onkeydown={ onkeydown } onpaste={ onpaste } placeholder="%i18n:ch.tags.mk-channel-form.textarea%"></textarea>
<div class="actions">
<button @click="selectFile">%fa:upload%%i18n:ch.tags.mk-channel-form.upload%</button>
<button @click="drive">%fa:cloud%%i18n:ch.tags.mk-channel-form.drive%</button>
<button :class="{ wait: wait }" ref="submit" disabled={ wait || (refs.text.value.length == 0) } @click="note">
<template v-if="!wait">%fa:paper-plane%</template>{ wait ? '%i18n:!ch.tags.mk-channel-form.posting%' : '%i18n:!ch.tags.mk-channel-form.note%' }<mk-ellipsis v-if="wait"/>
</button>
</div>
<mk-uploader ref="uploader"/>
<ol v-if="files">
<li each={ files }>{ name }</li>
</ol>
<input ref="file" type="file" accept="image/*" multiple="multiple" onchange={ changeFile }/>
<style lang="stylus" scoped>
:scope
display block
> textarea
width 100%
max-width 100%
min-width 100%
min-height 5em
> .actions
display flex
> button
> [data-fa]
margin-right 0.25em
&:last-child
margin-left auto
&.wait
cursor wait
> input[type='file']
display none
</style>
<script lang="typescript">
import getUserName from '../../../../renderers/get-user-name';
this.mixin('api');
this.channel = this.opts.channel;
this.files = null;
this.on('mount', () => {
this.$refs.uploader.on('uploaded', file => {
this.update({
files: [file]
});
});
});
this.upload = file => {
this.$refs.uploader.upload(file);
};
this.clearReply = () => {
this.update({
reply: null
});
};
this.clear = () => {
this.clearReply();
this.update({
files: null
});
this.$refs.text.value = '';
};
this.note = () => {
this.update({
wait: true
});
const files = this.files && this.files.length > 0
? this.files.map(f => f.id)
: undefined;
this.$root.$data.os.api('notes/create', {
text: this.$refs.text.value == '' ? undefined : this.$refs.text.value,
mediaIds: files,
replyId: this.reply ? this.reply.id : undefined,
channelId: this.channel.id
}).then(data => {
this.clear();
}).catch(err => {
alert('失敗した');
}).then(() => {
this.update({
wait: false
});
});
};
this.changeFile = () => {
Array.from(this.$refs.file.files).forEach(this.upload);
};
this.selectFile = () => {
this.$refs.file.click();
};
this.drive = () => {
window['cb'] = files => {
this.update({
files: files
});
};
window.open(_URL_ + '/selectdrive?multiple=true',
'drive_window',
'height=500,width=800');
};
this.onkeydown = e => {
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post();
};
this.onpaste = e => {
Array.from(e.clipboardData.items).forEach(item => {
if (item.kind == 'file') {
this.upload(item.getAsFile());
}
});
};
this.getUserName = getUserName;
</script>
</mk-channel-form>
<mk-twitter-button>
<a href="https://twitter.com/share?ref_src=twsrc%5Etfw" class="twitter-share-button" data-show-count="false">Tweet</a>
<script lang="typescript">
this.on('mount', () => {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://platform.twitter.com/widgets.js');
script.setAttribute('async', 'async');
head.appendChild(script);
});
</script>
</mk-twitter-button>
<mk-line-button>
<div class="line-it-button" data-lang="ja" data-type="share-a" data-url={ _CH_URL_ } style="display: none;"></div>
<script lang="typescript">
this.on('mount', () => {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://d.line-scdn.net/r/web/social-plugin/js/thirdparty/loader.min.js');
script.setAttribute('async', 'async');
head.appendChild(script);
});
</script>
</mk-line-button>

View File

@ -1,20 +0,0 @@
<mk-header>
<div>
<a href={ _CH_URL_ }>Index</a> | <a href={ _URL_ }>Misskey</a>
</div>
<div>
<a v-if="!$root.$data.os.isSignedIn" href={ _URL_ }>ログイン(新規登録)</a>
<a v-if="$root.$data.os.isSignedIn" href={ _URL_ + '/@' + I.username }>{ I.username }</a>
</div>
<style lang="stylus" scoped>
:scope
display flex
> div:last-child
margin-left auto
</style>
<script lang="typescript">
this.mixin('i');
</script>
</mk-header>

View File

@ -1,37 +0,0 @@
<mk-index>
<mk-header/>
<hr>
<button @click="n">%i18n:ch.tags.mk-index.new%</button>
<hr>
<ul v-if="channels">
<li each={ channels }><a href={ '/' + this.id }>{ this.title }</a></li>
</ul>
<style lang="stylus" scoped>
:scope
display block
</style>
<script lang="typescript">
this.mixin('api');
this.on('mount', () => {
this.$root.$data.os.api('channels', {
limit: 100
}).then(channels => {
this.update({
channels: channels
});
});
});
this.n = () => {
const title = window.prompt('%i18n:!ch.tags.mk-index.channel-title%');
this.$root.$data.os.api('channels/create', {
title: title
}).then(channel => {
location.href = '/' + channel.id;
});
};
</script>
</mk-index>

View File

@ -1,3 +0,0 @@
require('./index.tag');
require('./channel.tag');
require('./header.tag');

View File

@ -1,13 +0,0 @@
import Stream from './stream';
import MiOS from '../../../mios';
/**
* Channel stream connection
*/
export default class Connection extends Stream {
constructor(os: MiOS, channelId) {
super(os, 'channel', {
channel: channelId
});
}
}

View File

@ -5,34 +5,34 @@
<div @click="choose('public')" :class="{ active: v == 'public' }"> <div @click="choose('public')" :class="{ active: v == 'public' }">
<div>%fa:globe%</div> <div>%fa:globe%</div>
<div> <div>
<span>公開</span> <span>%i18n:@public%</span>
</div> </div>
</div> </div>
<div @click="choose('home')" :class="{ active: v == 'home' }"> <div @click="choose('home')" :class="{ active: v == 'home' }">
<div>%fa:home%</div> <div>%fa:home%</div>
<div> <div>
<span>ホーム</span> <span>%i18n:@home%</span>
<span>ホームタイムラインにのみ公開</span> <span>%i18n:@home-desc%</span>
</div> </div>
</div> </div>
<div @click="choose('followers')" :class="{ active: v == 'followers' }"> <div @click="choose('followers')" :class="{ active: v == 'followers' }">
<div>%fa:unlock%</div> <div>%fa:unlock%</div>
<div> <div>
<span>フォロワー</span> <span>%i18n:@followers%</span>
<span>自分のフォロワーにのみ公開</span> <span>%i18n:@followers-desc%</span>
</div> </div>
</div> </div>
<div @click="choose('specified')" :class="{ active: v == 'specified' }"> <div @click="choose('specified')" :class="{ active: v == 'specified' }">
<div>%fa:envelope%</div> <div>%fa:envelope%</div>
<div> <div>
<span>ダイレクト</span> <span>%i18n:@specified%</span>
<span>指定したユーザーにのみ公開</span> <span>%i18n:@specified-desc%</span>
</div> </div>
</div> </div>
<div @click="choose('private')" :class="{ active: v == 'private' }"> <div @click="choose('private')" :class="{ active: v == 'private' }">
<div>%fa:lock%</div> <div>%fa:lock%</div>
<div> <div>
<span>非公開</span> <span>%i18n:@private%</span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,91 +0,0 @@
<template>
<div class="mkw-access-log">
<mk-widget-container :show-header="props.design == 0">
<template slot="header">%fa:server%%i18n:@title%</template>
<div :class="$style.logs" ref="log">
<p v-for="req in requests">
<span :class="$style.ip" :style="`color:${ req.fg }; background:${ req.bg }`">{{ req.ip }}</span>
<b>{{ req.method }}</b>
<span>{{ req.path }}</span>
</p>
</div>
</mk-widget-container>
</div>
</template>
<script lang="ts">
import define from '../../../common/define-widget';
import * as seedrandom from 'seedrandom';
export default define({
name: 'broadcast',
props: () => ({
design: 0
})
}).extend({
data() {
return {
requests: [],
connection: null,
connectionId: null
};
},
mounted() {
this.connection = (this as any).os.streams.requestsStream.getConnection();
this.connectionId = (this as any).os.streams.requestsStream.use();
this.connection.on('request', this.onRequest);
},
beforeDestroy() {
this.connection.off('request', this.onRequest);
(this as any).os.streams.requestsStream.dispose(this.connectionId);
},
methods: {
onRequest(request) {
const random = seedrandom(request.ip);
const r = Math.floor(random() * 255);
const g = Math.floor(random() * 255);
const b = Math.floor(random() * 255);
const luma = (0.2126 * r) + (0.7152 * g) + (0.0722 * b); // SMPTE C, Rec. 709 weightings
request.bg = `rgb(${r}, ${g}, ${b})`;
request.fg = luma >= 165 ? '#000' : '#fff';
this.requests.push(request);
if (this.requests.length > 30) this.requests.shift();
(this.$refs.log as any).scrollTop = (this.$refs.log as any).scrollHeight;
},
func() {
if (this.props.design == 1) {
this.props.design = 0;
} else {
this.props.design++;
}
this.save();
}
}
});
</script>
<style lang="stylus" module>
.logs
max-height 250px
overflow auto
> p
margin 0
padding 8px
font-size 0.8em
color #555
&:nth-child(odd)
background rgba(#000, 0.025)
> b
margin-right 4px
.ip
margin-right 4px
padding 0 4px
</style>

View File

@ -1,6 +1,5 @@
import Vue from 'vue'; import Vue from 'vue';
import wAccessLog from './access-log.vue';
import wVersion from './version.vue'; import wVersion from './version.vue';
import wRss from './rss.vue'; import wRss from './rss.vue';
import wServer from './server.vue'; import wServer from './server.vue';
@ -22,4 +21,3 @@ Vue.component('mkw-broadcast', wBroadcast);
Vue.component('mkw-server', wServer); Vue.component('mkw-server', wServer);
Vue.component('mkw-rss', wRss); Vue.component('mkw-rss', wRss);
Vue.component('mkw-version', wVersion); Vue.component('mkw-version', wVersion);
Vue.component('mkw-access-log', wAccessLog);

View File

@ -1,6 +1,6 @@
<template> <template>
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" @mousedown.prevent="onMousedown"> <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" @mousedown.prevent="onMousedown">
<title>Black ... Total<br/>Blue ... Notes<br/>Red ... Replies<br/>Green ... Renotes</title> <title>%i18n:@total%<br/>%i18n:@notes%<br/>%i18n:@replies%<br/>%i18n:@renotes%</title>
<polyline <polyline
:points="pointsNote" :points="pointsNote"
fill="none" fill="none"

View File

@ -2,7 +2,7 @@
<mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy"> <mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy">
<span slot="header"> <span slot="header">
<span v-html="title" :class="$style.title"></span> <span v-html="title" :class="$style.title"></span>
<span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}ファイル選択中)</span> <span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}%i18n:@choose-file%)</span>
</span> </span>
<mk-drive <mk-drive
@ -13,9 +13,9 @@
@change-selection="onChangeSelection" @change-selection="onChangeSelection"
/> />
<div :class="$style.footer"> <div :class="$style.footer">
<button :class="$style.upload" title="PCからドライブにファイルをアップロード" @click="upload">%fa:upload%</button> <button :class="$style.upload" title="%i18n:@upload%" @click="upload">%fa:upload%</button>
<button :class="$style.cancel" @click="cancel">キャンセル</button> <button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">決定</button> <button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">%i18n:@ok%</button>
</div> </div>
</mk-window> </mk-window>
</template> </template>
@ -28,7 +28,7 @@ export default Vue.extend({
default: false default: false
}, },
title: { title: {
default: '%fa:R file%ファイルを選択' default: '%fa:R file%%i18n:@choose-prompt%s'
} }
}, },
data() { data() {
@ -177,4 +177,3 @@ export default Vue.extend({
border-color #dcdcdc border-color #dcdcdc
</style> </style>

View File

@ -10,8 +10,8 @@
:multiple="false" :multiple="false"
/> />
<div :class="$style.footer"> <div :class="$style.footer">
<button :class="$style.cancel" @click="cancel">キャンセル</button> <button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
<button :class="$style.ok" @click="ok">決定</button> <button :class="$style.ok" @click="ok">%i18n:@ok%</button>
</div> </div>
</mk-window> </mk-window>
</template> </template>
@ -21,7 +21,7 @@ import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
props: { props: {
title: { title: {
default: '%fa:R folder%フォルダを選択' default: '%fa:R folder%%i18n:@choose-prompt%'
} }
}, },
methods: { methods: {

View File

@ -10,9 +10,9 @@
/> />
</div> </div>
<div :class="$style.actions"> <div :class="$style.actions">
<button :class="$style.skip" @click="skip">クロップをスキップ</button> <button :class="$style.skip" @click="skip">%i18n:@skip%</button>
<button :class="$style.cancel" @click="cancel">キャンセル</button> <button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
<button :class="$style.ok" @click="ok">決定</button> <button :class="$style.ok" @click="ok">%i18n:@ok%</button>
</div> </div>
</mk-window> </mk-window>
</template> </template>

View File

@ -3,15 +3,15 @@
:class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }" :class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }"
@click="onClick" @click="onClick"
:disabled="wait" :disabled="wait"
:title="user.isFollowing ? 'フォロー解除' : 'フォローする'" :title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'"
> >
<template v-if="!wait && user.isFollowing"> <template v-if="!wait && user.isFollowing">
<template v-if="size == 'compact'">%fa:minus%</template> <template v-if="size == 'compact'">%fa:minus%</template>
<template v-if="size == 'big'">%fa:minus%フォロー解除</template> <template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template>
</template> </template>
<template v-if="!wait && !user.isFollowing"> <template v-if="!wait && !user.isFollowing">
<template v-if="size == 'compact'">%fa:plus%</template> <template v-if="size == 'compact'">%fa:plus%</template>
<template v-if="size == 'big'">%fa:plus%フォロー</template> <template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template>
</template> </template>
<template v-if="wait">%fa:spinner .pulse .fw%</template> <template v-if="wait">%fa:spinner .pulse .fw%</template>
</button> </button>

View File

@ -1,7 +1,7 @@
<template> <template>
<mk-window width="400px" height="550px" @closed="$destroy"> <mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header"> <span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ user | userName }}のフォロワー <img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@followers%.replace('{}', {{ user | userName }})
</span> </span>
<mk-followers :user="user"/> <mk-followers :user="user"/>
</mk-window> </mk-window>

View File

@ -4,7 +4,7 @@
:count="user.followersCount" :count="user.followersCount"
:you-know-count="user.followersYouKnowCount" :you-know-count="user.followersYouKnowCount"
> >
フォロワーはいないようです %i18n:@empty%
</mk-users-list> </mk-users-list>
</template> </template>

View File

@ -1,7 +1,7 @@
<template> <template>
<mk-window width="400px" height="550px" @closed="$destroy"> <mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header"> <span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ user | userName }}のフォロー <img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@following%.replace('{}', {{ user | userName }})
</span> </span>
<mk-following :user="user"/> <mk-following :user="user"/>
</mk-window> </mk-window>

View File

@ -4,7 +4,7 @@
:count="user.followingCount" :count="user.followingCount"
:you-know-count="user.followingYouKnowCount" :you-know-count="user.followingYouKnowCount"
> >
フォロー中のユーザーはいないようです %i18n:@empty%
</mk-users-list> </mk-users-list>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="mk-friends-maker"> <div class="mk-friends-maker">
<p class="title">気になるユーザーをフォロー:</p> <p class="title">%i18n:@title%</p>
<div class="users" v-if="!fetching && users.length > 0"> <div class="users" v-if="!fetching && users.length > 0">
<div class="user" v-for="user in users" :key="user.id"> <div class="user" v-for="user in users" :key="user.id">
<mk-avatar class="avatar" :user="user" target="_blank"/> <mk-avatar class="avatar" :user="user" target="_blank"/>
@ -11,10 +11,10 @@
<mk-follow-button :user="user"/> <mk-follow-button :user="user"/>
</div> </div>
</div> </div>
<p class="empty" v-if="!fetching && users.length == 0">おすすめのユーザーは見つかりませんでした</p> <p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%読み込んでいます<mk-ellipsis/></p> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p>
<a class="refresh" @click="refresh">もっと見る</a> <a class="refresh" @click="refresh">%i18n:@refresh%</a>
<button class="close" @click="$destroy()" title="閉じる">%fa:times%</button> <button class="close" @click="$destroy()" title="%i18n:@close%">%fa:times%</button>
</div> </div>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy"> <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
<span slot="header" :class="$style.header">%fa:gamepad%オセロ</span> <span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
<mk-othello :class="$style.content" @gamed="g => game = g"/> <mk-othello :class="$style.content" @gamed="g => game = g"/>
</mk-window> </mk-window>
</template> </template>

View File

@ -21,8 +21,6 @@
<option value="polls">%i18n:@polls%</option> <option value="polls">%i18n:@polls%</option>
<option value="post-form">%i18n:@post-form%</option> <option value="post-form">%i18n:@post-form%</option>
<option value="messaging">%i18n:@messaging%</option> <option value="messaging">%i18n:@messaging%</option>
<option value="channel">%i18n:@channel%</option>
<option value="access-log">%i18n:@access-log%</option>
<option value="server">%i18n:@server%</option> <option value="server">%i18n:@server%</option>
<option value="donation">%i18n:@donation%</option> <option value="donation">%i18n:@donation%</option>
<option value="nav">%i18n:@nav%</option> <option value="nav">%i18n:@nav%</option>

View File

@ -8,8 +8,8 @@
<input ref="text" v-model="text" :type="type" @keydown="onKeydown" :placeholder="placeholder"/> <input ref="text" v-model="text" :type="type" @keydown="onKeydown" :placeholder="placeholder"/>
</div> </div>
<div :class="$style.actions"> <div :class="$style.actions">
<button :class="$style.cancel" @click="cancel">キャンセル</button> <button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
<button :class="$style.ok" :disabled="!allowEmpty && text.length == 0" @click="ok">決定</button> <button :class="$style.ok" :disabled="!allowEmpty && text.length == 0" @click="ok">%i18n:@ok%</button>
</div> </div>
</mk-window> </mk-window>
</template> </template>

View File

@ -1,125 +0,0 @@
<template>
<div class="mk-mentions">
<header>
<span :data-active="mode == 'all'" @click="mode = 'all'">すべて</span>
<span :data-active="mode == 'following'" @click="mode = 'following'">フォロー中</span>
</header>
<div class="fetching" v-if="fetching">
<mk-ellipsis-icon/>
</div>
<p class="empty" v-if="notes.length == 0 && !fetching">
%fa:R comments%
<span v-if="mode == 'all'">あなた宛ての投稿はありません</span>
<span v-if="mode == 'following'">あなたがフォローしているユーザーからの言及はありません</span>
</p>
<mk-notes :notes="notes" ref="timeline"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
fetching: true,
moreFetching: false,
mode: 'all',
notes: []
};
},
watch: {
mode() {
this.fetch();
}
},
mounted() {
document.addEventListener('keydown', this.onDocumentKeydown);
window.addEventListener('scroll', this.onScroll);
this.fetch(() => this.$emit('loaded'));
},
beforeDestroy() {
document.removeEventListener('keydown', this.onDocumentKeydown);
window.removeEventListener('scroll', this.onScroll);
},
methods: {
onDocumentKeydown(e) {
if (e.target.tagName != 'INPUT' && e.target.tagName != 'TEXTAREA') {
if (e.which == 84) { // t
(this.$refs.timeline as any).focus();
}
}
},
onScroll() {
const current = window.scrollY + window.innerHeight;
if (current > document.body.offsetHeight - 8) this.more();
},
fetch(cb?) {
this.fetching = true;
this.notes = [];
(this as any).api('notes/mentions', {
following: this.mode == 'following'
}).then(notes => {
this.notes = notes;
this.fetching = false;
if (cb) cb();
});
},
more() {
if (this.moreFetching || this.fetching || this.notes.length == 0) return;
this.moreFetching = true;
(this as any).api('notes/mentions', {
following: this.mode == 'following',
untilId: this.notes[this.notes.length - 1].id
}).then(notes => {
this.notes = this.notes.concat(notes);
this.moreFetching = false;
});
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
.mk-mentions
background #fff
border solid 1px rgba(#000, 0.075)
border-radius 6px
> header
padding 8px 16px
border-bottom solid 1px #eee
> span
margin-right 16px
line-height 27px
font-size 18px
color #555
&:not([data-active])
color $theme-color
cursor pointer
&:hover
text-decoration underline
> .fetching
padding 64px 0
> .empty
display block
margin 0 auto
padding 32px
max-width 400px
text-align center
color #999
> [data-fa]
display block
margin-bottom 16px
font-size 3em
color #ccc
</style>

View File

@ -1,6 +1,6 @@
<template> <template>
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy"> <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
<span slot="header" :class="$style.header">%fa:comments%メッセージ: {{ user | userName }}</span> <span slot="header" :class="$style.header">%fa:comments%%i18n:@title% {{ user | userName }}</span>
<mk-messaging-room :user="user" :class="$style.content"/> <mk-messaging-room :user="user" :class="$style.content"/>
</mk-window> </mk-window>
</template> </template>

View File

@ -15,7 +15,7 @@
</header> </header>
<div class="body"> <div class="body">
<div class="text"> <div class="text">
<span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
<mk-note-html v-if="note.text" :text="note.text" :i="os.i"/> <mk-note-html v-if="note.text" :text="note.text" :i="os.i"/>
</div> </div>
<div class="media" v-if="note.mediaIds.length > 0"> <div class="media" v-if="note.mediaIds.length > 0">

View File

@ -3,7 +3,7 @@
<button <button
class="read-more" class="read-more"
v-if="p.reply && p.reply.replyId && context.length == 0" v-if="p.reply && p.reply.replyId && context.length == 0"
title="会話をもっと読み込む" title="%i18n:@more%"
@click="fetchContext" @click="fetchContext"
:disabled="contextFetching" :disabled="contextFetching"
> >
@ -21,7 +21,7 @@
<mk-avatar class="avatar" :user="note.user"/> <mk-avatar class="avatar" :user="note.user"/>
%fa:retweet% %fa:retweet%
<router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link> <router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link>
がRenote %i18n:@is-renote%
</p> </p>
</div> </div>
<article> <article>
@ -35,7 +35,7 @@
</header> </header>
<div class="body"> <div class="body">
<div class="text"> <div class="text">
<span v-if="p.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> <span v-if="p.isHidden" style="opacity: 0.5">%i18n:@private%</span>
<mk-note-html v-if="p.text" :text="p.text" :i="os.i"/> <mk-note-html v-if="p.text" :text="p.text" :i="os.i"/>
</div> </div>
<div class="media" v-if="p.media.length > 0"> <div class="media" v-if="p.media.length > 0">
@ -46,7 +46,7 @@
<div class="tags" v-if="p.tags && p.tags.length > 0"> <div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link>
</div> </div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a> <a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div> <div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote"> <div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote"/> <mk-note-preview :note="p.renote"/>
@ -54,15 +54,15 @@
</div> </div>
<footer> <footer>
<mk-reactions-viewer :note="p"/> <mk-reactions-viewer :note="p"/>
<button @click="reply" title="返信"> <button @click="reply" title="">
<template v-if="p.reply">%fa:reply-all%</template> <template v-if="p.reply">%fa:reply-all%</template>
<template v-else>%fa:reply%</template> <template v-else>%fa:reply%</template>
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p> <p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
</button> </button>
<button @click="renote" title="Renote"> <button @click="renote" title="%i18n:@renote%>
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p> %fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
</button> </button>
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="リアクション"> <button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p> %fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
</button> </button>
<button @click="menu" ref="menuButton"> <button @click="menu" ref="menuButton">

View File

@ -33,9 +33,6 @@
</div> </div>
</header> </header>
<div class="body"> <div class="body">
<p class="channel" v-if="p.channel">
<a :href="`${_CH_URL_}/${p.channel.id}`" target="_blank">{{ p.channel.title }}</a>:
</p>
<p v-if="p.cw != null" class="cw"> <p v-if="p.cw != null" class="cw">
<span class="text" v-if="p.cw != ''">{{ p.cw }}</span> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
<span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span> <span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span>
@ -574,9 +571,6 @@ root(isDark)
.mk-url-preview .mk-url-preview
margin-top 8px margin-top 8px
> .channel
margin 0
> .mk-poll > .mk-poll
font-size 80% font-size 80%

View File

@ -5,8 +5,8 @@
<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot> <slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot>
<div v-if="!fetching && requestInitPromise != null"> <div v-if="!fetching && requestInitPromise != null">
<p>読み込みに失敗しました</p> <p>%i18n:@error%</p>
<button @click="resolveInitPromise">リトライ</button> <button @click="resolveInitPromise">%i18n:@retry%</button>
</div> </div>
<transition-group name="mk-notes" class="transition"> <transition-group name="mk-notes" class="transition">

View File

@ -2,7 +2,7 @@
<mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="$destroy"> <mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="$destroy">
<span slot="header">{{ title }}<mk-ellipsis/></span> <span slot="header">{{ title }}<mk-ellipsis/></span>
<div :class="$style.body"> <div :class="$style.body">
<p :class="$style.init" v-if="isNaN(value)">待機中<mk-ellipsis/></p> <p :class="$style.init" v-if="isNaN(value)">%i18n:@waiting%<mk-ellipsis/></p>
<p :class="$style.percentage" v-if="!isNaN(value)">{{ Math.floor((value / max) * 100) }}</p> <p :class="$style.percentage" v-if="!isNaN(value)">{{ Math.floor((value / max) * 100) }}</p>
<progress :class="$style.progress" <progress :class="$style.progress"
v-if="!isNaN(value) && value < max" v-if="!isNaN(value) && value < max"

View File

@ -19,91 +19,91 @@
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
<h1>動作</h1> <h1>%i18n:@behaviour%</h1>
<mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="スクロールで自動読み込み"> <mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%">
<span>ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます</span> <span>%i18n:@fetch-on-scroll-desc%</span>
</mk-switch> </mk-switch>
<mk-switch v-model="autoPopout" text="ウィンドウの自動ポップアウト"> <mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
<span>ウィンドウが開かれるときポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトしますこの設定はブラウザに記憶されます</span> <span>%i18n:@auto-popout-desc%</span>
</mk-switch> </mk-switch>
<details> <details>
<summary>詳細設定</summary> <summary>%i18n:@advanced%</summary>
<mk-switch v-model="apiViaStream" text="ストリームを経由したAPIリクエスト"> <mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%">
<span>この設定をオンにするとwebsocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)オフにするとネイティブの fetch APIが利用されますこの設定はこのデバイスのみ有効です</span> <span>%i18n:@api-via-stream-desc%</span>
</mk-switch> </mk-switch>
</details> </details>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
<h1>デザインと表示</h1> <h1>%i18n:@display%</h1>
<div class="div"> <div class="div">
<button class="ui button" @click="customizeHome" style="margin-bottom: 16px">ホームをカスタマイズ</button> <button class="ui button" @click="customizeHome" style="margin-bottom: 16px">%i18n:@customize%</button>
</div> </div>
<div class="div"> <div class="div">
<mk-switch v-model="darkmode" text="ダークモード"/> <mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
<mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="円形のアイコンを使用"/> <mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
<mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="ウィンドウのタイトルバーにグラデーションを使用"/> <mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
</div> </div>
<mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="タイムライン上部に投稿フォームを表示する"/> <mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
<mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="リプライ先を表示する"/> <mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
<mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="自分の行ったRenoteをタイムラインに表示する"/> <mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
<mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="Renoteされた自分の投稿をタイムラインに表示する"/> <mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
<mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="マップの自動展開"> <mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
<span>位置情報が添付された投稿のマップを自動的に展開します</span> <span>%i18n:@show-maps-desc%</span>
</mk-switch> </mk-switch>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
<h1>サウンド</h1> <h1>%i18n:@sound%</h1>
<mk-switch v-model="enableSounds" text="サウンドを有効にする"> <mk-switch v-model="enableSounds" text="%i18n:@enable-sounds%">
<span>投稿やメッセージを送受信したときなどにサウンドを再生しますこの設定はブラウザに記憶されます</span> <span>%i18n:@enable-sounds-desc%</span>
</mk-switch> </mk-switch>
<label>ボリューム</label> <label>%i18n:@volume%</label>
<el-slider <el-slider
v-model="soundVolume" v-model="soundVolume"
:show-input="true" :show-input="true"
:format-tooltip="v => `${v}%`" :format-tooltip="v => `${v}%`"
:disabled="!enableSounds" :disabled="!enableSounds"
/> />
<button class="ui button" @click="soundTest">%fa:volume-up% テスト</button> <button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
<h1>モバイル</h1> <h1>%i18n:@mobile%</h1>
<mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="モバイルからの投稿フラグを付けない"/> <mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
<h1>言語</h1> <h1>%i18n:@language%</h1>
<el-select v-model="lang" placeholder="言語を選択"> <el-select v-model="lang" placeholder="%i18n:@pick-language%">
<el-option-group label="推奨"> <el-option-group label="%i18n:@recommended%">
<el-option label="自動" value=""/> <el-option label="%i18n:@auto%" value=""/>
</el-option-group> </el-option-group>
<el-option-group label="言語を指定"> <el-option-group label="%i18n:@specify-language%">
<el-option label="ja" value="ja"/> <el-option label="日本語" value="ja"/>
<el-option label="en" value="en"/> <el-option label="English" value="en"/>
<el-option label="fr" value="fr"/> <el-option label="Français" value="fr"/>
<el-option label="pl" value="pl"/> <el-option label="Polski" value="pl"/>
<el-option label="de" value="de"/> <el-option label="Deutsch" value="de"/>
</el-option-group> </el-option-group>
</el-select> </el-select>
<div class="none ui info"> <div class="none ui info">
<p>%fa:info-circle%変更はページの再度読み込み後に反映されます。</p> <p>%fa:info-circle%%i18n:@language-desc%</p>
</div> </div>
</section> </section>
<section class="web" v-show="page == 'web'"> <section class="web" v-show="page == 'web'">
<h1>キャッシュ</h1> <h1>%i18n:@cache%</h1>
<button class="ui button" @click="clean">クリーンアップ</button> <button class="ui button" @click="clean">%i18n:@clean-cache%</button>
<div class="none ui info warn"> <div class="none ui info warn">
<p>%fa:exclamation-triangle%クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。</p> <p>%fa:exclamation-triangle%%i18n:@cache-warn%</p>
</div> </div>
</section> </section>
<section class="notification" v-show="page == 'notification'"> <section class="notification" v-show="page == 'notification'">
<h1>%i18n:@notification%</h1> <h1>%i18n:@notification%</h1>
<mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="投稿の自動ウォッチ"> <mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%">
<span>リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。</span> <span>%i18n:@auto-watch-desc%</span>
</mk-switch> </mk-switch>
</section> </section>
@ -148,57 +148,57 @@
</section> </section>
<section class="other" v-show="page == 'other'"> <section class="other" v-show="page == 'other'">
<h1>Misskeyについて</h1> <h1>%i18n:@about%</h1>
<p v-if="meta">このサーバーの運営者: <i><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></i></p> <p v-if="meta">%i18n:@operator%: <i><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></i></p>
</section> </section>
<section class="other" v-show="page == 'other'"> <section class="other" v-show="page == 'other'">
<h1>Misskey Update</h1> <h1>%i18n:@update%</h1>
<p> <p>
<span>バージョン: <i>{{ version }}</i></span> <span>%i18n:@version% <i>{{ version }}</i></span>
<template v-if="latestVersion !== undefined"> <template v-if="latestVersion !== undefined">
<br> <br>
<span>最新のバージョン: <i>{{ latestVersion ? latestVersion : version }}</i></span> <span>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></span>
</template> </template>
</p> </p>
<button class="ui button block" @click="checkForUpdate" :disabled="checkingForUpdate"> <button class="ui button block" @click="checkForUpdate" :disabled="checkingForUpdate">
<template v-if="checkingForUpdate">アップデートを確認中<mk-ellipsis/></template> <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
<template v-else>アップデートを確認</template> <template v-else>%i18n:@do-update%</template>
</button> </button>
<details> <details>
<summary>詳細設定</summary> <summary>%i18n:@update-settings%</summary>
<mk-switch v-model="preventUpdate" text="アップデートを延期する(非推奨)"> <mk-switch v-model="preventUpdate" text="%i18n:@prevent-update%">
<span>この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。</span> <span>%i18n:@prevent-update-desc%</span>
</mk-switch> </mk-switch>
</details> </details>
</section> </section>
<section class="other" v-show="page == 'other'"> <section class="other" v-show="page == 'other'">
<h1>高度な設定</h1> <h1>%i18n:@advanced-settings%</h1>
<mk-switch v-model="debug" text="デバッグモードを有効にする"> <mk-switch v-model="debug" text="%i18n:@debug-mode%">
<span>この設定はブラウザに記憶されます。</span> <span>%i18n:@debug-mode-desc%</span>
</mk-switch> </mk-switch>
<template v-if="debug"> <template v-if="debug">
<mk-switch v-model="useRawScript" text="生のスクリプトを読み込む"> <mk-switch v-model="useRawScript" text="%i18n:@use-raw-script%">
<span>圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。</span> <span>%i18n:@use-raw-script-desc%</span>
</mk-switch> </mk-switch>
<div class="none ui info"> <div class="none ui info">
<p>%fa:info-circle%Misskeyはソースマップも提供しています。</p> <p>%fa:info-circle%%i18n:@source-info%</p>
</div> </div>
</template> </template>
<mk-switch v-model="enableExperimental" text="実験的機能を有効にする"> <mk-switch v-model="enableExperimental" text="%i18n:@experimental%">
<span>実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。</span> <span>%i18n:@experimental-desc%</span>
</mk-switch> </mk-switch>
<details v-if="debug"> <details v-if="debug">
<summary>ツール</summary> <summary>%i18n:@tools%</summary>
<button class="ui button block" @click="taskmngr">タスクマネージャ</button> <button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button>
</details> </details>
</section> </section>
<section class="other" v-show="page == 'other'"> <section class="other" v-show="page == 'other'">
<h1>%i18n:@license%</h1> <h1>%i18n:@license%</h1>
<div v-html="license"></div> <div v-html="license"></div>
<a :href="licenseUrl" target="_blank">サードパーティ</a> <a :href="licenseUrl" target="_blank">%i18n:@third-parties%</a>
</section> </section>
</div> </div>
</div> </div>
@ -371,13 +371,13 @@ export default Vue.extend({
this.latestVersion = newer; this.latestVersion = newer;
if (newer == null) { if (newer == null) {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '利用可能な更新はありません', title: '%i18n:!@no-updates%',
text: 'お使いのMisskeyは最新です。' text: '%i18n:!@no-updates-desc%'
}); });
} else { } else {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '新しいバージョンが利用可能です', title: '%i18n:!@update-available%',
text: 'ページを再度読み込みすると更新が適用されます。' text: '%i18n:!@update-available-desc%'
}); });
} }
}); });
@ -385,8 +385,8 @@ export default Vue.extend({
clean() { clean() {
localStorage.clear(); localStorage.clear();
(this as any).apis.dialog({ (this as any).apis.dialog({
title: 'キャッシュを削除しました', title: '%i18n:!@cache-cleared%',
text: 'ページを再度読み込みしてください。' text: '%i18n:!@caache-cleared-desc%'
}); });
}, },
soundTest() { soundTest() {

View File

@ -1,17 +1,17 @@
<template> <template>
<div class="mk-sub-note-content"> <div class="mk-sub-note-content">
<div class="body"> <div class="body">
<span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span> <span v-if="note.isHidden" style="opacity: 0.5">%i18n:@hidden%</span>
<a class="reply" v-if="note.replyId">%fa:reply%</a> <a class="reply" v-if="note.replyId">%fa:reply%</a>
<mk-note-html :text="note.text" :i="os.i"/> <mk-note-html :text="note.text" :i="os.i"/>
<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a> <a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
</div> </div>
<details v-if="note.media.length > 0"> <details v-if="note.media.length > 0">
<summary>({{ note.media.length }}つのメディア)</summary> <summary>({{ note.media.length }}%i18n:@media%)</summary>
<mk-media-list :media-list="note.media"/> <mk-media-list :media-list="note.media"/>
</details> </details>
<details v-if="note.poll"> <details v-if="note.poll">
<summary>投票</summary> <summary>%i18n:@poll%</summary>
<mk-poll :note="note"/> <mk-poll :note="note"/>
</details> </details>
</div> </div>

View File

@ -1,6 +1,6 @@
<template> <template>
<mk-window ref="window" width="750px" height="500px" @closed="$destroy" name="TaskManager"> <mk-window ref="window" width="750px" height="500px" @closed="$destroy" name="TaskManager">
<span slot="header" :class="$style.header">%fa:stethoscope%タスクマネージャ</span> <span slot="header" :class="$style.header">%fa:stethoscope%%i18n:@title%</span>
<el-tabs :class="$style.content"> <el-tabs :class="$style.content">
<el-tab-pane label="Requests"> <el-tab-pane label="Requests">
<el-table <el-table

View File

@ -7,7 +7,7 @@
<span class="username">@{{ user | acct }}</span> <span class="username">@{{ user | acct }}</span>
</header> </header>
<div class="body"> <div class="body">
<p class="followed" v-if="user.isFollowed">フォローされています</p> <p class="followed" v-if="user.isFollowed">%i18n:@followed%</p>
<div class="description">{{ user.description }}</div> <div class="description">{{ user.description }}</div>
</div> </div>
</div> </div>

View File

@ -9,8 +9,8 @@
> >
<h1><slot name="header"></slot></h1> <h1><slot name="header"></slot></h1>
<div> <div>
<button class="popout" v-if="popoutUrl" @mousedown.stop="() => {}" @click="popout" title="ポップアウト">%fa:R window-restore%</button> <button class="popout" v-if="popoutUrl" @mousedown.stop="() => {}" @click="popout" title="%i18n:@popout%">%fa:R window-restore%</button>
<button class="close" v-if="canClose" @mousedown.stop="() => {}" @click="close" title="閉じる">%fa:times%</button> <button class="close" v-if="canClose" @mousedown.stop="() => {}" @click="close" title="%i18n:@close%">%fa:times%</button>
</div> </div>
</header> </header>
<div class="content"> <div class="content">

View File

@ -16,11 +16,11 @@ export default Vue.extend({
this.folder = this.$route.params.folder; this.folder = this.$route.params.folder;
}, },
mounted() { mounted() {
document.title = 'Misskey Drive'; document.title = '%i18n:@title%';
}, },
methods: { methods: {
onMoveRoot() { onMoveRoot() {
const title = 'Misskey Drive'; const title = '%i18n:@title%';
// Rewrite URL // Rewrite URL
history.pushState(null, title, '/i/drive'); history.pushState(null, title, '/i/drive');
@ -28,7 +28,7 @@ export default Vue.extend({
document.title = title; document.title = title;
}, },
onOpenFolder(folder) { onOpenFolder(folder) {
const title = folder.name + ' | Misskey Drive'; const title = folder.name + ' | %i18n:@title%';
// Rewrite URL // Rewrite URL
history.pushState(null, title, '/i/drive/folder/' + folder.id); history.pushState(null, title, '/i/drive/folder/' + folder.id);
@ -49,4 +49,3 @@ export default Vue.extend({
> .mk-drive > .mk-drive
height 100% height 100%
</style> </style>

View File

@ -4,7 +4,7 @@
<template v-for="favorite in favorites"> <template v-for="favorite in favorites">
<mk-note-detail :note="favorite.note" :key="favorite.note.id"/> <mk-note-detail :note="favorite.note" :key="favorite.note.id"/>
</template> </template>
<a v-if="existMore" @click="more">さらに読み込む</a> <a v-if="existMore" @click="more">%i18n:@more%</a>
</main> </main>
</mk-ui> </mk-ui>
</template> </template>

View File

@ -6,7 +6,7 @@
import Vue from 'vue'; import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = 'Misskey - ホームのカスタマイズ'; document.title = 'Misskey - %i18n:@title%';
} }
}); });
</script> </script>

View File

@ -1,8 +1,8 @@
<template> <template>
<div> <div>
<mk-widget-container> <mk-widget-container>
<template slot="header">%fa:users% ユーザー</template> <template slot="header">%fa:users% %i18n:@users%</template>
<button slot="func" title="ユーザーを追加" @click="add">%fa:plus%</button> <button slot="func" title="%i18n:@add-user%" @click="add">%fa:plus%</button>
<div data-id="d0b63759-a822-4556-a5ce-373ab966e08a"> <div data-id="d0b63759-a822-4556-a5ce-373ab966e08a">
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw% %i18n:common.loading%<mk-ellipsis/></p> <p class="fetching" v-if="fetching">%fa:spinner .pulse .fw% %i18n:common.loading%<mk-ellipsis/></p>
@ -48,7 +48,7 @@ export default Vue.extend({
methods: { methods: {
add() { add() {
(this as any).apis.input({ (this as any).apis.input({
title: 'ユーザー名', title: '%i18n:@username%',
}).then(async username => { }).then(async username => {
const user = await (this as any).api('users/show', { const user = await (this as any).api('users/show', {
username username

View File

@ -1,15 +1,15 @@
<template> <template>
<div class="timeline"> <div class="timeline">
<header> <header>
<span :data-active="mode == 'default'" @click="mode = 'default'">投稿</span> <span :data-active="mode == 'default'" @click="mode = 'default'">%i18n:@default%</span>
<span :data-active="mode == 'with-replies'" @click="mode = 'with-replies'">投稿と返信</span> <span :data-active="mode == 'with-replies'" @click="mode = 'with-replies'">%i18n:@with-replies%</span>
<span :data-active="mode == 'with-media'" @click="mode = 'with-media'">メディア</span> <span :data-active="mode == 'with-media'" @click="mode = 'with-media'">%i18n:@with-media%</span>
</header> </header>
<div class="loading" v-if="fetching"> <div class="loading" v-if="fetching">
<mk-ellipsis-icon/> <mk-ellipsis-icon/>
</div> </div>
<mk-notes ref="timeline" :more="existMore ? more : null"> <mk-notes ref="timeline" :more="existMore ? more : null">
<p class="empty" slot="empty">%fa:R comments%このユーザーはまだ何も投稿していないようです</p> <p class="empty" slot="empty">%fa:R comments%%i18n:@empty%</p>
</mk-notes> </mk-notes>
</div> </div>
</template> </template>

View File

@ -1,67 +0,0 @@
<template>
<div class="form">
<input v-model="text" :disabled="wait" @keydown="onKeydown" placeholder="書いて">
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
text: '',
wait: false
};
},
methods: {
onKeydown(e) {
if (e.which == 10 || e.which == 13) this.post();
},
post() {
this.wait = true;
let reply = null;
if (/^>>([0-9]+) /.test(this.text)) {
const index = this.text.match(/^>>([0-9]+) /)[1];
reply = (this.$parent as any).notes.find(p => p.index.toString() == index);
this.text = this.text.replace(/^>>([0-9]+) /, '');
}
(this as any).api('notes/create', {
text: this.text,
replyId: reply ? reply.id : undefined,
channelId: (this.$parent as any).channel.id
}).then(data => {
this.text = '';
}).catch(err => {
alert('失敗した');
}).then(() => {
this.wait = false;
});
}
}
});
</script>
<style lang="stylus" scoped>
.form
width 100%
height 38px
padding 4px
border-top solid 1px #ddd
> input
padding 0 8px
width 100%
height 100%
font-size 14px
color #55595c
border solid 1px #dadada
border-radius 4px
&:hover
&:focus
border-color #aeaeae
</style>

View File

@ -1,65 +0,0 @@
<template>
<div class="note">
<header>
<a class="index" @click="reply">{{ note.index }}:</a>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id"><b>{{ note.user | userName }}</b></router-link>
<span>ID:<i>{{ note.user | acct }}</i></span>
</header>
<div>
<a v-if="note.reply">&gt;&gt;{{ note.reply.index }}</a>
{{ note.text }}
<div class="media" v-if="note.media">
<a v-for="file in note.media" :href="file.url" target="_blank">
<img :src="`${file.url}?thumbnail&size=512`" :alt="file.name" :title="file.name"/>
</a>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['note'],
methods: {
reply() {
this.$emit('reply', this.note);
}
}
});
</script>
<style lang="stylus" scoped>
.note
margin 0
padding 0
color #444
> header
position -webkit-sticky
position sticky
z-index 1
top 0
padding 8px 4px 4px 16px
background rgba(255, 255, 255, 0.9)
> .index
margin-right 0.25em
> .name
margin-right 0.5em
color #008000
> div
padding 0 16px 16px 16px
> .media
> a
display inline-block
> img
max-width 100%
vertical-align bottom
</style>

View File

@ -1,106 +0,0 @@
<template>
<div class="channel">
<p v-if="fetching">読み込み中<mk-ellipsis/></p>
<div v-if="!fetching" ref="notes" class="notes">
<p v-if="notes.length == 0">まだ投稿がありません</p>
<x-note class="note" v-for="note in notes.slice().reverse()" :note="note" :key="note.id" @reply="reply"/>
</div>
<x-form class="form" ref="form"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import ChannelStream from '../../../common/scripts/streaming/channel';
import XForm from './channel.channel.form.vue';
import XNote from './channel.channel.note.vue';
export default Vue.extend({
components: {
XForm,
XNote
},
props: ['channel'],
data() {
return {
fetching: true,
notes: [],
connection: null
};
},
watch: {
channel() {
this.zap();
}
},
mounted() {
this.zap();
},
beforeDestroy() {
this.disconnect();
},
methods: {
zap() {
this.fetching = true;
(this as any).api('channels/notes', {
channelId: this.channel.id
}).then(notes => {
this.notes = notes;
this.fetching = false;
this.$nextTick(() => {
this.scrollToBottom();
});
this.disconnect();
this.connection = new ChannelStream((this as any).os, this.channel.id);
this.connection.on('note', this.onNote);
});
},
disconnect() {
if (this.connection) {
this.connection.off('note', this.onNote);
this.connection.close();
}
},
onNote(note) {
this.notes.unshift(note);
this.scrollToBottom();
},
scrollToBottom() {
(this.$refs.notes as any).scrollTop = (this.$refs.notes as any).scrollHeight;
},
reply(note) {
(this.$refs.form as any).text = `>>${ note.index } `;
}
}
});
</script>
<style lang="stylus" scoped>
.channel
> p
margin 0
padding 16px
text-align center
color #aaa
> .notes
height calc(100% - 38px)
overflow auto
font-size 0.9em
> .note
border-bottom solid 1px #eee
&:last-child
border-bottom none
> .form
position absolute
left 0
bottom 0
</style>

View File

@ -1,108 +0,0 @@
<template>
<div class="mkw-channel">
<template v-if="!props.compact">
<p class="title">%fa:tv%{{ channel ? channel.title : '%i18n:!@title%' }}</p>
<button @click="settings" title="%i18n:@settings%">%fa:cog%</button>
</template>
<p class="get-started" v-if="props.channel == null">%i18n:@get-started%</p>
<x-channel class="channel" :channel="channel" v-if="channel != null"/>
</div>
</template>
<script lang="ts">
import define from '../../../common/define-widget';
import XChannel from './channel.channel.vue';
export default define({
name: 'server',
props: () => ({
channel: null,
compact: false
})
}).extend({
components: {
XChannel
},
data() {
return {
fetching: true,
channel: null
};
},
mounted() {
if (this.props.channel) {
this.zap();
}
},
methods: {
func() {
this.props.compact = !this.props.compact;
this.save();
},
settings() {
const id = window.prompt('チャンネルID');
if (!id) return;
this.props.channel = id;
this.zap();
},
zap() {
this.fetching = true;
(this as any).api('channels/show', {
channelId: this.props.channel
}).then(channel => {
this.channel = channel;
this.fetching = false;
});
}
}
});
</script>
<style lang="stylus" scoped>
.mkw-channel
background #fff
border solid 1px rgba(#000, 0.075)
border-radius 6px
overflow hidden
> .title
z-index 2
margin 0
padding 0 16px
line-height 42px
font-size 0.9em
font-weight bold
color #888
box-shadow 0 1px rgba(#000, 0.07)
> [data-fa]
margin-right 4px
> button
position absolute
z-index 2
top 0
right 0
padding 0
width 42px
font-size 0.9em
line-height 42px
color #ccc
&:hover
color #aaa
&:active
color #999
> .get-started
margin 0
padding 16px
text-align center
color #aaa
> .channel
height 200px
</style>

View File

@ -8,7 +8,6 @@ import wUsers from './users.vue';
import wPolls from './polls.vue'; import wPolls from './polls.vue';
import wPostForm from './post-form.vue'; import wPostForm from './post-form.vue';
import wMessaging from './messaging.vue'; import wMessaging from './messaging.vue';
import wChannel from './channel.vue';
import wProfile from './profile.vue'; import wProfile from './profile.vue';
Vue.component('mkw-notifications', wNotifications); Vue.component('mkw-notifications', wNotifications);
@ -19,5 +18,4 @@ Vue.component('mkw-users', wUsers);
Vue.component('mkw-polls', wPolls); Vue.component('mkw-polls', wPolls);
Vue.component('mkw-post-form', wPostForm); Vue.component('mkw-post-form', wPostForm);
Vue.component('mkw-messaging', wMessaging); Vue.component('mkw-messaging', wMessaging);
Vue.component('mkw-channel', wChannel);
Vue.component('mkw-profile', wProfile); Vue.component('mkw-profile', wProfile);

View File

@ -5,12 +5,12 @@
> >
<div class="banner" <div class="banner"
:style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=256)` : ''" :style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=256)` : ''"
title="クリックでバナー編集" title="%i18n:@update-banner%"
@click="os.apis.updateBanner" @click="os.apis.updateBanner"
></div> ></div>
<mk-avatar class="avatar" :user="os.i" <mk-avatar class="avatar" :user="os.i"
@click="os.apis.updateAvatar" @click="os.apis.updateAvatar"
title="クリックでアバター編集" title="%i18n:@update-avatar%"
/> />
<router-link class="name" :to="os.i | userPage">{{ os.i | userName }}</router-link> <router-link class="name" :to="os.i | userPage">{{ os.i | userName }}</router-link>
<p class="username">@{{ os.i | acct }}</p> <p class="username">@{{ os.i | acct }}</p>

View File

@ -2,11 +2,17 @@
* Mobile Client * Mobile Client
*/ */
import Vue from 'vue';
import VueRouter from 'vue-router'; import VueRouter from 'vue-router';
import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert } from 'vue-material/dist/components';
import 'vue-material/dist/vue-material.min.css';
import 'vue-material/dist/theme/default.css';
// Style // Style
import './style.styl'; import './style.styl';
import '../../element.scss'; import '../../element.scss';
import '../../md.scss';
import init from '../init'; import init from '../init';
@ -31,9 +37,18 @@ import MkSearch from './views/pages/search.vue';
import MkFollowers from './views/pages/followers.vue'; import MkFollowers from './views/pages/followers.vue';
import MkFollowing from './views/pages/following.vue'; import MkFollowing from './views/pages/following.vue';
import MkSettings from './views/pages/settings.vue'; import MkSettings from './views/pages/settings.vue';
import MkProfileSetting from './views/pages/profile-setting.vue';
import MkOthello from './views/pages/othello.vue'; import MkOthello from './views/pages/othello.vue';
Vue.use(MdCard);
Vue.use(MdButton);
Vue.use(MdField);
Vue.use(MdMenu);
Vue.use(MdList);
Vue.use(MdSwitch);
Vue.use(MdSubheader);
Vue.use(MdDialog);
Vue.use(MdDialogAlert);
/** /**
* init * init
*/ */
@ -55,7 +70,6 @@ init((launch) => {
{ path: '/', name: 'index', component: MkIndex }, { path: '/', name: 'index', component: MkIndex },
{ path: '/signup', name: 'signup', component: MkSignup }, { path: '/signup', name: 'signup', component: MkSignup },
{ path: '/i/settings', component: MkSettings }, { path: '/i/settings', component: MkSettings },
{ path: '/i/settings/profile', component: MkProfileSetting },
{ path: '/i/notifications', name: 'notifications', component: MkNotifications }, { path: '/i/notifications', name: 'notifications', component: MkNotifications },
{ path: '/i/widgets', name: 'widgets', component: MkWidgets }, { path: '/i/widgets', name: 'widgets', component: MkWidgets },
{ path: '/i/messaging', name: 'messaging', component: MkMessaging }, { path: '/i/messaging', name: 'messaging', component: MkMessaging },

View File

@ -8,10 +8,13 @@
html html
height 100% height 100%
background #ececed background #ececed !important
// for md
transition none !important
&[data-darkmode] &[data-darkmode]
background #191B22 background #191B22 !important
body body
display flex display flex

View File

@ -32,7 +32,6 @@
</div> </div>
</header> </header>
<div class="body"> <div class="body">
<p class="channel" v-if="p.channel != null"><a target="_blank">{{ p.channel.title }}</a>:</p>
<p v-if="p.cw != null" class="cw"> <p v-if="p.cw != null" class="cw">
<span class="text" v-if="p.cw != ''">{{ p.cw }}</span> <span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
<span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span> <span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span>
@ -470,9 +469,6 @@ root(isDark)
.mk-url-preview .mk-url-preview
margin-top 8px margin-top 8px
> .channel
margin 0
> .tags > .tags
margin 4px 0 0 0 margin 4px 0 0 0

View File

@ -1,225 +0,0 @@
<template>
<mk-ui>
<span slot="header">%fa:user%%i18n:@title%</span>
<div :class="$style.content">
<p>%fa:info-circle%%i18n:@will-be-published%</p>
<div :class="$style.form">
<div :style="os.i.bannerUrl ? `background-image: url(${os.i.bannerUrl}?thumbnail&size=1024)` : ''" @click="setBanner">
<img :src="`${os.i.avatarUrl}?thumbnail&size=200`" alt="avatar" @click="setAvatar"/>
</div>
<label>
<p>%i18n:@name%</p>
<input v-model="name" type="text"/>
</label>
<label>
<p>%i18n:@location%</p>
<input v-model="location" type="text"/>
</label>
<label>
<p>%i18n:@description%</p>
<textarea v-model="description"></textarea>
</label>
<label>
<p>%i18n:@birthday%</p>
<input v-model="birthday" type="date"/>
</label>
<label>
<p>%i18n:@avatar%</p>
<button @click="setAvatar" :disabled="avatarSaving">%i18n:@set-avatar%</button>
</label>
<label>
<p>%i18n:@banner%</p>
<button @click="setBanner" :disabled="bannerSaving">%i18n:@set-banner%</button>
</label>
</div>
<button :class="$style.save" @click="save" :disabled="saving">%fa:check%%i18n:@save%</button>
</div>
</mk-ui>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
name: null,
location: null,
description: null,
birthday: null,
avatarSaving: false,
bannerSaving: false,
saving: false
};
},
created() {
this.name = (this as any).os.i.name || '';
this.location = (this as any).os.i.profile.location;
this.description = (this as any).os.i.description;
this.birthday = (this as any).os.i.profile.birthday;
},
mounted() {
document.title = 'Misskey | %i18n:@title%';
},
methods: {
setAvatar() {
(this as any).apis.chooseDriveFile({
multiple: false
}).then(file => {
this.avatarSaving = true;
(this as any).api('i/update', {
avatarId: file.id
}).then(() => {
this.avatarSaving = false;
alert('%i18n:!@avatar-saved%');
});
});
},
setBanner() {
(this as any).apis.chooseDriveFile({
multiple: false
}).then(file => {
this.bannerSaving = true;
(this as any).api('i/update', {
bannerId: file.id
}).then(() => {
this.bannerSaving = false;
alert('%i18n:!@banner-saved%');
});
});
},
save() {
this.saving = true;
(this as any).api('i/update', {
name: this.name || null,
location: this.location || null,
description: this.description || null,
birthday: this.birthday || null
}).then(() => {
this.saving = false;
alert('%i18n:!@saved%');
});
}
}
});
</script>
<style lang="stylus" module>
@import '~const.styl'
.content
margin 8px auto
max-width 500px
width calc(100% - 16px)
@media (min-width 500px)
margin 16px auto
width calc(100% - 32px)
> p
display block
margin 0 0 8px 0
padding 12px 16px
font-size 14px
color #79d4e6
border solid 1px #71afbb
//color #276f86
//background #f8ffff
//border solid 1px #a9d5de
border-radius 8px
> [data-fa]
margin-right 6px
.form
position relative
background #fff
box-shadow 0 0 0 1px rgba(#000, 0.2)
border-radius 8px
&:before
content ""
display block
position absolute
bottom -20px
left calc(50% - 10px)
border-top solid 10px rgba(#000, 0.2)
border-right solid 10px transparent
border-bottom solid 10px transparent
border-left solid 10px transparent
&:after
content ""
display block
position absolute
bottom -16px
left calc(50% - 8px)
border-top solid 8px #fff
border-right solid 8px transparent
border-bottom solid 8px transparent
border-left solid 8px transparent
> div
height 128px
background-color #e4e4e4
background-size cover
background-position center
border-radius 8px 8px 0 0
> img
position absolute
top 25px
left calc(50% - 40px)
width 80px
height 80px
border solid 2px #fff
border-radius 8px
> label
display block
margin 0
padding 16px
border-bottom solid 1px #eee
&:last-of-type
border none
> p:first-child
display block
margin 0
padding 0 0 4px 0
font-weight bold
color #2f3c42
> input[type="text"]
> textarea
display block
width 100%
padding 12px
font-size 16px
color #192427
border solid 2px #ddd
border-radius 4px
> textarea
min-height 80px
.save
display block
margin 8px 0 0 0
padding 16px
width 100%
font-size 16px
color $theme-color-foreground
background $theme-color
border-radius 8px
&:disabled
opacity 0.7
> [data-fa]
margin-right 4px
</style>

View File

@ -1,106 +1,254 @@
<template> <template>
<mk-ui> <mk-ui>
<span slot="header">%fa:cog%%i18n:@settings%</span> <span slot="header">%fa:cog%%i18n:@settings%</span>
<div :class="$style.content"> <main>
<p v-html="'%i18n:!@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p> <p v-html="'%i18n:!@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p>
<ul> <div>
<li><router-link to="./settings/profile">%fa:user%%i18n:@profile%%fa:angle-right%</router-link></li> <x-profile/>
<li><router-link to="./settings/twitter">%fa:B twitter%%i18n:@twitter%%fa:angle-right%</router-link></li>
<li><router-link to="./settings/signin-history">%fa:sign-in-alt%%i18n:@signin-history%%fa:angle-right%</router-link></li> <md-card>
</ul> <md-card-header>
<ul> <div class="md-title">%fa:palette% %i18n:@design%</div>
<li><a @click="signout">%fa:power-off%%i18n:@signout%</a></li> </md-card-header>
</ul>
<p><small>ver {{ version }} ({{ codename }})</small></p> <md-card-content>
<div>
<md-switch v-model="darkmode">%i18n:@dark-mode%</md-switch>
</div> </div>
<div>
<md-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</md-switch>
</div>
<div>
<div class="md-body-2">%i18n:@timeline%</div>
<div>
<md-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</md-switch>
</div>
<div>
<md-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</md-switch>
</div>
<div>
<md-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch>
</div>
</div>
</md-card-content>
</md-card>
<md-card>
<md-card-header>
<div class="md-title">%fa:cog% %i18n:@behavior%</div>
</md-card-header>
<md-card-content>
<div>
<md-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</md-switch>
</div>
<div>
<md-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch>
</div>
</md-card-content>
</md-card>
<md-card>
<md-card-header>
<div class="md-title">%fa:language% %i18n:@lang%</div>
</md-card-header>
<md-card-content>
<md-field>
<md-select v-model="lang" placeholder="%i18n:@auto%">
<md-optgroup label="%i18n:@recommended%">
<md-option value="">%i18n:@auto%</md-option>
</md-optgroup>
<md-optgroup label="%i18n:@specify-language%">
<md-option value="ja">日本語</md-option>
<md-option value="en">English</md-option>
<md-option value="fr">Français</md-option>
<md-option value="pl">Polski</md-option>
<md-option value="de">Deutsch</md-option>
</md-optgroup>
</md-select>
</md-field>
<span class="md-helper-text">%fa:info-circle% %i18n:@lang-tip%</span>
</md-card-content>
</md-card>
<md-card>
<md-card-header>
<div class="md-title">%fa:B twitter% %i18n:@twitter%</div>
</md-card-header>
<md-card-content>
<p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
<p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:!@twitter-reconnect%' : '%i18n:!@twitter-connect%' }}</a>
<span v-if="os.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a>
</p>
</md-card-content>
</md-card>
<md-card>
<md-card-header>
<div class="md-title">%fa:sync-alt% %i18n:@update%</div>
</md-card-header>
<md-card-content>
<div>%i18n:@version% <i>{{ version }}</i></div>
<template v-if="latestVersion !== undefined">
<div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div>
</template>
<md-button class="md-raised md-primary" @click="checkForUpdate" :disabled="checkingForUpdate">
<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
<template v-else>%i18n:@check-for-updates%</template>
</md-button>
</md-card-content>
</md-card>
</div>
<p><small>ver {{ version }} ({{ codename }})</small></p>
</main>
</mk-ui> </mk-ui>
</template> </template>
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { version, codename } from '../../../config'; import { apiUrl, version, codename } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update';
import XProfile from './settings/settings.profile.vue';
export default Vue.extend({ export default Vue.extend({
components: {
XProfile
},
data() { data() {
return { return {
apiUrl,
version, version,
codename codename,
darkmode: localStorage.getItem('darkmode') == 'true',
lang: localStorage.getItem('lang') || '',
latestVersion: undefined,
checkingForUpdate: false
}; };
}, },
computed: { computed: {
name(): string { name(): string {
return Vue.filter('userName')((this as any).os.i); return Vue.filter('userName')((this as any).os.i);
} }
}, },
watch: {
darkmode() {
(this as any)._updateDarkmode_(this.darkmode);
},
lang() {
localStorage.setItem('lang', this.lang);
}
},
mounted() { mounted() {
document.title = 'Misskey | %i18n:@settings%'; document.title = 'Misskey | %i18n:@settings%';
}, },
methods: { methods: {
signout() { signout() {
(this as any).os.signout(); (this as any).os.signout();
},
onChangeFetchOnScroll(v) {
this.$store.dispatch('settings/set', {
key: 'fetchOnScroll',
value: v
});
},
onChangeDisableViaMobile(v) {
this.$store.dispatch('settings/set', {
key: 'disableViaMobile',
value: v
});
},
onChangeCircleIcons(v) {
this.$store.dispatch('settings/set', {
key: 'circleIcons',
value: v
});
},
onChangeShowReplyTarget(v) {
this.$store.dispatch('settings/set', {
key: 'showReplyTarget',
value: v
});
},
onChangeShowMyRenotes(v) {
this.$store.dispatch('settings/set', {
key: 'showMyRenotes',
value: v
});
},
onChangeShowRenotedMyNotes(v) {
this.$store.dispatch('settings/set', {
key: 'showRenotedMyNotes',
value: v
});
},
checkForUpdate() {
this.checkingForUpdate = true;
checkForUpdate((this as any).os, true, true).then(newer => {
this.checkingForUpdate = false;
this.latestVersion = newer;
if (newer == null) {
(this as any).apis.dialog({
title: '%i18n:!@no-updates%',
text: '%i18n:!@no-updates-desc%'
});
} else {
(this as any).apis.dialog({
title: '%i18n:!@update-available%',
text: '%i18n:!@update-available-desc%'
});
}
});
} }
} }
}); });
</script> </script>
<style lang="stylus" module> <style lang="stylus" scoped>
.content root(isDark)
padding 0 16px
margin 0 auto
max-width 500px
width 100%
> div
> *
margin-bottom 16px
> p > p
display block display block
margin 24px margin 24px
text-align center text-align center
color #cad2da color isDark ? #cad2da : #a2a9b1
> ul main[data-darkmode]
$radius = 8px root(true)
display block main:not([data-darkmode])
margin 16px auto root(false)
padding 0
max-width 500px
width calc(100% - 32px)
list-style none
background #fff
border solid 1px rgba(#000, 0.2)
border-radius $radius
> li
display block
border-bottom solid 1px #ddd
&:hover
background rgba(#000, 0.1)
&:first-child
border-top-left-radius $radius
border-top-right-radius $radius
&:last-child
border-bottom-left-radius $radius
border-bottom-right-radius $radius
border-bottom none
> a
$height = 48px
display block
position relative
padding 0 16px
line-height $height
color #4d635e
> [data-fa]:nth-of-type(1)
margin-right 4px
> [data-fa]:nth-of-type(2)
display block
position absolute
top 0
right 8px
z-index 1
padding 0 20px
font-size 1.2em
line-height $height
</style> </style>

View File

@ -0,0 +1,155 @@
<template>
<md-card>
<md-card-header>
<div class="md-title">%fa:pencil-alt% %i18n:@title%</div>
</md-card-header>
<md-card-content>
<md-field>
<label>%i18n:@name%</label>
<md-input v-model="name" :disabled="saving"/>
</md-field>
<md-field>
<md-icon>%fa:map-marker-alt%</md-icon>
<label>%i18n:@location%</label>
<md-input v-model="location" :disabled="saving"/>
</md-field>
<md-field>
<md-icon>%fa:birthday-cake%</md-icon>
<label>%i18n:@birthday%</label>
<md-input type="date" v-model="birthday" :disabled="saving"/>
</md-field>
<md-field>
<label>%i18n:@description%</label>
<md-textarea v-model="description" :disabled="saving"/>
</md-field>
<md-field>
<label>%i18n:@avatar%</label>
<md-file @md-change="onAvatarChange"/>
</md-field>
<md-field>
<label>%i18n:@banner%</label>
<md-file @md-change="onBannerChange"/>
</md-field>
<md-dialog-alert
:md-active.sync="uploading"
md-content="%18n:!@uploading%"/>
<div>
<md-switch v-model="os.i.isBot" @change="onChangeIsBot">%i18n:@is-bot%</md-switch>
</div>
</md-card-content>
<md-card-actions>
<md-button class="md-primary" :disabled="saving" @click="save">%i18n:@save%</md-button>
</md-card-actions>
</md-card>
</template>
<script lang="ts">
import Vue from 'vue';
import { apiUrl } from '../../../../config';
export default Vue.extend({
data() {
return {
name: null,
location: null,
description: null,
birthday: null,
avatarId: null,
bannerId: null,
saving: false,
uploading: false
};
},
created() {
this.name = (this as any).os.i.name || '';
this.location = (this as any).os.i.profile.location;
this.description = (this as any).os.i.description;
this.birthday = (this as any).os.i.profile.birthday;
this.avatarId = (this as any).os.i.avatarId;
this.bannerId = (this as any).os.i.bannerId;
},
methods: {
onChangeIsBot() {
(this as any).api('i/update', {
isBot: (this as any).os.i.isBot
});
},
onAvatarChange([file]) {
this.uploading = true;
const data = new FormData();
data.append('file', file);
data.append('i', (this as any).os.i.token);
fetch(apiUrl + '/drive/files/create', {
method: 'POST',
body: data
})
.then(response => response.json())
.then(f => {
this.avatarId = f.id;
this.uploading = false;
})
.catch(e => {
this.uploading = false;
alert('%18n:!@upload-failed%');
});
},
onBannerChange([file]) {
this.uploading = true;
const data = new FormData();
data.append('file', file);
data.append('i', (this as any).os.i.token);
fetch(apiUrl + '/drive/files/create', {
method: 'POST',
body: data
})
.then(response => response.json())
.then(f => {
this.bannerId = f.id;
this.uploading = false;
})
.catch(e => {
this.uploading = false;
alert('%18n:!@upload-failed%');
});
},
save() {
this.saving = true;
(this as any).api('i/update', {
name: this.name || null,
location: this.location || null,
description: this.description || null,
birthday: this.birthday || null,
avatarId: this.avatarId,
bannerId: this.bannerId
}).then(i => {
this.saving = false;
(this as any).os.i.avatarId = i.avatarId;
(this as any).os.i.avatarUrl = i.avatarUrl;
(this as any).os.i.bannerId = i.bannerId;
(this as any).os.i.bannerUrl = i.bannerUrl;
alert('%i18n:!@saved%');
});
}
}
});
</script>

View File

@ -15,7 +15,6 @@
<option value="photo-stream">フォトストリーム</option> <option value="photo-stream">フォトストリーム</option>
<option value="slideshow">スライドショー</option> <option value="slideshow">スライドショー</option>
<option value="version">バージョン</option> <option value="version">バージョン</option>
<option value="access-log">アクセスログ</option>
<option value="server">サーバー情報</option> <option value="server">サーバー情報</option>
<option value="donation">寄付のお願い</option> <option value="donation">寄付のお願い</option>
<option value="nav">ナビゲーション</option> <option value="nav">ナビゲーション</option>

13
src/client/md.scss Normal file
View File

@ -0,0 +1,13 @@
/* SEE: https://vuematerial.io/themes/configuration */
@import '../const.json';
@import "~vue-material/dist/theme/engine";
@include md-register-theme("default", (
primary: $themeColor,
accent: $themeColor
));
@import "~vue-material/dist/components/MdButton/theme";
@import "~vue-material/dist/components/MdField/theme";

View File

@ -1,13 +0,0 @@
import * as mongo from 'mongodb';
import db from '../db/mongodb';
const ChannelWatching = db.get<IChannelWatching>('channelWatching');
export default ChannelWatching;
export interface IChannelWatching {
_id: mongo.ObjectID;
createdAt: Date;
deletedAt: Date;
channelId: mongo.ObjectID;
userId: mongo.ObjectID;
}

View File

@ -1,75 +0,0 @@
import * as mongo from 'mongodb';
import deepcopy = require('deepcopy');
import { IUser } from './user';
import Watching from './channel-watching';
import db from '../db/mongodb';
const Channel = db.get<IChannel>('channels');
export default Channel;
export type IChannel = {
_id: mongo.ObjectID;
createdAt: Date;
title: string;
userId: mongo.ObjectID;
index: number;
watchingCount: number;
};
/**
* Pack a channel for API response
*
* @param channel target
* @param me? serializee
* @return response
*/
export const pack = (
channel: string | mongo.ObjectID | IChannel,
me?: string | mongo.ObjectID | IUser
) => new Promise<any>(async (resolve, reject) => {
let _channel: any;
// Populate the channel if 'channel' is ID
if (mongo.ObjectID.prototype.isPrototypeOf(channel)) {
_channel = await Channel.findOne({
_id: channel
});
} else if (typeof channel === 'string') {
_channel = await Channel.findOne({
_id: new mongo.ObjectID(channel)
});
} else {
_channel = deepcopy(channel);
}
// Rename _id to id
_channel.id = _channel._id;
delete _channel._id;
// Remove needless properties
delete _channel.userId;
// Me
const meId: mongo.ObjectID = me
? mongo.ObjectID.prototype.isPrototypeOf(me)
? me as mongo.ObjectID
: typeof me === 'string'
? new mongo.ObjectID(me)
: (me as IUser)._id
: null;
if (me) {
//#region Watchしているかどうか
const watch = await Watching.findOne({
userId: meId,
channelId: _channel.id,
deletedAt: { $exists: false }
});
_channel.isWatching = watch !== null;
//#endregion
}
resolve(_channel);
});

View File

@ -4,7 +4,6 @@ import rap from '@prezzemolo/rap';
import db from '../db/mongodb'; import db from '../db/mongodb';
import { IUser, pack as packUser } from './user'; import { IUser, pack as packUser } from './user';
import { pack as packApp } from './app'; import { pack as packApp } from './app';
import { pack as packChannel } from './channel';
import PollVote, { deletePollVote } from './poll-vote'; import PollVote, { deletePollVote } from './poll-vote';
import Reaction, { deleteNoteReaction } from './note-reaction'; import Reaction, { deleteNoteReaction } from './note-reaction';
import { pack as packFile } from './drive-file'; import { pack as packFile } from './drive-file';
@ -29,7 +28,6 @@ export function isValidCw(text: string): boolean {
export type INote = { export type INote = {
_id: mongo.ObjectID; _id: mongo.ObjectID;
channelId: mongo.ObjectID;
createdAt: Date; createdAt: Date;
deletedAt: Date; deletedAt: Date;
mediaIds: mongo.ObjectID[]; mediaIds: mongo.ObjectID[];
@ -258,11 +256,6 @@ export const pack = async (
_note.app = packApp(_note.appId); _note.app = packApp(_note.appId);
} }
// Populate channel
if (_note.channelId) {
_note.channel = packChannel(_note.channelId);
}
// Populate media // Populate media
_note.media = hide ? [] : Promise.all(_note.mediaIds.map(fileId => _note.media = hide ? [] : Promise.all(_note.mediaIds.map(fileId =>
packFile(fileId) packFile(fileId)

View File

@ -45,10 +45,6 @@ class MisskeyEvent {
this.publish(`othello-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value); this.publish(`othello-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
} }
public publishChannelStream(channelId: ID, type: string, value?: any): void {
this.publish(`channel-stream:${channelId}`, type, typeof value === 'undefined' ? null : value);
}
public publishLocalTimelineStream(note: any): void { public publishLocalTimelineStream(note: any): void {
this.redisClient.publish('misskey:local-timeline', JSON.stringify(note)); this.redisClient.publish('misskey:local-timeline', JSON.stringify(note));
} }
@ -79,4 +75,3 @@ export const publishMessagingStream = ev.publishMessagingStream.bind(ev);
export const publishMessagingIndexStream = ev.publishMessagingIndexStream.bind(ev); export const publishMessagingIndexStream = ev.publishMessagingIndexStream.bind(ev);
export const publishOthelloStream = ev.publishOthelloStream.bind(ev); export const publishOthelloStream = ev.publishOthelloStream.bind(ev);
export const publishOthelloGameStream = ev.publishOthelloGameStream.bind(ev); export const publishOthelloGameStream = ev.publishOthelloGameStream.bind(ev);
export const publishChannelStream = ev.publishChannelStream.bind(ev);

View File

@ -9,9 +9,6 @@ const summarize = (note: any): string => {
let summary = ''; let summary = '';
// チャンネル
summary += note.channel ? `${note.channel.title}:` : '';
// 本文 // 本文
summary += note.text ? note.text : ''; summary += note.text ? note.text : '';

View File

@ -621,33 +621,7 @@ const endpoints: Endpoint[] = [
name: 'messaging/messages/create', name: 'messaging/messages/create',
withCredential: true, withCredential: true,
kind: 'messaging-write' kind: 'messaging-write'
},
{
name: 'channels/create',
withCredential: true,
limit: {
duration: ms('1hour'),
max: 3,
minInterval: ms('10seconds')
} }
},
{
name: 'channels/show'
},
{
name: 'channels/notes'
},
{
name: 'channels/watch',
withCredential: true
},
{
name: 'channels/unwatch',
withCredential: true
},
{
name: 'channels'
},
]; ];
export default endpoints; export default endpoints;

View File

@ -1,58 +0,0 @@
/**
* Module dependencies
*/
import $ from 'cafy'; import ID from '../../../cafy-id';
import Channel, { pack } from '../../../models/channel';
/**
* Get all channels
*
* @param {any} params
* @param {any} me
* @return {Promise<any>}
*/
module.exports = (params, me) => new Promise(async (res, rej) => {
// Get 'limit' parameter
const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'sinceId' parameter
const [sinceId, sinceIdErr] = $.type(ID).optional().get(params.sinceId);
if (sinceIdErr) return rej('invalid sinceId param');
// Get 'untilId' parameter
const [untilId, untilIdErr] = $.type(ID).optional().get(params.untilId);
if (untilIdErr) return rej('invalid untilId param');
// Check if both of sinceId and untilId is specified
if (sinceId && untilId) {
return rej('cannot set sinceId and untilId');
}
// Construct query
const sort = {
_id: -1
};
const query = {} as any;
if (sinceId) {
sort._id = 1;
query._id = {
$gt: sinceId
};
} else if (untilId) {
query._id = {
$lt: untilId
};
}
// Issue query
const channels = await Channel
.find(query, {
limit: limit,
sort: sort
});
// Serialize
res(await Promise.all(channels.map(async channel =>
await pack(channel, me))));
});

View File

@ -1,35 +0,0 @@
/**
* Module dependencies
*/
import $ from 'cafy';
import Channel from '../../../../models/channel';
import Watching from '../../../../models/channel-watching';
import { pack } from '../../../../models/channel';
/**
* Create a channel
*/
module.exports = async (params, user) => new Promise(async (res, rej) => {
// Get 'title' parameter
const [title, titleErr] = $.str.range(1, 100).get(params.title);
if (titleErr) return rej('invalid title param');
// Create a channel
const channel = await Channel.insert({
createdAt: new Date(),
userId: user._id,
title: title,
index: 0,
watchingCount: 1
});
// Response
res(await pack(channel));
// Create Watching
await Watching.insert({
createdAt: new Date(),
userId: user._id,
channelId: channel._id
});
});

View File

@ -1,74 +0,0 @@
/**
* Module dependencies
*/
import $ from 'cafy'; import ID from '../../../../cafy-id';
import { default as Channel, IChannel } from '../../../../models/channel';
import Note, { pack } from '../../../../models/note';
/**
* Show a notes of a channel
*/
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'limit' parameter
const [limit = 1000, limitErr] = $.num.optional().range(1, 1000).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'sinceId' parameter
const [sinceId, sinceIdErr] = $.type(ID).optional().get(params.sinceId);
if (sinceIdErr) return rej('invalid sinceId param');
// Get 'untilId' parameter
const [untilId, untilIdErr] = $.type(ID).optional().get(params.untilId);
if (untilIdErr) return rej('invalid untilId param');
// Check if both of sinceId and untilId is specified
if (sinceId && untilId) {
return rej('cannot set sinceId and untilId');
}
// Get 'channelId' parameter
const [channelId, channelIdErr] = $.type(ID).get(params.channelId);
if (channelIdErr) return rej('invalid channelId param');
// Fetch channel
const channel: IChannel = await Channel.findOne({
_id: channelId
});
if (channel === null) {
return rej('channel not found');
}
//#region Construct query
const sort = {
_id: -1
};
const query = {
channelId: channel._id
} as any;
if (sinceId) {
sort._id = 1;
query._id = {
$gt: sinceId
};
} else if (untilId) {
query._id = {
$lt: untilId
};
}
//#endregion Construct query
// Issue query
const notes = await Note
.find(query, {
limit: limit,
sort: sort
});
// Serialize
res(await Promise.all(notes.map(async (note) =>
await pack(note, user)
)));
});

View File

@ -1,26 +0,0 @@
/**
* Module dependencies
*/
import $ from 'cafy'; import ID from '../../../../cafy-id';
import Channel, { IChannel, pack } from '../../../../models/channel';
/**
* Show a channel
*/
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'channelId' parameter
const [channelId, channelIdErr] = $.type(ID).get(params.channelId);
if (channelIdErr) return rej('invalid channelId param');
// Fetch channel
const channel: IChannel = await Channel.findOne({
_id: channelId
});
if (channel === null) {
return rej('channel not found');
}
// Serialize
res(await pack(channel, user));
});

View File

@ -1,56 +0,0 @@
/**
* Module dependencies
*/
import $ from 'cafy'; import ID from '../../../../cafy-id';
import Channel from '../../../../models/channel';
import Watching from '../../../../models/channel-watching';
/**
* Unwatch a channel
*/
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'channelId' parameter
const [channelId, channelIdErr] = $.type(ID).get(params.channelId);
if (channelIdErr) return rej('invalid channelId param');
//#region Fetch channel
const channel = await Channel.findOne({
_id: channelId
});
if (channel === null) {
return rej('channel not found');
}
//#endregion
//#region Check whether not watching
const exist = await Watching.findOne({
userId: user._id,
channelId: channel._id,
deletedAt: { $exists: false }
});
if (exist === null) {
return rej('already not watching');
}
//#endregion
// Delete watching
await Watching.update({
_id: exist._id
}, {
$set: {
deletedAt: new Date()
}
});
// Send response
res();
// Decrement watching count
Channel.update(channel._id, {
$inc: {
watchingCount: -1
}
});
});

View File

@ -1,54 +0,0 @@
/**
* Module dependencies
*/
import $ from 'cafy'; import ID from '../../../../cafy-id';
import Channel from '../../../../models/channel';
import Watching from '../../../../models/channel-watching';
/**
* Watch a channel
*/
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'channelId' parameter
const [channelId, channelIdErr] = $.type(ID).get(params.channelId);
if (channelIdErr) return rej('invalid channelId param');
//#region Fetch channel
const channel = await Channel.findOne({
_id: channelId
});
if (channel === null) {
return rej('channel not found');
}
//#endregion
//#region Check whether already watching
const exist = await Watching.findOne({
userId: user._id,
channelId: channel._id,
deletedAt: { $exists: false }
});
if (exist !== null) {
return rej('already watching');
}
//#endregion
// Create Watching
await Watching.insert({
createdAt: new Date(),
userId: user._id,
channelId: channel._id
});
// Send response
res();
// Increment watching count
Channel.update(channel._id, {
$inc: {
watchingCount: 1
}
});
});

View File

@ -4,7 +4,6 @@
import $ from 'cafy'; import ID from '../../../../cafy-id'; import $ from 'cafy'; import ID from '../../../../cafy-id';
import Note, { INote, isValidText, isValidCw, pack } from '../../../../models/note'; import Note, { INote, isValidText, isValidCw, pack } from '../../../../models/note';
import User, { ILocalUser } from '../../../../models/user'; import User, { ILocalUser } from '../../../../models/user';
import Channel, { IChannel } from '../../../../models/channel';
import DriveFile from '../../../../models/drive-file'; import DriveFile from '../../../../models/drive-file';
import create from '../../../../services/note/create'; import create from '../../../../services/note/create';
import { IApp } from '../../../../models/app'; import { IApp } from '../../../../models/app';
@ -89,7 +88,6 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
if (renoteIdErr) return rej('invalid renoteId'); if (renoteIdErr) return rej('invalid renoteId');
let renote: INote = null; let renote: INote = null;
let isQuote = false;
if (renoteId !== undefined) { if (renoteId !== undefined) {
// Fetch renote to note // Fetch renote to note
renote = await Note.findOne({ renote = await Note.findOne({
@ -101,8 +99,6 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
} else if (renote.renoteId && !renote.text && !renote.mediaIds) { } else if (renote.renoteId && !renote.text && !renote.mediaIds) {
return rej('cannot renote to renote'); return rej('cannot renote to renote');
} }
isQuote = text != null || files != null;
} }
// Get 'replyId' parameter // Get 'replyId' parameter
@ -126,47 +122,6 @@ module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res
} }
} }
// Get 'channelId' parameter
const [channelId, channelIdErr] = $.type(ID).optional().get(params.channelId);
if (channelIdErr) return rej('invalid channelId');
let channel: IChannel = null;
if (channelId !== undefined) {
// Fetch channel
channel = await Channel.findOne({
_id: channelId
});
if (channel === null) {
return rej('channel not found');
}
// 返信対象の投稿がこのチャンネルじゃなかったらダメ
if (reply && !channelId.equals(reply.channelId)) {
return rej('チャンネル内部からチャンネル外部の投稿に返信することはできません');
}
// Renote対象の投稿がこのチャンネルじゃなかったらダメ
if (renote && !channelId.equals(renote.channelId)) {
return rej('チャンネル内部からチャンネル外部の投稿をRenoteすることはできません');
}
// 引用ではないRenoteはダメ
if (renote && !isQuote) {
return rej('チャンネル内部では引用ではないRenoteをすることはできません');
}
} else {
// 返信対象の投稿がチャンネルへの投稿だったらダメ
if (reply && reply.channelId != null) {
return rej('チャンネル外部からチャンネル内部の投稿に返信することはできません');
}
// Renote対象の投稿がチャンネルへの投稿だったらダメ
if (renote && renote.channelId != null) {
return rej('チャンネル外部からチャンネル内部の投稿をRenoteすることはできません');
}
}
// Get 'poll' parameter // Get 'poll' parameter
const [poll, pollErr] = $.obj.optional().strict() const [poll, pollErr] = $.obj.optional().strict()
.have('choices', $.arr($.str) .have('choices', $.arr($.str)

View File

@ -4,7 +4,6 @@
import $ from 'cafy'; import ID from '../../../../cafy-id'; import $ from 'cafy'; import ID from '../../../../cafy-id';
import Note from '../../../../models/note'; import Note from '../../../../models/note';
import Mute from '../../../../models/mute'; import Mute from '../../../../models/mute';
import ChannelWatching from '../../../../models/channel-watching';
import { getFriends } from '../../common/get-friends'; import { getFriends } from '../../common/get-friends';
import { pack } from '../../../../models/note'; import { pack } from '../../../../models/note';
@ -45,18 +44,11 @@ module.exports = async (params, user, app) => {
const [includeRenotedMyNotes = true, includeRenotedMyNotesErr] = $.bool.optional().get(params.includeRenotedMyNotes); const [includeRenotedMyNotes = true, includeRenotedMyNotesErr] = $.bool.optional().get(params.includeRenotedMyNotes);
if (includeRenotedMyNotesErr) throw 'invalid includeRenotedMyNotes param'; if (includeRenotedMyNotesErr) throw 'invalid includeRenotedMyNotes param';
const [followings, watchingChannelIds, mutedUserIds] = await Promise.all([ const [followings, mutedUserIds] = await Promise.all([
// フォローを取得 // フォローを取得
// Fetch following // Fetch following
getFriends(user._id), getFriends(user._id),
// Watchしているチャンネルを取得
ChannelWatching.find({
userId: user._id,
// 削除されたドキュメントは除く
deletedAt: { $exists: false }
}).then(watches => watches.map(w => w.channelId)),
// ミュートしているユーザーを取得 // ミュートしているユーザーを取得
Mute.find({ Mute.find({
muterId: user._id muterId: user._id
@ -93,26 +85,9 @@ module.exports = async (params, user, app) => {
const query = { const query = {
$and: [{ $and: [{
$or: [{ // フォローしている人の投稿
$and: [{ $or: followQuery,
// フォローしている人のタイムラインへの投稿
$or: followQuery
}, {
// 「タイムラインへの」投稿に限定するためにチャンネルが指定されていないもののみに限る
$or: [{
channelId: {
$exists: false
}
}, {
channelId: null
}]
}]
}, {
// Watchしているチャンネルへの投稿
channelId: {
$in: watchingChannelIds
}
}],
// mute // mute
userId: { userId: {
$nin: mutedUserIds $nin: mutedUserIds

View File

@ -1,14 +0,0 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import { ParsedUrlQuery } from 'querystring';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient): void {
const q = request.resourceURL.query as ParsedUrlQuery;
const channel = q.channel;
// Subscribe channel stream
subscriber.subscribe(`misskey:channel-stream:${channel}`);
subscriber.on('message', (_, data) => {
connection.send(data);
});
}

View File

@ -14,7 +14,6 @@ import othelloGameStream from './stream/othello-game';
import othelloStream from './stream/othello'; import othelloStream from './stream/othello';
import serverStream from './stream/server'; import serverStream from './stream/server';
import requestsStream from './stream/requests'; import requestsStream from './stream/requests';
import channelStream from './stream/channel';
import { ParsedUrlQuery } from 'querystring'; import { ParsedUrlQuery } from 'querystring';
import authenticate from './authenticate'; import authenticate from './authenticate';
@ -48,11 +47,6 @@ module.exports = (server: http.Server) => {
subscriber.quit(); subscriber.quit();
}); });
if (request.resourceURL.pathname === '/channel') {
channelStream(request, connection, subscriber);
return;
}
const q = request.resourceURL.query as ParsedUrlQuery; const q = request.resourceURL.query as ParsedUrlQuery;
const [user, app] = await authenticate(q.i as string); const [user, app] = await authenticate(q.i as string);