Compare commits

...

25 Commits

Author SHA1 Message Date
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
11 changed files with 209 additions and 128 deletions

1
.gitignore vendored
View File

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

View File

@@ -7,9 +7,9 @@ common:
about-title: "Une ⭐ du fédiverse." 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 ?" 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: adblock:
detected: "広告ブロッカーを無効にしてください" detected: "Veuillez désactiver le bloqueur de publicités"
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。" 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: "アプリの連携" application-authorization: "Permissions de l'application"
close: "Fermer" close: "Fermer"
customization-tips: customization-tips:
title: "Conseils de personnalisation" title: "Conseils de personnalisation"
@@ -21,7 +21,7 @@ common:
notification: notification:
file-uploaded: "Le fichier a été téléversé !" file-uploaded: "Le fichier a été téléversé !"
message-from: "Message de {} :" message-from: "Message de {} :"
reversi-invited: "対局への招待があります" reversi-invited: "Invité à jouer"
reversi-invited-by: "Invité par {} :" reversi-invited-by: "Invité par {} :"
notified-by: "Notifié par {} :" notified-by: "Notifié par {} :"
reply-from: "Réponse de {} :" reply-from: "Réponse de {} :"
@@ -95,8 +95,8 @@ common:
turn-of: "Cest le tour de {}" turn-of: "Cest le tour de {}"
past-turn-of: "C'est au tour de {}" past-turn-of: "C'est au tour de {}"
won: "{} a gagné" won: "{} a gagné"
black: "Noir" black: "Noirs"
white: "Blanc" white: "Blancs"
total: "Total" total: "Total"
this-turn: "Tour de {}" this-turn: "Tour de {}"
widgets: widgets:
@@ -141,15 +141,15 @@ common:
stack-left: "Vers la gauche" stack-left: "Vers la gauche"
pop-right: "Vers la droite" pop-right: "Vers la droite"
auth/views/form.vue: 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 :" 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 :" account-write: "Modifications des informations du compte :"
note-write: "投稿する。" note-write: "Publier."
like-write: "いいねしたりいいね解除する。" like-write: "Réagir aux publications."
following-write: "フォローしたりフォロー解除する。" following-write: "S'abonner et se désabonner."
drive-read: "Lire votre Drive" drive-read: "Lire votre Drive"
drive-write: "ドライブを操作する。" drive-write: "Téléverser/supprimer des fichiers dans votre Drive."
notification-read: "Lire vos notifications." notification-read: "Lire vos notifications."
notification-write: "Gérer vos notifications." notification-write: "Gérer vos notifications."
cancel: "Annuler" cancel: "Annuler"
@@ -181,22 +181,22 @@ common/views/components/games/reversi/reversi.index.vue:
all-games: "Tous les jeux" all-games: "Tous les jeux"
enter-username: "Saisir un nom d'utilisateur" enter-username: "Saisir un nom d'utilisateur"
game-state: game-state:
ended: "終了" ended: "Terminée"
playing: "En cours" playing: "En cours"
common/views/components/games/reversi/reversi.room.vue: common/views/components/games/reversi/reversi.room.vue:
settings-of-the-game: "Paramètres du jeu" settings-of-the-game: "Paramètres du jeu"
choose-map: "Sélectionnez une carte" choose-map: "Sélectionnez une carte"
random: "Aléatoire" random: "Aléatoire"
black-or-white: "Noir/Blanc" black-or-white: "Noirs/Blancs"
black-is: "{}が黒" black-is: "{} Noirs"
rules: "Règles" rules: "Règles"
is-llotheo: "石の少ない方が勝ち(ロセオ)" is-llotheo: "石の少ない方が勝ち(ロセオ)"
looped-map: "ループマップ" looped-map: "Carte en boucle"
can-put-everywhere: "どこでも置けるモード" can-put-everywhere: "どこでも置けるモード"
settings-of-the-bot: "Configuration du bot" settings-of-the-bot: "Configuration du bot"
this-game-is-started-soon: "ゲームは数秒後に開始されます" this-game-is-started-soon: "La partie commencera dans quelques instants"
waiting-for-other: "相手の準備が完了するのを待っています" waiting-for-other: "En attente que l'adversaire soit prêt"
waiting-for-me: "あなたの準備が完了するのを待っています" waiting-for-me: "En attente que vous soyez prêt"
waiting-for-both: "準備中" waiting-for-both: "準備中"
cancel: "Annuler" cancel: "Annuler"
ready: "Prêt" ready: "Prêt"
@@ -358,7 +358,7 @@ common/views/widgets/memo.vue:
memo: "Écrivez ici !" memo: "Écrivez ici !"
save: "Enregistrer" save: "Enregistrer"
common/views/widgets/slideshow.vue: 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" folder: "Veuillez cliquer pour spécifier le dossier"
no-image: "Il n'y a aucune image dans ce dossier" no-image: "Il n'y a aucune image dans ce dossier"
common/views/widgets/tips.vue: common/views/widgets/tips.vue:
@@ -369,27 +369,27 @@ common/views/widgets/tips.vue:
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます" tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます" tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます" tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
tips-line8: "ホームは設定からカスタマイズできます" tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
tips-line9: "Misskey est sous licence AGPLv3" tips-line9: "Misskey est sous licence AGPLv3"
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます" tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます" tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
tips-line13: "投稿に添付したファイルは全てドライブに保存されます" tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます" tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
tips-line17: "「**」でテキストを囲むと**強調表示**されます" tips-line17: "「**」でテキストを囲むと**強調表示**されます"
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます" tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています" tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
tips-line21: "APIを利用してbotの開発なども行えます" tips-line21: "Vous pouvez aussi utiliser l'API pour développer des Bots."
tips-line23: "まゆかわいいよまゆ" tips-line23: "まゆかわいいよまゆ"
tips-line24: "Misskeyは2014年にサービスを開始しました" tips-line24: "Misskey a vu le jour en 2014"
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます" tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
common/views/pages/follow.vue: common/views/pages/follow.vue:
signed-in-as: "Connecté en tant que {}" signed-in-as: "Connecté·é en tant que {}"
following: "Suit" following: "Suit"
follow: "Suivre" follow: "Suivre"
request-pending: "Demande d'abonnement en attente" request-pending: "Demande d'abonnement en attente"
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Noir ... Total" total: "Noirs ... Total"
notes: "Bleu ... Notes" notes: "Bleu ... Notes"
replies: "Rouge ... Réponses" replies: "Rouge ... Réponses"
renotes: "Vert ... Partages" renotes: "Vert ... Partages"
@@ -530,9 +530,9 @@ desktop/views/components/notifications.vue:
more: "Plus" more: "Plus"
empty: "Pas de notifications" empty: "Pas de notifications"
desktop/views/components/post-form.vue: desktop/views/components/post-form.vue:
add-visible-user: "+ユーザーを追加" add-visible-user: "+Ajouter un utilisateur"
attach-location-information: "位置情報を添付する" attach-location-information: "Attacher des informations de localisation"
hide-contents: "内容を隠す" hide-contents: "Masquer les contenus"
reply-placeholder: "Répondre à cette note" reply-placeholder: "Répondre à cette note"
quote-placeholder: "Citer cette note" quote-placeholder: "Citer cette note"
submit: "Poster" submit: "Poster"
@@ -552,11 +552,11 @@ desktop/views/components/post-form.vue:
create-poll: "Créer un sondage" create-poll: "Créer un sondage"
text-remain: "{} charactères restants" text-remain: "{} charactères restants"
recent-tags: "Récent" recent-tags: "Récent"
click-to-tagging: "クリックでタグ付け" click-to-tagging: "Cliquer pour tagguer"
visibility: "公開範囲" visibility: "Visibilité"
geolocation-alert: "お使いの端末は位置情報に対応していません" geolocation-alert: "Votre appareil ne prend pas en charge les services de localisation"
error: "エラー" error: "Erreur"
enter-username: "ユーザー名を入力してください" enter-username: "Saisir un nom d'utilisateur …"
desktop/views/components/post-form-window.vue: desktop/views/components/post-form-window.vue:
note: "Nouvelle note" note: "Nouvelle note"
reply: "Répondre" reply: "Répondre"
@@ -678,8 +678,8 @@ desktop/views/components/settings.api.vue:
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "Aucune application autorisée" no-apps: "Aucune application autorisée"
desktop/views/components/settings.drive.vue: desktop/views/components/settings.drive.vue:
max: "" max: "Maximum"
in-use: "使用中" in-use: "en cours dutilisation"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "Aucun utilisateurs mis en sourdine" no-users: "Aucun utilisateurs mis en sourdine"
desktop/views/components/settings.password.vue: desktop/views/components/settings.password.vue:
@@ -702,7 +702,7 @@ desktop/views/components/settings.profile.vue:
other: "Autre" other: "Autre"
is-bot: "Ce compte est un Bot" is-bot: "Ce compte est un Bot"
is-cat: "Ce compte est un Chat" is-cat: "Ce compte est un Chat"
profile-updated: "プロフィールを更新しました" profile-updated: "Profil mis à jour"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
private: "cette publication est privée" private: "cette publication est privée"
deleted: "cette publication a été supprimée" deleted: "cette publication a été supprimée"
@@ -776,7 +776,7 @@ desktop/views/pages/welcome.vue:
signin-button: "Se connecter" signin-button: "Se connecter"
signup-button: "S'inscrire" signup-button: "S'inscrire"
timeline: "Fil d'actualité" 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: desktop/views/pages/drive.vue:
title: "Lecteur de Misskey" title: "Lecteur de Misskey"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -792,10 +792,10 @@ desktop/views/pages/selectdrive.vue:
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/search.vue: desktop/views/pages/search.vue:
not-available: "検索機能を利用することができません。" not-available: "Vous ne pouvez pas utiliser la fonctionnalité de recherche."
not-found: "「{}」に関する投稿は見つかりませんでした。" not-found: "Aucun message trouvé pour '{}'"
desktop/views/pages/share.vue: desktop/views/pages/share.vue:
share-with: "{}で共有" share-with: "Partager avec {}"
desktop/views/pages/tag.vue: desktop/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。" no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
desktop/views/pages/user-list.users.vue: desktop/views/pages/user-list.users.vue:
@@ -941,7 +941,7 @@ mobile/views/components/post-form.vue:
renote: "Republier" renote: "Republier"
quote-placeholder: "Citer ce billet ... (Facultatif)" quote-placeholder: "Citer ce billet ... (Facultatif)"
reply-placeholder: "Répondre à cette note" 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" location-alert: "Votre appareil ne prend pas en charge les services de localisation"
error: "Erreur" error: "Erreur"
username-prompt: "Saisir un nom d'utilisateur" username-prompt: "Saisir un nom d'utilisateur"
@@ -999,14 +999,14 @@ mobile/views/pages/home.vue:
mobile/views/pages/tag.vue: mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。" no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
mobile/views/pages/welcome.vue: mobile/views/pages/welcome.vue:
signup: "新規登録" signup: "S'enregistrer"
mobile/views/pages/widgets.vue: mobile/views/pages/widgets.vue:
dashboard: "ダッシュボード" dashboard: "Tableau de bord"
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。" widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
mobile/views/pages/widgets/activity.vue: mobile/views/pages/widgets/activity.vue:
activity: "アクティビティ" activity: "Activité"
mobile/views/pages/share.vue: mobile/views/pages/share.vue:
share-with: "{}で共有" share-with: "Partager avec {}"
mobile/views/pages/messaging.vue: mobile/views/pages/messaging.vue:
messaging: "Messagerie" messaging: "Messagerie"
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
@@ -1023,7 +1023,7 @@ 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/games/reversi.vue: mobile/views/pages/games/reversi.vue:
reversi: "リバーシ" reversi: "Reversi"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "Profil" title: "Profil"
name: "Nom" name: "Nom"
@@ -1044,7 +1044,7 @@ mobile/views/pages/search.vue:
mobile/views/pages/selectdrive.vue: 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é·e en tant que {}"
lang: "Langue" lang: "Langue"
lang-tip: "Le rechargement de la page est requis afin d'appliquer les modifications." lang-tip: "Le rechargement de la page est requis afin d'appliquer les modifications."
recommended: "Recommandé" recommended: "Recommandé"

View File

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

View File

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

View File

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

View File

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

View File

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

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,5 @@
const { lib: emojilib } = require('emojilib'); const { lib: emojilib } = require('emojilib');
import { JSDOM } from 'jsdom'; const JSDOM = require('jsdom');
import config from '../config'; import config from '../config';
import { INote } from '../models/note'; import { INote } from '../models/note';
import { TextElement } from './parse'; import { TextElement } from './parse';

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); data.visibleUsers = data.visibleUsers.filter(x => x != null);
} }
if (data.text) {
data.text = data.text.trim();
}
// Parse MFM // Parse MFM
const tokens = data.text ? parse(data.text) : []; const tokens = data.text ? parse(data.text) : [];