Compare commits

...

60 Commits

Author SHA1 Message Date
syuilo
f762cf2770 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-04 23:04:56 +09:00
syuilo
d84cae9358 5.14.0 2018-08-04 23:04:45 +09:00
syuilo
9c54721010 Merge pull request #2090 from syuilo/l10n_master
New Crowdin translations
2018-08-04 23:03:59 +09:00
syuilo
16f35c81a1 New translations ja.yml (Korean) 2018-08-04 23:00:59 +09:00
syuilo
d0dbb62a54 New translations ja.yml (English) 2018-08-04 23:00:57 +09:00
syuilo
9fa68f4478 New translations ja.yml (Catalan) 2018-08-04 22:51:25 +09:00
syuilo
0d76625868 New translations ja.yml (Portuguese) 2018-08-04 22:51:23 +09:00
syuilo
5a8a701188 New translations ja.yml (Korean) 2018-08-04 22:51:21 +09:00
syuilo
121344afbb New translations ja.yml (Polish) 2018-08-04 22:51:19 +09:00
syuilo
d647cf3446 New translations ja.yml (Chinese Simplified) 2018-08-04 22:51:16 +09:00
syuilo
04a23b3f2f New translations ja.yml (Italian) 2018-08-04 22:51:14 +09:00
syuilo
08826e1c41 New translations ja.yml (Russian) 2018-08-04 22:51:12 +09:00
syuilo
2e31e3c7cb New translations ja.yml (English) 2018-08-04 22:51:10 +09:00
syuilo
7aed50f9fa New translations ja.yml (Spanish) 2018-08-04 22:51:08 +09:00
syuilo
2de782dbe4 New translations ja.yml (German) 2018-08-04 22:51:06 +09:00
syuilo
50693fbe25 New translations ja.yml (French) 2018-08-04 22:51:03 +09:00
syuilo
9a2ff56a79 動きのあるMFMを無効にするオプションを実装 2018-08-04 22:48:35 +09:00
syuilo
daed63d66c Update doc 2018-08-04 22:33:37 +09:00
syuilo
f2241a47b7 New translations ja.yml (Catalan) 2018-08-04 22:31:23 +09:00
syuilo
de95aac59b New translations ja.yml (Portuguese) 2018-08-04 22:31:20 +09:00
syuilo
8612ac0c6a New translations ja.yml (Korean) 2018-08-04 22:31:18 +09:00
syuilo
2118e500a8 New translations ja.yml (Polish) 2018-08-04 22:31:16 +09:00
syuilo
a7063eab85 New translations ja.yml (Chinese Simplified) 2018-08-04 22:31:14 +09:00
syuilo
5b5ae0e47f New translations ja.yml (Italian) 2018-08-04 22:31:12 +09:00
syuilo
b19ecc1a0d New translations ja.yml (Russian) 2018-08-04 22:31:10 +09:00
syuilo
ac9223957f New translations ja.yml (English) 2018-08-04 22:31:07 +09:00
syuilo
e580adc41e New translations ja.yml (Spanish) 2018-08-04 22:31:05 +09:00
syuilo
607a105b78 New translations ja.yml (German) 2018-08-04 22:31:03 +09:00
syuilo
cc601cf600 New translations ja.yml (French) 2018-08-04 22:31:01 +09:00
syuilo
be9f6ad294 Implement surrender of reversi 2018-08-04 22:28:01 +09:00
syuilo
a2952c02cf New translations ja.yml (French) 2018-08-04 21:31:21 +09:00
syuilo
244d567b3a 5.13.2 2018-08-04 12:38:14 +09:00
syuilo
61a9ad23f1 Fix bug 2018-08-04 12:35:57 +09:00
syuilo
4f7c19461e 5.13.1 2018-08-04 11:40:06 +09:00
syuilo
4ba6e1c2b2 Fix bug 2018-08-04 11:39:59 +09:00
syuilo
b60af54db1 5.13.0 2018-08-04 11:34:36 +09:00
syuilo
047320e50a Merge pull request #2085 from syuilo/l10n_master
New Crowdin translations
2018-08-04 11:33:49 +09:00
syuilo
29418ecbb4 🎨 2018-08-04 11:32:53 +09:00
syuilo
67e97310cf Clean up 2018-08-04 11:25:39 +09:00
syuilo
33d3d5c570 スライダーコントロールを追加するなど 2018-08-04 11:24:15 +09:00
syuilo
ee050cc37e ✌️ 2018-08-04 10:40:09 +09:00
syuilo
1ba43d83b0 New translations ja.yml (French) 2018-08-04 03:23:32 +09:00
syuilo
72fc6d387f New translations ja.yml (French) 2018-08-04 03:11:27 +09:00
syuilo
4a935e0659 New translations ja.yml (French) 2018-08-04 03:01:17 +09:00
syuilo
8a0dab49e0 New translations ja.yml (French) 2018-08-04 02:51:19 +09:00
syuilo
65574abab7 Merge pull request #2084 from syuilo/l10n_master
New Crowdin translations
2018-08-04 02:14:24 +09:00
syuilo
37d21462b8 New translations ja.yml (Polish) 2018-08-04 02:11:50 +09:00
syuilo
1acd25810c Merge pull request #2083 from syuilo/l10n_master
New Crowdin translations
2018-08-04 02:02:04 +09:00
syuilo
a81b771f15 New translations ja.yml (Polish) 2018-08-04 02:01:40 +09:00
syuilo
d30b2e7270 Merge branch 'master' of https://github.com/syuilo/misskey 2018-08-04 01:51:13 +09:00
syuilo
69f82508cb 5.12.0 2018-08-04 01:50:45 +09:00
syuilo
fddaa11645 Merge pull request #2081 from syuilo/l10n_master
New Crowdin translations
2018-08-04 01:50:13 +09:00
syuilo
bbe740785d Fix doc 2018-08-04 01:49:32 +09:00
syuilo
0389afa0fe 🎨 2018-08-04 01:48:02 +09:00
syuilo
caec6933d1 Fix bug 2018-08-04 01:47:57 +09:00
syuilo
420164c59a Trim text 2018-08-04 01:09:00 +09:00
syuilo
b13f42645b Fix bug 2018-08-04 01:03:48 +09:00
syuilo
22c945d21b New translations ja.yml (Polish) 2018-08-04 00:31:18 +09:00
syuilo
12fab6fa53 New translations ja.yml (French) 2018-08-03 23:41:28 +09:00
syuilo
51651e0c87 New translations ja.yml (French) 2018-08-03 23:31:32 +09:00
27 changed files with 381 additions and 136 deletions

1
.gitignore vendored
View File

@@ -4,6 +4,7 @@
/node_modules
/build
/built
built
/data
/.cache-loader
npm-debug.log

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi"
verified-user: "Verified user"
disable-animated-mfm: "Disable animated texts in a post"
reversi:
drawn: "Draw"
my-turn: "Your turn"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "Waiting for {}"
cancel: "Cancel"
common/views/components/games/reversi/reversi.game.vue:
surrender: "Surrender"
surrendered: "By surrender"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "Play reversi with your friends!"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "Prefiero sushi a pudín"
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
verified-user: "Usuario verificado"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "Empatado"
my-turn: "Mi turno"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "Esperando por {}"
cancel: "Cancelar"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -7,9 +7,9 @@ common:
about-title: "Une ⭐ du fédiverse."
about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
adblock:
detected: "広告ブロッカーを無効にしてください"
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
application-authorization: "アプリの連携"
detected: "Veuillez désactiver le bloqueur de publicités"
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
application-authorization: "Permissions de l'application"
close: "Fermer"
customization-tips:
title: "Conseils de personnalisation"
@@ -21,7 +21,7 @@ common:
notification:
file-uploaded: "Le fichier a été téléversé !"
message-from: "Message de {} :"
reversi-invited: "対局への招待があります"
reversi-invited: "Invité à jouer"
reversi-invited-by: "Invité par {} :"
notified-by: "Notifié par {} :"
reply-from: "Réponse de {} :"
@@ -88,6 +88,7 @@ common:
i-like-sushi: "Je préfère les sushis (au pudding)"
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
verified-user: "Utilisateur·trice vérifié·e"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "Partie nulle"
my-turn: "Cest votre tour"
@@ -95,8 +96,8 @@ common:
turn-of: "Cest le tour de {}"
past-turn-of: "C'est au tour de {}"
won: "{} a gagné"
black: "Noir"
white: "Blanc"
black: "Noirs"
white: "Blancs"
total: "Total"
this-turn: "Tour de {}"
widgets:
@@ -141,22 +142,22 @@ common:
stack-left: "Vers la gauche"
pop-right: "Vers la droite"
auth/views/form.vue:
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
share-access: "Désirez-vous <b>autoriser</b> <i>{{ app.name }}</i> à avoir accès à votre compte ?"
permission-ask: "Cette application nécessite les autorisations suivantes :"
account-read: "アカウントの情報を見る。"
account-read: "Afficher les informations du compte :"
account-write: "Modifications des informations du compte :"
note-write: "投稿する。"
like-write: "いいねしたりいいね解除する。"
following-write: "フォローしたりフォロー解除する。"
note-write: "Publier."
like-write: "Réagir aux publications."
following-write: "S'abonner et se désabonner."
drive-read: "Lire votre Drive"
drive-write: "ドライブを操作する。"
drive-write: "Téléverser/supprimer des fichiers dans votre Drive."
notification-read: "Lire vos notifications."
notification-write: "Gérer vos notifications."
cancel: "Annuler"
accept: "Autoriser laccès"
auth/views/index.vue:
loading: "Chargement en cours"
denied: "アプリケーションの連携をキャンセルしました。"
denied: "L'autorisation de l'application a été refusée."
denied-paragraph: "Cette application ne va pas accéder à votre compte."
already-authorized: "Cette application est déjà autorisée"
allowed: "アプリケーションの連携を許可しました"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "En attente de {}"
cancel: "Annuler"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "Jouer à Reversi avec vos amis·es !"
@@ -181,22 +185,22 @@ common/views/components/games/reversi/reversi.index.vue:
all-games: "Tous les jeux"
enter-username: "Saisir un nom d'utilisateur"
game-state:
ended: "終了"
ended: "Terminée"
playing: "En cours"
common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "Paramètres du jeu"
choose-map: "Sélectionnez une carte"
random: "Aléatoire"
black-or-white: "Noir/Blanc"
black-is: "{}が黒"
black-or-white: "Noirs/Blancs"
black-is: "{} Noirs"
rules: "Règles"
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
looped-map: "Carte en boucle"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Configuration du bot"
this-game-is-started-soon: "ゲームは数秒後に開始されます"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
this-game-is-started-soon: "La partie commencera dans quelques instants"
waiting-for-other: "En attente que l'adversaire soit prêt"
waiting-for-me: "En attente que vous soyez prêt"
waiting-for-both: "準備中"
cancel: "Annuler"
ready: "Prêt"
@@ -358,38 +362,38 @@ common/views/widgets/memo.vue:
memo: "Écrivez ici !"
save: "Enregistrer"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder-customize-mode: "Veuillez quitter le mode personnalisé pour pouvour spécifier un dossier"
folder: "Veuillez cliquer pour spécifier le dossier"
no-image: "Il n'y a aucune image dans ce dossier"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
tips-line9: "Misskey est sous licence AGPLv3"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line24: "Misskey a vu le jour en 2014"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue:
signed-in-as: "Connecté en tant que {}"
signed-in-as: "Connecté·é en tant que {}"
following: "Suit"
follow: "Suivre"
request-pending: "Demande d'abonnement en attente"
follow-request: "Demande d'abonnement"
desktop/views/components/activity.chart.vue:
total: "Noir ... Total"
total: "Noirs ... Total"
notes: "Bleu ... Notes"
replies: "Rouge ... Réponses"
renotes: "Vert ... Partages"
@@ -530,9 +534,9 @@ desktop/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
add-visible-user: "+Ajouter un utilisateur"
attach-location-information: "Attacher des informations de localisation"
hide-contents: "Masquer les contenus"
reply-placeholder: "Répondre à cette note"
quote-placeholder: "Citer cette note"
submit: "Poster"
@@ -552,11 +556,11 @@ desktop/views/components/post-form.vue:
create-poll: "Créer un sondage"
text-remain: "{} charactères restants"
recent-tags: "Récent"
click-to-tagging: "クリックでタグ付け"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
click-to-tagging: "Cliquer pour tagguer"
visibility: "Visibilité"
geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
error: "Erreur"
enter-username: "Saisir un nom d'utilisateur …"
desktop/views/components/post-form-window.vue:
note: "Nouvelle note"
reply: "Répondre"
@@ -678,8 +682,8 @@ desktop/views/components/settings.api.vue:
desktop/views/components/settings.apps.vue:
no-apps: "Aucune application autorisée"
desktop/views/components/settings.drive.vue:
max: ""
in-use: "使用中"
max: "Maximum"
in-use: "en cours dutilisation"
desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue:
@@ -702,7 +706,7 @@ desktop/views/components/settings.profile.vue:
other: "Autre"
is-bot: "Ce compte est un Bot"
is-cat: "Ce compte est un Chat"
profile-updated: "プロフィールを更新しました"
profile-updated: "Profil mis à jour"
desktop/views/components/sub-note-content.vue:
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
@@ -776,7 +780,7 @@ desktop/views/pages/welcome.vue:
signin-button: "Se connecter"
signup-button: "S'inscrire"
timeline: "Fil d'actualité"
powered-by-misskey: "Powered by <b>Misskey</b>."
powered-by-misskey: "Propulsé par <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Lecteur de Misskey"
desktop/views/pages/favorites.vue:
@@ -792,10 +796,10 @@ desktop/views/pages/selectdrive.vue:
cancel: "Annuler"
upload: "Uploader un ou plusieurs fichier(s) depuis votre PC"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
not-available: "Vous ne pouvez pas utiliser la fonctionnalité de recherche."
not-found: "Aucun message trouvé pour '{}'"
desktop/views/pages/share.vue:
share-with: "{}で共有"
share-with: "Partager avec {}"
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue:
@@ -941,7 +945,7 @@ mobile/views/components/post-form.vue:
renote: "Republier"
quote-placeholder: "Citer ce billet ... (Facultatif)"
reply-placeholder: "Répondre à cette note"
cw-placeholder: "内容への注釈 (オプション)"
cw-placeholder: "Commenter le contenu (optionnel)"
location-alert: "Votre appareil ne prend pas en charge les services de localisation"
error: "Erreur"
username-prompt: "Saisir un nom d'utilisateur"
@@ -999,14 +1003,14 @@ mobile/views/pages/home.vue:
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue:
signup: "新規登録"
signup: "S'enregistrer"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
dashboard: "Tableau de bord"
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
activity: "Activité"
mobile/views/pages/share.vue:
share-with: "{}で共有"
share-with: "Partager avec {}"
mobile/views/pages/messaging.vue:
messaging: "Messagerie"
mobile/views/pages/messaging-room.vue:
@@ -1023,7 +1027,7 @@ mobile/views/pages/notifications.vue:
notifications: "Notifications"
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/games/reversi.vue:
reversi: "リバーシ"
reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "Nom"
@@ -1044,7 +1048,7 @@ mobile/views/pages/search.vue:
mobile/views/pages/selectdrive.vue:
select-file: "Choisissez un fichier"
mobile/views/pages/settings.vue:
signed-in-as: "Connecté en tant que {}"
signed-in-as: "Connecté·e en tant que {}"
lang: "Langue"
lang-tip: "Le rechargement de la page est requis afin d'appliquer les modifications."
recommended: "Recommandé"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -95,6 +95,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
@@ -182,6 +183,10 @@ common/views/components/games/reversi/reversi.vue:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -1,6 +1,6 @@
---
meta:
lang: "日本語"
lang: "한국어"
divider: ""
common:
misskey: "A ⭐ of fediverse"
@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -10,10 +10,10 @@ common:
detected: "Spróbuj wyłączyć blokadę reklam."
warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam."
application-authorization: "アプリの連携"
close: "閉じる"
close: "Zamknij"
customization-tips:
title: "カスタマイズのヒント"
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
title: "Wskazówki o dostosowywaniu"
paragraph1: "Dostosowywanie strony głównej pozwala na dodawanie, usuwanie, przeciąganie i zmienianie kolejności widżetów."
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
@@ -88,6 +88,7 @@ common:
i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
verified-user: "Zweryfikowany użytkownik"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "Remis"
my-turn: "Twoja kolej"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
@@ -193,14 +197,14 @@ common/views/components/games/reversi/reversi.room.vue:
is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ"
can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Botの設定"
this-game-is-started-soon: "ゲームは数秒後に開始されます"
settings-of-the-bot: "Ustawienia bota"
this-game-is-started-soon: "Gra rozpocznie się wkrótce"
waiting-for-other: "相手の準備が完了するのを待っています"
waiting-for-me: "あなたの準備が完了するのを待っています"
waiting-for-both: "準備中"
cancel: "キャンセル"
ready: "準備完了"
cancel-ready: "準備続行"
waiting-for-both: "Oczekiwanie na Ciebie"
cancel: "Anuluj"
ready: "Gotowy"
cancel-ready: "Cofnij „gotowy”"
common/views/components/connect-failed.vue:
title: "Nie udało się połączyć z serwerem"
description: "Wystąpił problem z Twoim połączeniem z Internetem, lub z serwerem. {Spróbuj ponownie} wkrótce."
@@ -331,12 +335,12 @@ common/views/widgets/broadcast.vue:
have-a-nice-day: "Miłego dnia!"
next: "Dalej"
common/views/widgets/calendar.vue:
year: "{}"
month: "{}"
day: "{}"
today: "今日:"
this-month: "今月:"
this-year: "今年:"
year: "Rok {}"
month: "Miesiąc {}"
day: "Dzień {}"
today: "Dzisiaj:"
this-month: "Ten miesiąc:"
this-year: "Ten rok:"
common/views/widgets/donation.vue:
title: "Dotacje"
text: "Aby utrzymywać Misskey, płacimy za domenę, serwery i nie tylko… Nie zarabiamy na tym, więc byłoby nam miło, gdybyśmy uzyskali od Ciebie dotację. Jeżeli jesteś zainteresowany, skontaktuj się z {}. Dziękujemy za wsparcie!"
@@ -358,9 +362,9 @@ common/views/widgets/memo.vue:
memo: "Napisz tutaj!"
save: "Zapisz"
common/views/widgets/slideshow.vue:
folder-customize-mode: "フォルダを指定するには、カスタマイズモードを終了してください"
folder: "クリックしてフォルダを指定してください"
no-image: "このフォルダには画像がありません"
folder-customize-mode: "Aby określić katalog, opuść tryb dostosowywania"
folder: "Naciśnij i wybierz folder"
no-image: "Brak obrazu w tym folderze"
common/views/widgets/tips.vue:
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
@@ -369,8 +373,8 @@ common/views/widgets/tips.vue:
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます"
tips-line9: "MisskeyAGPLv3です"
tips-line8: "Strona główna może zostać dostosowana w ustawieniach."
tips-line9: "Misskey jest dostępny na licencji AGPLv3."
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
@@ -380,8 +384,8 @@ common/views/widgets/tips.vue:
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます"
tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
tips-line24: "Misskey zaczął działać w 2014."
tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
common/views/pages/follow.vue:
signed-in-as: "Zalogowany jako {}"
following: "Śledzisz"
@@ -530,9 +534,9 @@ desktop/views/components/notifications.vue:
more: "Więcej"
empty: "Brak powiadomień"
desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加"
attach-location-information: "位置情報を添付する"
hide-contents: "内容を隠す"
add-visible-user: "+Dodaj użytkownika"
attach-location-information: "Załącz informacje o lokalizacji"
hide-contents: "Ukryj zawartość"
reply-placeholder: "Odpowiedz na ten wpis…"
quote-placeholder: "Zacytuj ten wpis…"
submit: "Wyślij"
@@ -553,10 +557,10 @@ desktop/views/components/post-form.vue:
text-remain: "pozostałe znaki: {}"
recent-tags: "Ostatnie"
click-to-tagging: "Naciśnij aby oznaczyć"
visibility: "公開範囲"
geolocation-alert: "お使いの端末は位置情報に対応していません"
error: "エラー"
enter-username: "ユーザー名を入力してください"
visibility: "Widoczność"
geolocation-alert: "Twoje urządzenie nie obsługuje geolokalizacji."
error: "Bład"
enter-username: "Wprowadź nazwę użytkownika…"
desktop/views/components/post-form-window.vue:
note: "Nowy wpis"
reply: "Odpowiedz"
@@ -678,8 +682,8 @@ desktop/views/components/settings.api.vue:
desktop/views/components/settings.apps.vue:
no-apps: "Brak zautoryzowanych aplikacji"
desktop/views/components/settings.drive.vue:
max: ""
in-use: "使用中"
max: "Maksymalnie"
in-use: " w użyciu."
desktop/views/components/settings.mute.vue:
no-users: "Brak wyciszonych użytkowników"
desktop/views/components/settings.password.vue:
@@ -702,7 +706,7 @@ desktop/views/components/settings.profile.vue:
other: "Inne"
is-bot: "To konto jest prowadzone przez bota"
is-cat: "To konto jest prowadzone przez kota"
profile-updated: "プロフィールを更新しました"
profile-updated: "Zaktualizowano profil"
desktop/views/components/sub-note-content.vue:
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
@@ -776,7 +780,7 @@ desktop/views/pages/welcome.vue:
signin-button: "Zaloguj się"
signup-button: "Zarejestruj się"
timeline: "Oś czasu"
powered-by-misskey: "Powered by <b>Misskey</b>."
powered-by-misskey: "Oparto o <b>Misskey</b>."
desktop/views/pages/drive.vue:
title: "Dysk Misskey"
desktop/views/pages/favorites.vue:
@@ -792,12 +796,12 @@ desktop/views/pages/selectdrive.vue:
cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。"
not-found: "「{}」に関する投稿は見つかりませんでした。"
not-available: "Funkcja wyszukiwania nie może zostać wykorzystywana."
not-found: "Nie znaleziono wpisów zawierających „{}”"
desktop/views/pages/share.vue:
share-with: "{}で共有"
share-with: "Udostępnij z {}."
desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
no-posts-found: "Nie znaleziono wpisów zawierających „{}”."
desktop/views/pages/user-list.users.vue:
users: "Użytkownicy"
add-user: "Dodaj użytkownika"
@@ -954,7 +958,7 @@ mobile/views/components/timeline.vue:
empty: "Brak wpisów"
load-more: "Więcej"
mobile/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
welcome-back: "Witaj ponownie, "
mobile/views/components/ui.nav.vue:
timeline: "Oś czasu"
notifications: "Powiadomienia"
@@ -986,7 +990,7 @@ mobile/views/pages/drive.vue:
drive: "Dysk"
more: "Załaduj więcej"
mobile/views/pages/signup.vue:
lets-start: "📦 始めましょう"
lets-start: "Rozpocznijmy! 📦"
mobile/views/pages/followers.vue:
followers-of: "Śledzący {}"
mobile/views/pages/following.vue:
@@ -997,16 +1001,16 @@ mobile/views/pages/home.vue:
hybrid: "Społeczność"
global: "Globalne"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
no-posts-found: "Nie znaleziono wpisów zawierających „{}”."
mobile/views/pages/welcome.vue:
signup: "新規登録"
signup: "Zarejestruj się"
mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード"
dashboard: "Kokpit"
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ"
activity: "Aktywność"
mobile/views/pages/share.vue:
share-with: "{}で共有"
share-with: "Udostępnij z {}."
mobile/views/pages/messaging.vue:
messaging: "Wiadomości"
mobile/views/pages/messaging-room.vue:
@@ -1023,7 +1027,7 @@ mobile/views/pages/notifications.vue:
notifications: "Powiadomienia"
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/games/reversi.vue:
reversi: "リバーシ"
reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue:
title: "Profil"
name: "Nazwa"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -88,6 +88,7 @@ common:
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
matching:
waiting-for: "{}を待っています"
cancel: "キャンセル"
common/views/components/games/reversi/reversi.game.vue:
surrender: "投了"
surrendered: "投了により"
common/views/components/games/reversi/reversi.index.vue:
title: "Misskey Reversi"
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "5.11.0",
"clientVersion": "1.0.7938",
"version": "5.14.0",
"clientVersion": "1.0.7997",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -43,7 +43,6 @@
"@types/is-root": "1.0.0",
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.11.2",
"@types/jsdom": "11.0.6",
"@types/koa": "2.0.46",
"@types/koa-bodyparser": "5.0.1",
"@types/koa-compress": "2.0.8",
@@ -61,7 +60,6 @@
"@types/mongodb": "3.1.3",
"@types/ms": "0.7.30",
"@types/node": "10.5.5",
"@types/parse5": "5.0.0",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
"@types/qrcode": "1.2.0",

View File

@@ -1,6 +1,6 @@
<template>
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
<header><b>{{ blackUser | userName }}</b>(%i18n:common.reversi.black%) vs <b>{{ whiteUser | userName }}</b>(%i18n:common.reversi.white%)</header>
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
<div style="overflow: hidden">
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}<mk-ellipsis/></p>
@@ -8,7 +8,10 @@
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
<p class="result" v-if="game.isEnded && logPos == logs.length">
<template v-if="game.winner">{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template>
<template v-if="game.winner">
<span>{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}</span>
<span v-if="game.surrendered != null"> (%i18n:@surrendered%)</span>
</template>
<template v-else>%i18n:common.reversi.drawn%</template>
</p>
</div>
@@ -41,6 +44,10 @@
<p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p>
<div class="actions" v-if="!game.isEnded && iAmPlayer">
<form-button @click="surrender">%i18n:@surrender%</form-button>
</div>
<div class="player" v-if="game.isEnded">
<el-button-group>
<el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button>
@@ -79,22 +86,27 @@ export default Vue.extend({
if (!this.$store.getters.isSignedIn) return false;
return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id;
},
myColor(): Color {
if (!this.iAmPlayer) return null;
if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true;
if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true;
return false;
},
opColor(): Color {
if (!this.iAmPlayer) return null;
return this.myColor === true ? false : true;
},
blackUser(): any {
return this.game.black == 1 ? this.game.user1 : this.game.user2;
},
whiteUser(): any {
return this.game.black == 1 ? this.game.user2 : this.game.user1;
},
turnUser(): any {
if (this.o.turn === true) {
return this.game.black == 1 ? this.game.user1 : this.game.user2;
@@ -104,11 +116,13 @@ export default Vue.extend({
return null;
}
},
isMyTurn(): boolean {
if (!this.iAmPlayer) return false;
if (this.turnUser == null) return false;
return this.turnUser.id == this.$store.state.i.id;
},
cellsStyle(): any {
return {
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
@@ -165,11 +179,13 @@ export default Vue.extend({
mounted() {
this.connection.on('set', this.onSet);
this.connection.on('rescue', this.onRescue);
this.connection.on('ended', this.onEnded);
},
beforeDestroy() {
this.connection.off('set', this.onSet);
this.connection.off('rescue', this.onRescue);
this.connection.off('ended', this.onEnded);
clearInterval(this.pollingClock);
},
@@ -215,6 +231,10 @@ export default Vue.extend({
}
},
onEnded(x) {
this.game = x.game;
},
checkEnd() {
this.game.isEnded = this.o.isEnded;
if (this.game.isEnded) {
@@ -250,6 +270,12 @@ export default Vue.extend({
this.checkEnd();
this.$forceUpdate();
},
surrender() {
(this as any).api('games/reversi/games/surrender', {
gameId: this.game.id
});
}
}
});
@@ -265,6 +291,9 @@ root(isDark)
padding 8px
border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4
a
color inherit
> .board
width calc(100% - 16px)
max-width 500px
@@ -381,6 +410,9 @@ root(isDark)
margin 0
padding 16px 0
> .actions
padding-bottom 16px
> .player
padding-bottom 32px

View File

@@ -53,7 +53,7 @@
</div>
</div>
<div class="card" v-if="form">
<div class="card form" v-if="form">
<header>
<span>%i18n:@settings-of-the-bot%</span>
</header>
@@ -65,7 +65,7 @@
:key="message.id"/>
<template v-for="item in form">
<mk-switch v-if="item.type == 'button'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm($event, item)">{{ item.desc || '' }}</mk-switch>
<mk-switch v-if="item.type == 'switch'" v-model="item.value" :key="item.id" :text="item.label" @change="onChangeForm(item)">{{ item.desc || '' }}</mk-switch>
<div class="card" v-if="item.type == 'radio'" :key="item.id">
<header>
@@ -73,7 +73,17 @@
</header>
<div>
<el-radio v-for="(r, i) in item.items" :key="item.id + ':' + i" v-model="item.value" :label="r.value" @change="onChangeForm($event, item)">{{ r.label }}</el-radio>
<form-radio v-for="(r, i) in item.items" :key="item.id + ':' + i" v-model="item.value" :value="r.value" @change="onChangeForm(item)">{{ r.label }}</form-radio>
</div>
</div>
<div class="card" v-if="item.type == 'slider'" :key="item.id">
<header>
<span>{{ item.label }}</span>
</header>
<div>
<input type="range" :min="item.min" :max="item.max" :step="item.step || 1" v-model="item.value" @change="onChangeForm(item)"/>
</div>
</div>
@@ -83,7 +93,7 @@
</header>
<div>
<el-input v-model="item.value" @change="onChangeForm($event, item)"/>
<el-input v-model="item.value" @change="onChangeForm(item)"/>
</div>
</div>
</template>
@@ -210,11 +220,11 @@ export default Vue.extend({
this.messages.unshift(x.message);
},
onChangeForm(v, item) {
onChangeForm(item) {
this.connection.send({
type: 'update-form',
id: item.id,
value: v
value: item.value
});
},
@@ -274,6 +284,9 @@ root(isDark)
color isDark ? #fff : #606266
cursor pointer
transition border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1)
-webkit-appearance none
-moz-appearance none
appearance none
&:hover
border-color isDark ? #a7aebd : #c0c4cc
@@ -312,12 +325,20 @@ root(isDark)
&[data-none]
border-color transparent
&.form
> div
> .card + .card
margin-top 16px
input[type='range']
width 100%
.card
max-width 400px
border-radius 4px
background isDark ? #282C37 : #fff
color isDark ? #fff : #303133
box-shadow 0 2px 12px 0 rgba(#000, 0.1)
box-shadow 0 2px 12px 0 rgba(#000, isDark ? 0.7 : 0.1)
> header
padding 18px 20px

View File

@@ -9,6 +9,9 @@
<form-button round @click="cancel">%i18n:@matching.cancel%</form-button>
</div>
</div>
<div v-else-if="gameId">
...
</div>
<div class="index" v-else>
<x-index @go="nav" @matching="onMatching"/>
</div>
@@ -45,22 +48,18 @@ export default Vue.extend({
},
watch: {
gameId(id) {
if (id == null) {
this.game = null;
} else {
Progress.start();
(this as any).api('games/reversi/games/show', {
gameId: id
}).then(game => {
this.nav(game, true);
Progress.done();
});
}
game() {
this.$emit('gamed', this.game);
},
gameId() {
this.fetch();
}
},
mounted() {
this.fetch();
if (this.$store.getters.isSignedIn) {
this.connection = (this as any).os.streams.reversiStream.getConnection();
this.connectionId = (this as any).os.streams.reversiStream.use();
@@ -88,6 +87,20 @@ export default Vue.extend({
},
methods: {
fetch() {
if (this.gameId == null) {
this.game = null;
} else {
Progress.start();
(this as any).api('games/reversi/games/show', {
gameId: this.gameId
}).then(game => {
this.nav(game, true);
Progress.done();
});
}
},
nav(game, silent) {
this.matching = null;
this.game = game;

View File

@@ -63,7 +63,7 @@ export default Vue.component('misskey-flavored-markdown', {
attrs: {
style: 'display: inline-block; font-size: 200%;'
},
directives: [{
directives: [this.$store.state.settings.disableAnimatedMfm ? {} : {
name: 'animate-css',
value: { classes: 'tada', iteration: 'infinite' }
}]

View File

@@ -55,6 +55,7 @@
<span>%i18n:@show-maps-desc%</span>
</mk-switch>
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
</section>
<section class="web" v-show="page == 'web'">
@@ -376,6 +377,12 @@ export default Vue.extend({
value: v
});
},
onChangeDisableAnimatedMfm(v) {
this.$store.dispatch('settings/set', {
key: 'disableAnimatedMfm',
value: v
});
},
onChangeGradientWindowHeader(v) {
this.$store.dispatch('settings/set', {
key: 'gradientWindowHeader',

View File

@@ -14,6 +14,7 @@
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
<div>
<div>%i18n:@timeline%</div>
@@ -192,6 +193,13 @@ export default Vue.extend({
});
},
onChangeDisableAnimatedMfm(v) {
this.$store.dispatch('settings/set', {
key: 'disableAnimatedMfm',
value: v
});
},
onChangeShowReplyTarget(v) {
this.$store.dispatch('settings/set', {
key: 'showReplyTarget',

View File

@@ -1,15 +1,15 @@
# MisskeyリバーシBotの開発
Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
1. `reversi`ストリームに以下のパラメータを付けて接続する:
1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
* `i`: botアカウントのAPIキー
2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
* イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
3. `reversi/match`へ、`user_id`として`parent``id`が含まれたリクエストを送信する
3. `games/reversi/match`へ、`user_id`として`parent``id`が含まれたリクエストを送信する
4. 上手くいくとゲーム情報が返ってくるので、`reversi-game`ストリームへ、以下のパラメータを付けて接続する:
4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
* `i`: botアカウントのAPIキー
* `game`: `game``id`
@@ -96,8 +96,8 @@ y = Math.floor(pos / mapWidth)
フォームコントロールは、次のようなオブジェクトです:
```javascript
{
id: 'button1',
type: 'button',
id: 'switch1',
type: 'switch',
label: 'Enable hoge',
value: false
}
@@ -110,21 +110,21 @@ y = Math.floor(pos / mapWidth)
### フォームの操作を受け取る
ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。
イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。
例えば、上で示したボタンをユーザーがオンにしたとすると、次のイベントが流れてきます:
例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
```javascript
{
id: 'button1',
id: 'switch1',
value: true
}
```
### フォームコントロールの種類
#### ボタン
type: `button`
ボタンを表示します。何かの機能をオン/オフさせたい場合に有用です。
#### スイッチ
type: `switch`
スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
##### プロパティ
`desc` ... ボタンの詳細な説明。
`desc` ... スイッチの詳細な説明。
#### ラジオボタン
type: `radio`
@@ -145,6 +145,15 @@ items: [{
}]
```
#### スライダー
type: `slider`
スライダーを表示します。
##### プロパティ
`min` ... スライダーの下限。
`max` ... スライダーの上限。
`step` ... 入力欄で刻むステップ値。
#### テキストボックス
type: `textbox`
テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
@@ -163,3 +172,6 @@ type: `textbox`
}
```
メッセージの種類: `success`, `info`, `warning`, `error`
## 投了する
投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。

View File

@@ -0,0 +1,18 @@
{
"name": "misskey-reversi",
"version": "0.0.5",
"description": "Misskey reversi engine",
"keywords": [
"misskey"
],
"author": "syuilo <i@syuilo.com>",
"license": "MIT",
"repository": "https://github.com/syuilo/misskey.git",
"bugs": "https://github.com/syuilo/misskey/issues",
"main": "./built/core.js",
"types": "./built/core.d.ts",
"scripts": {
"build": "tsc"
},
"dependencies": {}
}

View File

@@ -0,0 +1,21 @@
{
"compilerOptions": {
"noEmitOnError": false,
"noImplicitAny": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"experimentalDecorators": true,
"declaration": true,
"sourceMap": false,
"target": "es2017",
"module": "commonjs",
"removeComments": false,
"noLib": false,
"outDir": "./built",
"rootDir": "./"
},
"compileOnSave": false,
"include": [
"./core.ts"
]
}

View File

@@ -1,5 +1,6 @@
const { lib: emojilib } = require('emojilib');
import { JSDOM } from 'jsdom';
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
import config from '../config';
import { INote } from '../models/note';
import { TextElement } from './parse';

View File

@@ -25,6 +25,7 @@ export interface IReversiGame {
isStarted: boolean;
isEnded: boolean;
winnerId: mongo.ObjectID;
surrendered: mongo.ObjectID;
logs: Array<{
at: Date;
color: boolean;

View File

@@ -0,0 +1,59 @@
import $ from 'cafy'; import ID from '../../../../../../misc/cafy-id';
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
import { ILocalUser } from '../../../../../../models/user';
import getParams from '../../../../get-params';
import { publishReversiGameStream } from '../../../../../../stream';
export const meta = {
desc: {
ja: '指定したリバーシの対局で投了します。'
},
requireCredential: true,
params: {
gameId: $.type(ID).optional.note({
desc: {
ja: '投了したい対局'
}
})
}
};
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
const [ps, psErr] = getParams(meta, params);
if (psErr) return rej(psErr);
const game = await ReversiGame.findOne({ _id: ps.gameId });
if (game == null) {
return rej('game not found');
}
if (game.isEnded) {
return rej('this game is already ended');
}
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) {
return rej('access denied');
}
const winnerId = game.user1Id.equals(user._id) ? game.user2Id : game.user1Id;
await ReversiGame.update({
_id: game._id
}, {
$set: {
surrendered: user._id,
isEnded: true,
winnerId: winnerId
}
});
publishReversiGameStream(game._id, 'ended', {
winnerId: winnerId,
game: await pack(game._id, user)
});
res();
});

View File

@@ -103,6 +103,10 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
data.visibleUsers = data.visibleUsers.filter(x => x != null);
}
if (data.text) {
data.text = data.text.trim();
}
// Parse MFM
const tokens = data.text ? parse(data.text) : [];