diff options
| author | Henry Jameson <me@hjkos.com> | 2019-06-13 00:07:28 +0300 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2019-06-13 00:07:28 +0300 |
| commit | 77511a5338a36e824b2521ea972d654517d2aed0 (patch) | |
| tree | 428bde231ecc98cbe18153904d9a9aeba75e3be2 /src | |
| parent | e7a2a7267dbd8a4ee3d266d22249459d028569d6 (diff) | |
| parent | 9df99c5205b1cb560bb25c0dd81cc90acbde4d7f (diff) | |
Merge remote-tracking branch 'upstream/develop' into masto-register-app-secret
* upstream/develop:
Apply suggestion to src/services/entity_normalizer/entity_normalizer.service.js
i18n/Update Japanese translation
render modal at the root level using portal
install portal vue
Small improve of the who to follow panel layout
Fix/Small fix in the who to follow page
remove console spam
i18n
wire up user.description with masto api data
i18n/Add Japanese with kanji (2)
move drowdown menu to popper
notification controls: redesign entirely
entity normalizer: collapse data.pleroma if blocks
wire up notification settings
do not miss statusnet_profile_url of mentions
Translation to Hebrew of everything other than theme_helpers and style.
Translate up to settings.
mastoapi login works
Diffstat (limited to 'src')
22 files changed, 1076 insertions, 117 deletions
diff --git a/src/App.vue b/src/App.vue index 21abd694..769e075d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -49,6 +49,7 @@ </div> <chat-panel :floating="true" v-if="currentUser && chat" class="floating-chat mobile-hidden"></chat-panel> <UserReportingModal /> + <portal-target name="modal" /> </div> </template> diff --git a/src/components/dialog_modal/dialog_modal.vue b/src/components/dialog_modal/dialog_modal.vue index 7621fb20..3da543de 100644 --- a/src/components/dialog_modal/dialog_modal.vue +++ b/src/components/dialog_modal/dialog_modal.vue @@ -62,6 +62,7 @@ .title { margin-bottom: 0; + text-align: center; } } @@ -80,6 +81,7 @@ background-color: var(--lightBg, $fallback--lightBg); border-top: 1px solid $fallback--bg; border-top: 1px solid var(--bg, $fallback--bg); + display: flex; justify-content: flex-end; button { diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue index ef11138d..a761d313 100644 --- a/src/components/extra_buttons/extra_buttons.vue +++ b/src/components/extra_buttons/extra_buttons.vue @@ -13,7 +13,7 @@ }" > <div class="popper-wrapper"> - <div class="dropdown-menu"> + <div class="dropdown-menu"> <button class="dropdown-item dropdown-item-icon" @click.prevent="pinStatus" v-if="!status.pinned && canPin"> <i class="icon-pin"></i><span>{{$t("status.pin")}}</span> </button> @@ -35,6 +35,7 @@ <style lang="scss"> @import '../../_variables.scss'; +@import '../popper/popper.scss'; .icon-ellipsis { cursor: pointer; diff --git a/src/components/interactions/interactions.vue b/src/components/interactions/interactions.vue index 5a204ca7..38b2670d 100644 --- a/src/components/interactions/interactions.vue +++ b/src/components/interactions/interactions.vue @@ -2,7 +2,7 @@ <div class="panel panel-default"> <div class="panel-heading"> <div class="title"> - Interactions + {{ $t("nav.interactions") }} </div> </div> <tab-switcher diff --git a/src/components/interface_language_switcher/interface_language_switcher.vue b/src/components/interface_language_switcher/interface_language_switcher.vue index 3f58af2c..9f7877c6 100644 --- a/src/components/interface_language_switcher/interface_language_switcher.vue +++ b/src/components/interface_language_switcher/interface_language_switcher.vue @@ -26,7 +26,7 @@ }, languageNames () { - return _.map(this.languageCodes, ISO6391.getName) + return _.map(this.languageCodes, this.getLanguageName) }, language: { @@ -36,6 +36,17 @@ this.$i18n.locale = val } } + }, + + methods: { + getLanguageName (code) { + const specialLanguageNames = { + 'ja': 'Japanese (やさしいにほんご)', + 'ja_pedantic': 'Japanese (日本語)', + 'zh': 'Chinese (简体中文)' + } + return specialLanguageNames[code] || ISO6391.getName(code) + } } } </script> diff --git a/src/components/mobile_nav/mobile_nav.vue b/src/components/mobile_nav/mobile_nav.vue index 90707ce7..dcac440a 100644 --- a/src/components/mobile_nav/mobile_nav.vue +++ b/src/components/mobile_nav/mobile_nav.vue @@ -29,7 +29,7 @@ </a> </div> <div class="mobile-notifications" @scroll="onScroll"> - <Notifications ref="notifications" noHeading="true"/> + <Notifications ref="notifications" :noHeading="true"/> </div> </div> <SideDrawer ref="sideDrawer" :logout="logout"/> diff --git a/src/components/moderation_tools/moderation_tools.vue b/src/components/moderation_tools/moderation_tools.vue index c9e3fc78..6a5e8cc0 100644 --- a/src/components/moderation_tools/moderation_tools.vue +++ b/src/components/moderation_tools/moderation_tools.vue @@ -65,18 +65,20 @@ {{ $t('user_card.admin_menu.moderation') }} </button> </Popper> - <DialogModal v-if="showDeleteUserDialog" :onCancel='deleteUserDialog.bind(this, false)'> - <span slot="header">{{ $t('user_card.admin_menu.delete_user') }}</span> - <p>{{ $t('user_card.admin_menu.delete_user_confirmation') }}</p> - <span slot="footer"> - <button @click='deleteUserDialog(false)'> - {{ $t('general.cancel') }} - </button> - <button class="danger" @click='deleteUser()'> - {{ $t('user_card.admin_menu.delete_user') }} - </button> - </span> - </DialogModal> + <portal to="modal"> + <DialogModal v-if="showDeleteUserDialog" :onCancel='deleteUserDialog.bind(this, false)'> + <template slot="header">{{ $t('user_card.admin_menu.delete_user') }}</template> + <p>{{ $t('user_card.admin_menu.delete_user_confirmation') }}</p> + <template slot="footer"> + <button class="btn btn-default" @click='deleteUserDialog(false)'> + {{ $t('general.cancel') }} + </button> + <button class="btn btn-default danger" @click='deleteUser()'> + {{ $t('user_card.admin_menu.delete_user') }} + </button> + </template> + </DialogModal> + </portal> </div> </template> @@ -86,64 +88,6 @@ @import '../../_variables.scss'; @import '../popper/popper.scss'; -.dropdown-menu { - display: block; - padding: .5rem 0; - font-size: 1rem; - text-align: left; - list-style: none; - max-width: 100vw; - z-index: 10; - box-shadow: 1px 1px 4px rgba(0,0,0,.6); - box-shadow: var(--panelShadow); - border: none; - border-radius: $fallback--btnRadius; - border-radius: var(--btnRadius, $fallback--btnRadius); - background-color: $fallback--bg; - background-color: var(--bg, $fallback--bg); - - .dropdown-divider { - height: 0; - margin: .5rem 0; - overflow: hidden; - border-top: 1px solid $fallback--border; - border-top: 1px solid var(--border, $fallback--border); - } - - .dropdown-item { - line-height: 21px; - margin-right: 5px; - overflow: auto; - display: block; - padding: .25rem 1.0rem .25rem 1.5rem; - clear: both; - font-weight: 400; - text-align: inherit; - white-space: normal; - border: none; - border-radius: 0px; - background-color: transparent; - box-shadow: none; - width: 100%; - height: 100%; - - &-icon { - padding-left: 0.5rem; - - i { - margin-right: 0.25rem; - } - } - - &:hover { - // TODO: improve the look on breeze themes - background-color: $fallback--fg; - background-color: var(--btn, $fallback--fg); - box-shadow: none; - } - } -} - .menu-checkbox { float: right; min-width: 22px; diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 8c97eb04..6c4054fd 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -35,7 +35,6 @@ const Notifications = { return unseenNotificationsFromStore(this.$store) }, visibleNotifications () { - console.log(this.filterMode) return visibleNotificationsFromStore(this.$store, this.filterMode) }, unseenCount () { diff --git a/src/components/popper/popper.scss b/src/components/popper/popper.scss index 0c30d625..cfc5c8e7 100644 --- a/src/components/popper/popper.scss +++ b/src/components/popper/popper.scss @@ -68,3 +68,60 @@ margin-right: 0; } +.dropdown-menu { + display: block; + padding: .5rem 0; + font-size: 1rem; + text-align: left; + list-style: none; + max-width: 100vw; + z-index: 10; + box-shadow: 1px 1px 4px rgba(0,0,0,.6); + box-shadow: var(--panelShadow); + border: none; + border-radius: $fallback--btnRadius; + border-radius: var(--btnRadius, $fallback--btnRadius); + background-color: $fallback--bg; + background-color: var(--bg, $fallback--bg); + + .dropdown-divider { + height: 0; + margin: .5rem 0; + overflow: hidden; + border-top: 1px solid $fallback--border; + border-top: 1px solid var(--border, $fallback--border); + } + + .dropdown-item { + line-height: 21px; + margin-right: 5px; + overflow: auto; + display: block; + padding: .25rem 1.0rem .25rem 1.5rem; + clear: both; + font-weight: 400; + text-align: inherit; + white-space: normal; + border: none; + border-radius: 0px; + background-color: transparent; + box-shadow: none; + width: 100%; + height: 100%; + + &-icon { + padding-left: 0.5rem; + + i { + margin-right: 0.25rem; + } + } + + &:hover { + // TODO: improve the look on breeze themes + background-color: $fallback--fg; + background-color: var(--btn, $fallback--fg); + box-shadow: none; + } + } +} diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js index 2418450c..ae36e5e8 100644 --- a/src/components/user_settings/user_settings.js +++ b/src/components/user_settings/user_settings.js @@ -55,7 +55,8 @@ const UserSettings = { changePasswordInputs: [ '', '', '' ], changedPassword: false, changePasswordError: false, - activeTab: 'profile' + activeTab: 'profile', + notificationSettings: this.$store.state.users.currentUser.notification_settings } }, created () { @@ -128,6 +129,10 @@ const UserSettings = { this.$store.commit('setCurrentUser', user) }) }, + updateNotificationSettings () { + this.$store.state.api.backendInteractor + .updateNotificationSettings({ settings: this.notificationSettings }) + }, changeVis (visibility) { this.newDefaultScope = visibility }, diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue index 2cb8b37a..15a5428c 100644 --- a/src/components/user_settings/user_settings.vue +++ b/src/components/user_settings/user_settings.vue @@ -44,6 +44,7 @@ <scope-selector :showAll="true" :userDefault="newDefaultScope" + :initialScope="newDefaultScope" :onScopeChange="changeVis"/> </div> </div> @@ -167,6 +168,43 @@ </div> </div> + <div :label="$t('settings.notifications')" v-if="pleromaBackend"> + <div class="setting-item"> + <div class="select-multiple"> + <span class="label">{{$t('settings.notification_setting')}}</span> + <ul class="option-list"> + <li> + <input type="checkbox" id="notification-setting-follows" v-model="notificationSettings.follows"> + <label for="notification-setting-follows"> + {{$t('settings.notification_setting_follows')}} + </label> + </li> + <li> + <input type="checkbox" id="notification-setting-followers" v-model="notificationSettings.followers"> + <label for="notification-setting-followers"> + {{$t('settings.notification_setting_followers')}} + </label> + </li> + <li> + <input type="checkbox" id="notification-setting-non-follows" v-model="notificationSettings.non_follows"> + <label for="notification-setting-non-follows"> + {{$t('settings.notification_setting_non_follows')}} + </label> + </li> + <li> + <input type="checkbox" id="notification-setting-non-followers" v-model="notificationSettings.non_followers"> + <label for="notification-setting-non-followers"> + {{$t('settings.notification_setting_non_followers')}} + </label> + </li> + </ul> + </div> + <p>{{$t('settings.notification_mutes')}}</p> + <p>{{$t('settings.notification_blocks')}}</p> + <button class="btn btn-default" @click="updateNotificationSettings">{{$t('general.submit')}}</button> + </div> + </div> + <div :label="$t('settings.data_import_export_tab')" v-if="pleromaBackend"> <div class="setting-item"> <h2>{{$t('settings.follow_import')}}</h2> diff --git a/src/components/who_to_follow/who_to_follow.js b/src/components/who_to_follow/who_to_follow.js index be0b8827..7ae602a2 100644 --- a/src/components/who_to_follow/who_to_follow.js +++ b/src/components/who_to_follow/who_to_follow.js @@ -20,7 +20,8 @@ const WhoToFollow = { id: 0, name: i.display_name, screen_name: i.acct, - profile_image_url: i.avatar || '/images/avi.png' + profile_image_url: i.avatar || '/images/avi.png', + profile_image_url_original: i.avatar || '/images/avi.png' } this.users.push(user) diff --git a/src/components/who_to_follow_panel/who_to_follow_panel.vue b/src/components/who_to_follow_panel/who_to_follow_panel.vue index 25e3a9f6..74e82789 100644 --- a/src/components/who_to_follow_panel/who_to_follow_panel.vue +++ b/src/components/who_to_follow_panel/who_to_follow_panel.vue @@ -6,14 +6,18 @@ {{$t('who_to_follow.who_to_follow')}} </div> </div> - <div class="panel-body who-to-follow"> - <span v-for="user in usersToFollow"> + <div class="who-to-follow"> + <p v-for="user in usersToFollow" class="who-to-follow-items"> <img v-bind:src="user.img" /> <router-link v-bind:to="userProfileLink(user.id, user.name)"> {{user.name}} </router-link><br /> - </span> - <img v-bind:src="$store.state.instance.logo"> <router-link :to="{ name: 'who-to-follow' }">{{$t('who_to_follow.more')}}</router-link> + </p> + <p class="who-to-follow-more"> + <router-link :to="{ name: 'who-to-follow' }"> + {{$t('who_to_follow.more')}} + </router-link> + </p> </div> </div> </div> @@ -30,11 +34,19 @@ height: 32px; } .who-to-follow { - padding: 0.5em 1em 0.5em 1em; + padding: 0em 1em; margin: 0px; - line-height: 40px; + } + .who-to-follow-items { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + padding: 0px; + margin: 1em 0em; + } + .who-to-follow-more { + padding: 0px; + margin: 1em 0em; + text-align: center; } </style> diff --git a/src/i18n/en.json b/src/i18n/en.json index 031c93de..2b5c5468 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -277,6 +277,13 @@ "true": "yes" }, "notifications": "Notifications", + "notification_setting": "Receive notifications from:", + "notification_setting_follows": "Users you follow", + "notification_setting_non_follows": "Users you do not follow", + "notification_setting_followers": "Users who follow you", + "notification_setting_non_followers": "Users who do not follow you", + "notification_mutes": "To stop receiving notifications from a specific user, use a mute.", + "notification_blocks": "Blocking a user stops all notifications as well as unsubscribes them.", "enable_web_push_notifications": "Enable web push notifications", "style": { "switcher": { diff --git a/src/i18n/he.json b/src/i18n/he.json index ea581e05..1c034960 100644 --- a/src/i18n/he.json +++ b/src/i18n/he.json @@ -2,6 +2,10 @@ "chat": { "title": "צ'אט" }, + "exporter": { + "export": "ייצוא", + "processing": "מעבד, בקרוב תופיע אפשרות להוריד את הקובץ" + }, "features_panel": { "chat": "צ'אט", "gopher": "גופר", @@ -17,23 +21,53 @@ }, "general": { "apply": "החל", - "submit": "שלח" + "submit": "שלח", + "more": "עוד", + "generic_error": "קרתה שגיאה", + "optional": "לבחירה", + "show_more": "הראה עוד", + "show_less": "הראה פחות", + "cancel": "בטל" + }, + "image_cropper": { + "crop_picture": "חתוך תמונה", + "save": "שמור", + "save_without_cropping": "שמור בלי לחתוך", + "cancel": "בטל" + }, + "importer": { + "submit": "שלח", + "success": "ייובא בהצלחה.", + "error": "אירעתה שגיאה בזמן ייבוא קובץ זה." }, "login": { "login": "התחבר", + "description": "היכנס עם OAuth", "logout": "התנתק", "password": "סיסמה", "placeholder": "למשל lain", "register": "הירשם", - "username": "שם המשתמש" + "username": "שם המשתמש", + "hint": "הירשם על מנת להצטרף לדיון" + }, + "media_modal": { + "previous": "הקודם", + "next": "הבא" }, "nav": { + "about": "על-אודות", + "back": "חזור", "chat": "צ'אט מקומי", "friend_requests": "בקשות עקיבה", "mentions": "אזכורים", + "interactions": "אינטרקציות", + "dms": "הודעות ישירות", "public_tl": "ציר הזמן הציבורי", "timeline": "ציר הזמן", - "twkn": "כל הרשת הידועה" + "twkn": "כל הרשת הידועה", + "user_search": "חיפוש משתמש", + "who_to_follow": "אחרי מי לעקוב", + "preferences": "העדפות" }, "notifications": { "broken_favorite": "סטאטוס לא ידוע, מחפש...", @@ -42,19 +76,35 @@ "load_older": "טען התראות ישנות", "notifications": "התראות", "read": "קרא!", - "repeated_you": "חזר על הסטטוס שלך" + "repeated_you": "חזר על הסטטוס שלך", + "no_more_notifications": "לא עוד התראות" + }, + "interactions": { + "favs_repeats": "חזרות ומועדפים", + "follows": "עוקבים חדשים", + "load_older": "טען אינטרקציות ישנות" }, "post_status": { + "new_status": "פרסם סטאטוס חדש", "account_not_locked_warning": "המשתמש שלך אינו {0}. כל אחד יכול לעקוב אחריך ולראות את ההודעות לעוקבים-בלבד שלך.", "account_not_locked_warning_link": "נעול", "attachments_sensitive": "סמן מסמכים מצורפים כלא בטוחים לצפייה", "content_type": { - "text/plain": "טקסט פשוט" + "text/plain": "טקסט פשוט", + "text/html": "HTML", + "text/markdown": "Markdown", + "text/bbcode": "BBCode" }, "content_warning": "נושא (נתון לבחירה)", "default": "הרגע נחת ב-ל.א.", - "direct_warning": "הודעה זו תהיה זמינה רק לאנשים המוזכרים.", + "direct_warning_to_all": "הודעה זו תהיה נראית לכל המשתמשים המוזכרים.", + "direct_warning_to_first_only": "הודעה זו תהיה נראית לכל המשתמשים במוזכרים בתחילת ההודעה בלבד.", "posting": "מפרסם", + "scope_notice": { + "public": "הודעה זו תהיה נראית לכולם", + "private": "הודעה זו תהיה נראית לעוקבים שלך בלבד", + "unlisted": "הודעה זו לא תהיה נראית בציר זמן הציבורי או בכל הרשת הידועה" + }, "scope": { "direct": "ישיר - שלח לאנשים המוזכרים בלבד", "private": "עוקבים-בלבד - שלח לעוקבים בלבד", @@ -68,9 +118,26 @@ "fullname": "שם תצוגה", "password_confirm": "אישור סיסמה", "registration": "הרשמה", - "token": "טוקן הזמנה" + "token": "טוקן הזמנה", + "captcha": "אימות אנוש", + "new_captcha": "לחץ על התמונה על מנת לקבל אימות אנוש חדש", + "username_placeholder": "למשל lain", + "fullname_placeholder": "למשל Lain Iwakura", + "bio_placeholder": "למשל\nהיי, אני ליין.\nאני ילדת אנימה שגרה בפרוורי יפן. אולי אתם מכירים אותי מהWired.", + "validations": { + "username_required": "לא יכול להישאר ריק", + "fullname_required": "לא יכול להישאר ריק", + "email_required": "לא יכול להישאר ריק", + "password_required": "לא יכול להישאר ריק", + "password_confirmation_required": "לא יכול להישאר ריק", + "password_confirmation_match": "צריך להיות דומה לסיסמה" + } + }, + "selectable_list": { + "select_all": "בחר הכל" }, "settings": { + "app_name": "שם האפליקציה", "attachmentRadius": "צירופים", "attachments": "צירופים", "autoload": "החל טעינה אוטומטית בגלילה לתחתית הדף", @@ -79,6 +146,12 @@ "avatarRadius": "תמונות פרופיל", "background": "רקע", "bio": "אודות", + "block_export": "ייצוא חסימות", + "block_export_button": "ייצוא חסימות אל קובץ csv", + "block_import": "ייבוא חסימות", + "block_import_error": "שגיאה בייבוא החסימות", + "blocks_imported": "החסימות יובאו! ייקח מעט זמן לעבד אותן.", + "blocks_tab": "חסימות", "btnRadius": "כפתורים", "cBlue": "כחול (תגובה, עקיבה)", "cGreen": "ירוק (חזרה)", @@ -88,6 +161,7 @@ "change_password_error": "הייתה בעיה בשינוי סיסמתך.", "changed_password": "סיסמה שונתה בהצלחה!", "collapse_subject": "מזער הודעות עם נושאים", + "composing": "מרכיב", "confirm_new_password": "אשר סיסמה", "current_avatar": "תמונת הפרופיל הנוכחית שלך", "current_password": "סיסמה נוכחית", @@ -98,21 +172,35 @@ "delete_account_description": "מחק לצמיתות את המשתמש שלך ואת כל הודעותיך.", "delete_account_error": "הייתה בעיה במחיקת המשתמש. אם זה ממשיך, אנא עדכן את מנהל השרת שלך.", "delete_account_instructions": "הכנס את סיסמתך בקלט למטה על מנת לאשר מחיקת משתמש.", + "avatar_size_instruction": "הגודל המינימלי המומלץ לתמונות פרופיל הוא 150x150 פיקסלים.", "export_theme": "שמור ערכים", "filtering": "סינון", "filtering_explanation": "כל הסטטוסים הכוללים את המילים הללו יושתקו, אחד לשורה", "follow_export": "יצוא עקיבות", "follow_export_button": "ייצא את הנעקבים שלך לקובץ csv", - "follow_export_processing": "טוען. בקרוב תתבקש להוריד את הקובץ את הקובץ שלך", "follow_import": "יבוא עקיבות", "follow_import_error": "שגיאה בייבוא נעקבים.", "follows_imported": "נעקבים יובאו! ייקח זמן מה לעבד אותם.", "foreground": "חזית", + "general": "כללי", "hide_attachments_in_convo": "החבא צירופים בשיחות", "hide_attachments_in_tl": "החבא צירופים בציר הזמן", + "hide_muted_posts": "הסתר הודעות של משתמשים מושתקים", + "max_thumbnails": "מספר מירבי של תמונות ממוזערות להודעה", + "hide_isp": "הסתר פאנל-צד", + "preload_images": "טען תמונות מראש", + "use_one_click_nsfw": "פתח תמונות לא-בטוחות-לעבודה עם לחיצה אחת בלבד", + "hide_post_stats": "הסתר נתוני הודעה (למשל, מספר החזרות)", + "hide_user_stats": "הסתר נתוני משתמש (למשל, מספר העוקבים)", + "hide_filtered_statuses": "מסתר סטטוסים מסוננים", + "import_blocks_from_a_csv_file": "ייבא חסימות מקובץ csv", "import_followers_from_a_csv_file": "ייבא את הנעקבים שלך מקובץ csv", "import_theme": "טען ערכים", "inputRadius": "שדות קלט", + "checkboxRadius": "תיבות סימון", + "instance_default": "(default: {value})", + "instance_default_simple": "(default)", + "interface": "ממשק", "interfaceLanguage": "שפת הממשק", "invalid_theme_imported": "הקובץ הנבחר אינו תמה הנתמכת ע\"י פלרומה. שום שינויים לא נעשו לתמה שלך.", "limited_availability": "לא זמין בדפדפן שלך", @@ -120,6 +208,9 @@ "lock_account_description": "הגבל את המשתמש לעוקבים מאושרים בלבד", "loop_video": "נגן סרטונים ללא הפסקה", "loop_video_silent_only": "נגן רק סרטונים חסרי קול ללא הפסקה", + "mutes_tab": "השתקות", + "play_videos_in_modal": "נגן סרטונים ישירות בנגן המדיה", + "use_contain_fit": "אל תחתוך את הצירוף בתמונות הממוזערות", "name": "שם", "name_bio": "שם ואודות", "new_password": "סיסמה חדשה", @@ -128,6 +219,13 @@ "notification_visibility_likes": "לייקים", "notification_visibility_mentions": "אזכורים", "notification_visibility_repeats": "חזרות", + "no_rich_text_description": "הסר פורמט טקסט עשיר מכל ההודעות", + "no_blocks": "ללא חסימות", + "no_mutes": "ללא השתקות", + "hide_follows_description": "אל תראה אחרי מי אני עוקב", + "hide_followers_description": "אל תראה מי עוקב אחרי", + "show_admin_badge": "הראה סמל מנהל בפרופיל שלי", + "show_moderator_badge": "הראה סמל צוות בפרופיל שלי", "nsfw_clickthrough": "החל החבאת צירופים לא בטוחים לצפיה בעת עבודה בעזרת לחיצת עכבר", "oauth_tokens": "אסימוני OAuth", "token": "אסימון", @@ -146,18 +244,43 @@ "reply_visibility_all": "הראה את כל התגובות", "reply_visibility_following": "הראה תגובות שמופנות אליי או לעקובים שלי בלבד", "reply_visibility_self": "הראה תגובות שמופנות אליי בלבד", + "autohide_floating_post_button": "החבא אוטומטית את הכפתור הודעה חדשה (נייד)", + "saving_err": "שגיאה בשמירת הגדרות", + "saving_ok": "הגדרות נשמרו", + "search_user_to_block": "חפש משתמש לחסימה", + "search_user_to_mute": "חפש משתמש להשתקה", "security_tab": "ביטחון", + "scope_copy": "העתק תחום הודעה בתגובה להודעה (הודעות ישירות תמיד מועתקות)", + "minimal_scopes_mode": "צמצם אפשרויות בחירה לתחום הודעה", "set_new_avatar": "קבע תמונת פרופיל חדשה", "set_new_profile_background": "קבע רקע פרופיל חדש", "set_new_profile_banner": "קבע כרזת פרופיל חדשה", "settings": "הגדרות", + "subject_input_always_show": "תמיד הראה את שדה הנושא", + "subject_line_behavior": "העתק נושא בתגובה", + "subject_line_email": "כמו אימייל: \"re: נושא\"", + "subject_line_mastodon": "כמו מסטודון: העתק כפי שזה", + "subject_line_noop": "אל תעתיק", + "post_status_content_type": "שלח את סוג תוכן ההודעה", "stop_gifs": "נגן-בעת-ריחוף GIFs", "streaming": "החל זרימת הודעות אוטומטית בעת גלילה למעלה הדף", "text": "טקסט", "theme": "תמה", "theme_help": "השתמש בקודי צבע הקס (#אדום-אדום-ירוק-ירוק-כחול-כחול) על מנת להתאים אישית את תמת הצבע שלך.", "tooltipRadius": "טולטיפ \\ התראות", - "user_settings": "הגדרות משתמש" + "upload_a_photo": "העלה תמונה", + "user_settings": "הגדרות משתמש", + "values": { + "false": "לא", + "true": "כן" + }, + "notifications": "התראות", + "enable_web_push_notifications": "אפשר התראות web push", + "version": { + "title": "גרסה", + "backend_version": "גרסת קצה אחורי", + "frontend_version": "גרסת קצה קדמי" + } }, "timeline": { "collapse": "מוטט", @@ -167,29 +290,107 @@ "no_retweet_hint": "ההודעה מסומנת כ\"לעוקבים-בלבד\" ולא ניתן לחזור עליה", "repeated": "חזר", "show_new": "הראה חדש", - "up_to_date": "עדכני" + "up_to_date": "עדכני", + "no_more_statuses": "אין עוד סטטוסים", + "no_statuses": "אין סטטוסים" + }, + "status": { + "favorites": "מועדפים", + "repeats": "חזרות", + "delete": "מחק סטטוס", + "pin": "הצמד לפרופיל", + "unpin": "הסר הצמדה מהפרופיל", + "pinned": "מוצמד", + "delete_confirm": "האם באמת למחוק סטטוס זה?", + "reply_to": "הגב ל", + "replies_list": "תגובות:" }, "user_card": { "approve": "אשר", "block": "חסימה", "blocked": "חסום!", "deny": "דחה", + "favorites": "מועדפים", "follow": "עקוב", + "follow_sent": "בקשה נשלחה!", + "follow_progress": "מבקש...", + "follow_again": "שלח בקשה שוב?", + "follow_unfollow": "בטל עקיבה", "followees": "נעקבים", "followers": "עוקבים", "following": "עוקב!", "follows_you": "עוקב אחריך!", + "its_you": "זה אתה!", + "media": "מדיה", "mute": "השתק", "muted": "מושתק", "per_day": "ליום", "remote_follow": "עקיבה מרחוק", - "statuses": "סטטוסים" + "report": "דווח", + "statuses": "סטטוסים", + "unblock": "הסר חסימה", + "unblock_progress": "מסיר חסימה...", + "block_progress": "חוסם...", + "unmute": "הסר השתקה", + "unmute_progress": "מסיר השתקה...", + "mute_progress": "משתיק...", + "admin_menu": { + "moderation": "ניהול (צוות)", + "grant_admin": "הפוך למנהל", + "revoke_admin": "הסר מנהל", + "grant_moderator": "הפוך לצוות", + "revoke_moderator": "הסר צוות", + "activate_account": "הפעל משתמש", + "deactivate_account": "השבת משתמש", + "delete_account": "מחק משתמש", + "force_nsfw": "סמן את כל ההודעות בתור לא-מתאימות-לעבודה", + "strip_media": "הסר מדיה מההודעות", + "force_unlisted": "הפוך הודעות ללא רשומות", + "sandbox": "הפוך הודעות לנראות לעוקבים-בלבד", + "disable_remote_subscription": "אל תאפשר עקיבה של המשתמש מאינסטנס אחר", + "disable_any_subscription": "אל תאפשר עקיבה של המשתמש בכלל", + "quarantine": "אל תאפשר פדרציה של ההודעות של המשתמש", + "delete_user": "מחק משתמש", + "delete_user_confirmation": "בטוח? פעולה זו הינה בלתי הפיכה." + } }, "user_profile": { - "timeline_title": "ציר זמן המשתמש" + "timeline_title": "ציר זמן המשתמש", + "profile_does_not_exist": "סליחה, פרופיל זה אינו קיים.", + "profile_loading_error": "סליחה, הייתה שגיאה בטעינת הפרופיל." + }, + "user_reporting": { + "title": "מדווח על {0}", + "add_comment_description": "הדיווח ישלח לצוות האינסטנס. אפשר להסביר למה הנך מדווחים על משתמש זה למטה:", + "additional_comments": "תגובות נוספות", + "forward_description": "המשתמש משרת אחר. לשלוח לשם עותק של הדיווח?", + "forward_to": "העבר ל {0}", + "submit": "הגש", + "generic_error": "קרתה שגיאה בעת עיבוד הבקשה." }, "who_to_follow": { "more": "עוד", "who_to_follow": "אחרי מי לעקוב" + }, + "tool_tip": { + "media_upload": "העלה מדיה", + "repeat": "חזור", + "reply": "הגב", + "favorite": "מועדף", + "user_settings": "הגדרות משתמש" + }, + "upload":{ + "error": { + "base": "העלאה נכשלה.", + "file_too_big": "קובץ גדול מדי [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", + "default": "נסה שוב אחר כך" + }, + "file_size_units": { + "B": "B", + "KiB": "KiB", + "MiB": "MiB", + "GiB": "GiB", + "TiB": "TiB" + } } } diff --git a/src/i18n/ja.json b/src/i18n/ja.json index b77f5531..87ab9dfd 100644 --- a/src/i18n/ja.json +++ b/src/i18n/ja.json @@ -2,6 +2,10 @@ "chat": { "title": "チャット" }, + "exporter": { + "export": "エクスポート", + "processing": "おまちください。しばらくすると、あなたのファイルをダウンロードするように、メッセージがでます。" + }, "features_panel": { "chat": "チャット", "gopher": "Gopher", @@ -19,7 +23,22 @@ "apply": "てきよう", "submit": "そうしん", "more": "つづき", - "generic_error": "エラーになりました" + "generic_error": "エラーになりました", + "optional": "かかなくてもよい", + "show_more": "つづきをみる", + "show_less": "たたむ", + "cancel": "キャンセル" + }, + "image_cropper": { + "crop_picture": "がぞうをきりぬく", + "save": "セーブ", + "save_without_cropping": "きりぬかずにセーブ", + "cancel": "キャンセル" + }, + "importer": { + "submit": "そうしん", + "success": "インポートできました。", + "error": "インポートがエラーになりました。" }, "login": { "login": "ログイン", @@ -31,12 +50,17 @@ "username": "ユーザーめい", "hint": "はなしあいにくわわるには、ログインしてください" }, + "media_modal": { + "previous": "まえ", + "next": "つぎ" + }, "nav": { "about": "これはなに?", "back": "もどる", "chat": "ローカルチャット", "friend_requests": "フォローリクエスト", "mentions": "メンション", + "interactions": "やりとり", "dms": "ダイレクトメッセージ", "public_tl": "パブリックタイムライン", "timeline": "タイムライン", @@ -55,18 +79,33 @@ "repeated_you": "あなたのステータスがリピートされました", "no_more_notifications": "つうちはありません" }, + "interactions": { + "favs_repeats": "リピートとおきにいり", + "follows": "あたらしいフォロー", + "load_older": "ふるいやりとりをみる" + }, "post_status": { "new_status": "とうこうする", "account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのステータスをよむことができます。", "account_not_locked_warning_link": "ロックされたアカウント", "attachments_sensitive": "ファイルをNSFWにする", "content_type": { - "text/plain": "プレーンテキスト" + "text/plain": "プレーンテキスト", + "text/html": "HTML", + "text/markdown": "Markdown", + "text/bbcode": "BBCode" }, "content_warning": "せつめい (かかなくてもよい)", "default": "はねだくうこうに、つきました。", + "direct_warning_to_all": "このとうこうは、メンションされたすべてのユーザーが、みることができます。", + "direct_warning_to_first_only": "このとうこうは、メッセージのはじめでメンションされたユーザーだけが、みることができます。", "direct_warning": "このステータスは、メンションされたユーザーだけが、よむことができます。", "posting": "とうこう", + "scope_notice": { + "public": "このとうこうは、だれでもみることができます", + "private": "このとうこうは、あなたのフォロワーだけが、みることができます", + "unlisted": "このとうこうは、パブリックタイムラインと、つながっているすべてのネットワークでは、みることができません" + }, "scope": { "direct": "ダイレクト: メンションされたユーザーのみにとどきます。", "private": "フォロワーげんてい: フォロワーのみにとどきます。", @@ -83,6 +122,9 @@ "token": "しょうたいトークン", "captcha": "CAPTCHA", "new_captcha": "もじがよめないときは、がぞうをクリックすると、あたらしいがぞうになります", + "username_placeholder": "れい: lain", + "fullname_placeholder": "れい: いわくら れいん", + "bio_placeholder": "れい:\nごきげんよう。わたしはれいん。\nわたしはアニメのおんなのこで、にほんのベッドタウンにすんでいます。ワイヤードで、わたしにあったことが、あるかもしれませんね。", "validations": { "username_required": "なにかかいてください", "fullname_required": "なにかかいてください", @@ -92,7 +134,11 @@ "password_confirmation_match": "パスワードがちがいます" } }, + "selectable_list": { + "select_all": "すべてえらぶ" + }, "settings": { + "app_name": "アプリのなまえ", "attachmentRadius": "ファイル", "attachments": "ファイル", "autoload": "したにスクロールしたとき、じどうてきによみこむ。", @@ -101,6 +147,12 @@ "avatarRadius": "アバター", "background": "バックグラウンド", "bio": "プロフィール", + "block_export": "ブロックのエクスポート", + "block_export_button": "ブロックをCSVファイルにエクスポート", + "block_import": "ブロックのインポート", + "block_import_error": "ブロックのインポートがエラーになりました", + "blocks_imported": "ブロックをインポートしました! じっさいにブロックするまでには、もうしばらくかかります。", + "blocks_tab": "ブロック", "btnRadius": "ボタン", "cBlue": "リプライとフォロー", "cGreen": "リピート", @@ -135,12 +187,15 @@ "general": "ぜんぱん", "hide_attachments_in_convo": "スレッドのファイルをかくす", "hide_attachments_in_tl": "タイムラインのファイルをかくす", + "hide_muted_posts": "ミュートしたユーザーのとうこうをかくす", + "max_thumbnails": "ひとつのとうこうにいれられるサムネイルのかず", "hide_isp": "インスタンススペシフィックパネルをかくす", "preload_images": "がぞうをさきよみする", "use_one_click_nsfw": "NSFWなファイルを1クリックでひらく", "hide_post_stats": "とうこうのとうけいをかくす (れい: おきにいりのかず)", "hide_user_stats": "ユーザーのとうけいをかくす (れい: フォロワーのかず)", "hide_filtered_statuses": "フィルターされたとうこうをかくす", + "import_blocks_from_a_csv_file": "CSVファイルからブロックをインポートする", "import_followers_from_a_csv_file": "CSVファイルからフォローをインポートする", "import_theme": "ロード", "inputRadius": "インプットフィールド", @@ -155,6 +210,7 @@ "lock_account_description": "あなたがみとめたひとだけ、あなたのアカウントをフォローできる", "loop_video": "ビデオをくりかえす", "loop_video_silent_only": "おとのないビデオだけくりかえす", + "mutes_tab": "ミュート", "play_videos_in_modal": "ビデオをメディアビューアーでみる", "use_contain_fit": "がぞうのサムネイルを、きりぬかない", "name": "なまえ", @@ -166,16 +222,18 @@ "notification_visibility_mentions": "メンション", "notification_visibility_repeats": "リピート", "no_rich_text_description": "リッチテキストをつかわない", + "no_blocks": "ブロックしていません", + "no_mutes": "ミュートしていません", "hide_follows_description": "フォローしているひとをみせない", "hide_followers_description": "フォロワーをみせない", - "show_admin_badge": "アドミンのしるしをみる", - "show_moderator_badge": "モデレーターのしるしをみる", + "show_admin_badge": "アドミンのしるしをみせる", + "show_moderator_badge": "モデレーターのしるしをみせる", "nsfw_clickthrough": "NSFWなファイルをかくす", "oauth_tokens": "OAuthトークン", "token": "トークン", - "refresh_token": "トークンを更新", - "valid_until": "まで有効", - "revoke_token": "取り消す", + "refresh_token": "トークンをリフレッシュ", + "valid_until": "おわりのとき", + "revoke_token": "とりけす", "panelRadius": "パネル", "pause_on_unfocused": "タブにフォーカスがないときストリーミングをとめる", "presets": "プリセット", @@ -188,10 +246,14 @@ "reply_visibility_all": "すべてのリプライをみる", "reply_visibility_following": "わたしにあてられたリプライと、フォローしているひとからのリプライをみる", "reply_visibility_self": "わたしにあてられたリプライをみる", + "autohide_floating_post_button": "あたらしいとうこうのボタンを、じどうてきにかくす (モバイル)", "saving_err": "せっていをセーブできませんでした", "saving_ok": "せっていをセーブしました", + "search_user_to_block": "ブロックしたいひとを、ここでけんさくできます", + "search_user_to_mute": "ミュートしたいひとを、ここでけんさくできます", "security_tab": "セキュリティ", "scope_copy": "リプライするとき、こうかいはんいをコピーする (DMのこうかいはんいは、つねにコピーされます)", + "minimal_scopes_mode": "こうかいはんいせんたくオプションを、ちいさくする", "set_new_avatar": "あたらしいアバターをせっていする", "set_new_profile_background": "あたらしいプロフィールのバックグラウンドをせっていする", "set_new_profile_banner": "あたらしいプロフィールバナーを設定する", @@ -209,6 +271,7 @@ "theme_help": "カラーテーマをカスタマイズできます", "theme_help_v2_1": "チェックボックスをONにすると、コンポーネントごとに、いろと、とうめいどを、オーバーライドできます。「すべてクリア」ボタンをおすと、すべてのオーバーライドを、やめます。", "theme_help_v2_2": "バックグラウンドとテキストのコントラストをあらわすアイコンがあります。マウスをホバーすると、くわしいせつめいがでます。とうめいないろをつかっているときは、もっともわるいばあいのコントラストがしめされます。", + "upload_a_photo": "がぞうをアップロード", "tooltipRadius": "ツールチップとアラート", "user_settings": "ユーザーせってい", "values": { @@ -216,6 +279,13 @@ "true": "はい" }, "notifications": "つうち", + "notification_setting": "つうちをうけとる:", + "notification_setting_follows": "あなたがフォローしているひとから", + "notification_setting_non_follows": "あなたがフォローしていないひとから", + "notification_setting_followers": "あなたをフォローしているひとから", + "notification_setting_non_followers": "あなたをフォローしていないひとから", + "notification_mutes": "あるユーザーからのつうちをとめるには、ミュートしてください。", + "notification_blocks": "ブロックしているユーザーからのつうちは、すべてとまります。", "enable_web_push_notifications": "ウェブプッシュつうちをゆるす", "style": { "switcher": { @@ -325,6 +395,11 @@ "checkbox": "りようきやくを、よみました", "link": "ハイパーリンク" } + }, + "version": { + "title": "バージョン", + "backend_version": "バックエンドのバージョン", + "frontend_version": "フロントエンドのバージョン" } }, "timeline": { @@ -336,7 +411,19 @@ "repeated": "リピート", "show_new": "よみこみ", "up_to_date": "さいしん", - "no_more_statuses": "これでおわりです" + "no_more_statuses": "これでおわりです", + "no_statuses": "ありません" + }, + "status": { + "favorites": "おきにいり", + "repeats": "リピート", + "delete": "ステータスをけす", + "pin": "プロフィールにピンどめする", + "unpin": "プロフィールにピンどめするのをやめる", + "pinned": "ピンどめ", + "delete_confirm": "ほんとうに、このステータスを、けしてもいいですか?", + "reply_to": "へんしん:", + "replies_list": "へんしん:" }, "user_card": { "approve": "うけいれ", @@ -359,10 +446,47 @@ "muted": "ミュートしています!", "per_day": "/日", "remote_follow": "リモートフォロー", - "statuses": "ステータス" + "report": "つうほう", + "statuses": "ステータス", + "unblock": "ブロックをやめる", + "unblock_progress": "ブロックをとりけしています...", + "block_progress": "ブロックしています...", + "unmute": "ミュートをやめる", + "unmute_progress": "ミュートをとりけしています...", + "mute_progress": "ミュートしています...", + "admin_menu": { + "moderation": "モデレーション", + "grant_admin": "アドミンにする", + "revoke_admin": "アドミンをやめさせる", + "grant_moderator": "モデレーターにする", + "revoke_moderator": "モデレーターをやめさせる", + "activate_account": "アカウントをアクティブにする", + "deactivate_account": "アカウントをアクティブでなくする", + "delete_account": "アカウントをけす", + "force_nsfw": "すべてのとうこうをNSFWにする", + "strip_media": "とうこうからメディアをなくす", + "force_unlisted": "とうこうをアンリステッドにする", + "sandbox": "とうこうをフォロワーのみにする", + "disable_remote_subscription": "ほかのインスタンスからフォローされないようにする", + "disable_any_subscription": "フォローされないようにする", + "quarantine": "ほかのインスタンスのユーザーのとうこうをとめる", + "delete_user": "ユーザーをけす", + "delete_user_confirmation": "あなたは、ほんとうに、きはたしかですか? これは、とりけすことが、できません。" + } }, "user_profile": { - "timeline_title": "ユーザータイムライン" + "timeline_title": "ユーザータイムライン", + "profile_does_not_exist": "ごめんなさい。このプロフィールは、そんざいしません。", + "profile_loading_error": "ごめんなさい。プロフィールのロードがエラーになりました。" + }, + "user_reporting": { + "title": "つうほうする: {0}", + "add_comment_description": "このつうほうは、あなたのインスタンスのモデレーターに、おくられます。このアカウントを、つうほうするりゆうを、せつめいすることができます:", + "additional_comments": "ついかのコメント", + "forward_description": "このアカウントは、ほかのインスタンスのものです。そのインスタンスにも、このつうほうのコピーを、おくりますか?", + "forward_to": "コピーをおくる: {0}", + "submit": "そうしん", + "generic_error": "あなたのリクエストをうけつけようとしましたが、エラーになってしまいました。" }, "who_to_follow": { "more": "くわしく", diff --git a/src/i18n/ja_pedantic.json b/src/i18n/ja_pedantic.json new file mode 100644 index 00000000..9036baf5 --- /dev/null +++ b/src/i18n/ja_pedantic.json @@ -0,0 +1,516 @@ +{ + "chat": { + "title": "チャット" + }, + "exporter": { + "export": "エクスポート", + "processing": "処理中です。処理が完了すると、ファイルをダウンロードするよう指示があります。" + }, + "features_panel": { + "chat": "チャット", + "gopher": "Gopher", + "media_proxy": "メディアプロクシ", + "scope_options": "公開範囲選択", + "text_limit": "文字の数", + "title": "有効な機能", + "who_to_follow": "おすすめユーザー" + }, + "finder": { + "error_fetching_user": "ユーザー検索がエラーになりました。", + "find_user": "ユーザーを探す" + }, + "general": { + "apply": "適用", + "submit": "送信", + "more": "続き", + "generic_error": "エラーになりました", + "optional": "省略可", + "show_more": "もっと見る", + "show_less": "たたむ", + "cancel": "キャンセル" + }, + "image_cropper": { + "crop_picture": "画像を切り抜く", + "save": "保存", + "save_without_cropping": "切り抜かずに保存", + "cancel": "キャンセル" + }, + "importer": { + "submit": "送信", + "success": "正常にインポートされました。", + "error": "このファイルをインポートするとき、エラーが発生しました。" + }, + "login": { + "login": "ログイン", + "description": "OAuthでログイン", + "logout": "ログアウト", + "password": "パスワード", + "placeholder": "例: lain", + "register": "登録", + "username": "ユーザー名", + "hint": "会話に加わるには、ログインしてください" + }, + "media_modal": { + "previous": "前", + "next": "次" + }, + "nav": { + "about": "このインスタンスについて", + "back": "戻る", + "chat": "ローカルチャット", + "friend_requests": "フォローリクエスト", + "mentions": "通知", + "interactions": "インタラクション", + "dms": "ダイレクトメッセージ", + "public_tl": "パブリックタイムライン", + "timeline": "タイムライン", + "twkn": "接続しているすべてのネットワーク", + "user_search": "ユーザーを探す", + "who_to_follow": "おすすめユーザー", + "preferences": "設定" + }, + "notifications": { + "broken_favorite": "ステータスが見つかりません。探しています...", + "favorited_you": "あなたのステータスがお気に入りされました", + "followed_you": "フォローされました", + "load_older": "古い通知をみる", + "notifications": "通知", + "read": "読んだ!", + "repeated_you": "あなたのステータスがリピートされました", + "no_more_notifications": "通知はありません" + }, + "interactions": { + "favs_repeats": "リピートとお気に入り", + "follows": "新しいフォロワー", + "load_older": "古いインタラクションを見る" + }, + "post_status": { + "new_status": "投稿する", + "account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、誰でも、フォロワー限定のステータスを読むことができます。", + "account_not_locked_warning_link": "ロックされたアカウント", + "attachments_sensitive": "ファイルをNSFWにする", + "content_type": { + "text/plain": "プレーンテキスト", + "text/html": "HTML", + "text/markdown": "Markdown", + "text/bbcode": "BBCode" + }, + "content_warning": "説明 (省略可)", + "default": "羽田空港に着きました。", + "direct_warning_to_all": "この投稿は、メンションされたすべてのユーザーが、見ることができます。", + "direct_warning_to_first_only": "この投稿は、メッセージの冒頭でメンションされたユーザーだけが、見ることができます。", + "direct_warning": "このステータスは、メンションされたユーザーだけが、読むことができます。", + "posting": "投稿", + "scope_notice": { + "public": "この投稿は、誰でも見ることができます", + "private": "この投稿は、あなたのフォロワーだけが、見ることができます。", + "unlisted": "この投稿は、パブリックタイムラインと、接続しているすべてのネットワークには、表示されません。" + }, + "scope": { + "direct": "ダイレクト: メンションされたユーザーのみに届きます。", + "private": "フォロワーげんてい: フォロワーのみに届きます。", + "public": "パブリック: パブリックタイムラインに届きます。", + "unlisted": "アンリステッド: パブリックタイムラインに届きません。" + } + }, + "registration": { + "bio": "プロフィール", + "email": "Eメール", + "fullname": "スクリーンネーム", + "password_confirm": "パスワードの確認", + "registration": "登録", + "token": "招待トークン", + "captcha": "CAPTCHA", + "new_captcha": "文字が読めないときは、画像をクリックすると、新しい画像になります", + "username_placeholder": "例: lain", + "fullname_placeholder": "例: 岩倉玲音", + "bio_placeholder": "例:\nこんにちは。私は玲音。\n私はアニメのキャラクターで、日本の郊外に住んでいます。私をWiredで見たことがあるかもしれません。", + "validations": { + "username_required": "必須", + "fullname_required": "必須", + "email_required": "必須", + "password_required": "必須", + "password_confirmation_required": "必須", + "password_confirmation_match": "パスワードが違います" + } + }, + "selectable_list": { + "select_all": "すべて選択" + }, + "settings": { + "app_name": "アプリの名称", + "attachmentRadius": "ファイル", + "attachments": "ファイル", + "autoload": "下にスクロールしたとき、自動的に読み込む。", + "avatar": "アバター", + "avatarAltRadius": "通知のアバター", + "avatarRadius": "アバター", + "background": "バックグラウンド", + "bio": "プロフィール", + "block_export": "ブロックのエクスポート", + "block_export_button": "ブロックをCSVファイルにエクスポートする", + "block_import": "ブロックのインポート", + "block_import_error": "ブロックのインポートに失敗しました", + "blocks_imported": "ブロックをインポートしました! 実際に処理されるまでに、しばらく時間がかかります。", + "blocks_tab": "ブロック", + "btnRadius": "ボタン", + "cBlue": "返信とフォロー", + "cGreen": "リピート", + "cOrange": "お気に入り", + "cRed": "キャンセル", + "change_password": "パスワードを変える", + "change_password_error": "パスワードを変えることが、できなかったかもしれません。", + "changed_password": "パスワードが、変わりました!", + "collapse_subject": "説明のある投稿をたたむ", + "composing": "投稿", + "confirm_new_password": "新しいパスワードの確認", + "current_avatar": "現在のアバター", + "current_password": "現在のパスワード", + "current_profile_banner": "現在のプロフィールバナー", + "data_import_export_tab": "インポートとエクスポート", + "default_vis": "デフォルトの公開範囲", + "delete_account": "アカウントを消す", + "delete_account_description": "あなたのアカウントとメッセージが、消えます。", + "delete_account_error": "アカウントを消すことが、できなかったかもしれません。インスタンスの管理者に、連絡してください。", + "delete_account_instructions": "本当にアカウントを消してもいいなら、パスワードを入力してください。", + "avatar_size_instruction": "アバターの大きさは、150×150ピクセルか、それよりも大きくするといいです。", + "export_theme": "保存", + "filtering": "フィルタリング", + "filtering_explanation": "これらの言葉を含むすべてのものがミュートされます。1行に1つの言葉を書いてください。", + "follow_export": "フォローのエクスポート", + "follow_export_button": "エクスポート", + "follow_export_processing": "お待ちください。まもなくファイルをダウンロードできます。", + "follow_import": "フォローのインポート", + "follow_import_error": "フォローのインポートがエラーになりました。", + "follows_imported": "フォローがインポートされました! 少し時間がかかるかもしれません。", + "foreground": "フォアグラウンド", + "general": "全般", + "hide_attachments_in_convo": "スレッドのファイルを隠す", + "hide_attachments_in_tl": "タイムラインのファイルを隠す", + "hide_muted_posts": "ミュートしているユーザーの投稿を隠す", + "max_thumbnails": "投稿に含まれるサムネイルの最大数", + "hide_isp": "インスタンス固有パネルを隠す", + "preload_images": "画像を先読みする", + "use_one_click_nsfw": "NSFWなファイルを1クリックで開く", + "hide_post_stats": "投稿の統計を隠す (例: お気に入りの数)", + "hide_user_stats": "ユーザーの統計を隠す (例: フォロワーの数)", + "hide_filtered_statuses": "フィルターされた投稿を隠す", + "import_blocks_from_a_csv_file": "CSVファイルからブロックをインポートする", + "import_followers_from_a_csv_file": "CSVファイルからフォローをインポートする", + "import_theme": "ロード", + "inputRadius": "インプットフィールド", + "checkboxRadius": "チェックボックス", + "instance_default": "(デフォルト: {value})", + "instance_default_simple": "(デフォルト)", + "interface": "インターフェース", + "interfaceLanguage": "インターフェースの言語", + "invalid_theme_imported": "このファイルはPleromaのテーマではありません。テーマは変更されませんでした。", + "limited_availability": "あなたのブラウザではできません", + "links": "リンク", + "lock_account_description": "あなたが認めた人だけ、あなたのアカウントをフォローできる", + "loop_video": "ビデオを繰り返す", + "loop_video_silent_only": "音のないビデオだけ繰り返す", + "mutes_tab": "ミュート", + "play_videos_in_modal": "ビデオをメディアビューアーで見る", + "use_contain_fit": "画像のサムネイルを、切り抜かない", + "name": "名前", + "name_bio": "名前とプロフィール", + "new_password": "新しいパスワード", + "notification_visibility": "表示する通知", + "notification_visibility_follows": "フォロー", + "notification_visibility_likes": "お気に入り", + "notification_visibility_mentions": "メンション", + "notification_visibility_repeats": "リピート", + "no_rich_text_description": "リッチテキストを使わない", + "no_blocks": "ブロックはありません", + "no_mutes": "ミュートはありません", + "hide_follows_description": "フォローしている人を見せない", + "hide_followers_description": "フォロワーを見せない", + "show_admin_badge": "管理者のバッジを見せる", + "show_moderator_badge": "モデレーターのバッジを見せる", + "nsfw_clickthrough": "NSFWなファイルを隠す", + "oauth_tokens": "OAuthトークン", + "token": "トークン", + "refresh_token": "トークンを更新", + "valid_until": "まで有効", + "revoke_token": "取り消す", + "panelRadius": "パネル", + "pause_on_unfocused": "タブにフォーカスがないときストリーミングを止める", + "presets": "プリセット", + "profile_background": "プロフィールのバックグラウンド", + "profile_banner": "プロフィールバナー", + "profile_tab": "プロフィール", + "radii_help": "インターフェースの丸さを設定する。", + "replies_in_timeline": "タイムラインのリプライ", + "reply_link_preview": "カーソルを重ねたとき、リプライのプレビューを見る", + "reply_visibility_all": "すべてのリプライを見る", + "reply_visibility_following": "私に宛てられたリプライと、フォローしている人からのリプライを見る", + "reply_visibility_self": "私に宛てられたリプライを見る", + "autohide_floating_post_button": "新しい投稿ボタンを自動的に隠す (モバイル)", + "saving_err": "設定を保存できませんでした", + "saving_ok": "設定を保存しました", + "search_user_to_block": "ブロックしたいユーザーを検索", + "search_user_to_mute": "ミュートしたいユーザーを検索", + "security_tab": "セキュリティ", + "scope_copy": "返信するとき、公開範囲をコピーする (DMの公開範囲は、常にコピーされます)", + "minimal_scopes_mode": "公開範囲選択オプションを最小にする", + "set_new_avatar": "新しいアバターを設定する", + "set_new_profile_background": "新しいプロフィールのバックグラウンドを設定する", + "set_new_profile_banner": "新しいプロフィールバナーを設定する", + "settings": "設定", + "subject_input_always_show": "サブジェクトフィールドをいつでも表示する", + "subject_line_behavior": "返信するときサブジェクトをコピーする", + "subject_line_email": "メール風: \"re: サブジェクト\"", + "subject_line_mastodon": "マストドン風: そのままコピー", + "subject_line_noop": "コピーしない", + "post_status_content_type": "投稿のコンテントタイプ", + "stop_gifs": "カーソルを重ねたとき、GIFを動かす", + "streaming": "上までスクロールしたとき、自動的にストリーミングする", + "text": "文字", + "theme": "テーマ", + "theme_help": "カラーテーマをカスタマイズできます", + "theme_help_v2_1": "チェックボックスをONにすると、コンポーネントごとに、色と透明度をオーバーライドできます。「すべてクリア」ボタンを押すと、すべてのオーバーライドをやめます。", + "theme_help_v2_2": "バックグラウンドとテキストのコントラストを表すアイコンがあります。マウスをホバーすると、詳しい説明が出ます。透明な色を使っているときは、最悪の場合のコントラストが示されます。", + "tooltipRadius": "ツールチップとアラート", + "upload_a_photo": "画像をアップロード", + "user_settings": "ユーザー設定", + "values": { + "false": "いいえ", + "true": "はい" + }, + "notifications": "通知", + "notification_setting": "通知を受け取る:", + "notification_setting_follows": "あなたがフォローしているユーザーから", + "notification_setting_non_follows": "あなたがフォローしていないユーザーから", + "notification_setting_followers": "あなたをフォローしているユーザーから", + "notification_setting_non_followers": "あなたをフォローしていないユーザーから", + "notification_mutes": "特定のユーザーからの通知を止めるには、ミュートしてください。", + "notification_blocks": "ブロックしているユーザーからの通知は、すべて止まります。", + "enable_web_push_notifications": "ウェブプッシュ通知を許可する", + "style": { + "switcher": { + "keep_color": "色を残す", + "keep_shadows": "影を残す", + "keep_opacity": "透明度を残す", + "keep_roundness": "丸さを残す", + "keep_fonts": "フォントを残す", + "save_load_hint": "「残す」オプションをONにすると、テーマを選んだときとロードしたとき、現在の設定を残します。また、テーマをエクスポートするとき、これらのオプションを維持します。すべてのチェックボックスをOFFにすると、テーマをエクスポートしたとき、すべての設定を保存します。", + "reset": "リセット", + "clear_all": "すべてクリア", + "clear_opacity": "透明度をクリア" + }, + "common": { + "color": "色", + "opacity": "透明度", + "contrast": { + "hint": "コントラストは {ratio} です。{level}。({context})", + "level": { + "aa": "AAレベルガイドライン (ミニマル) を満たします", + "aaa": "AAAレベルガイドライン (レコメンデッド) を満たします。", + "bad": "ガイドラインを満たしません。" + }, + "context": { + "18pt": "大きい (18ポイント以上) テキスト", + "text": "テキスト" + } + } + }, + "common_colors": { + "_tab_label": "共通", + "main": "共通の色", + "foreground_hint": "「詳細」タブで、もっと細かく設定できます", + "rgbo": "アイコンとアクセントとバッジ" + }, + "advanced_colors": { + "_tab_label": "詳細", + "alert": "アラートのバックグラウンド", + "alert_error": "エラー", + "badge": "バッジのバックグラウンド", + "badge_notification": "通知", + "panel_header": "パネルヘッダー", + "top_bar": "トップバー", + "borders": "境界", + "buttons": "ボタン", + "inputs": "インプットフィールド", + "faint_text": "薄いテキスト" + }, + "radii": { + "_tab_label": "丸さ" + }, + "shadows": { + "_tab_label": "光と影", + "component": "コンポーネント", + "override": "オーバーライド", + "shadow_id": "影 #{value}", + "blur": "ぼかし", + "spread": "広がり", + "inset": "内側", + "hint": "影の設定では、色の値として --variable を使うことができます。これはCSS3変数です。ただし、透明度の設定は、効かなくなります。", + "filter_hint": { + "always_drop_shadow": "ブラウザーがサポートしていれば、常に {0} が使われます。", + "drop_shadow_syntax": "{0} は、{1} パラメーターと {2} キーワードをサポートしていません。", + "avatar_inset": "内側の影と外側の影を同時に使うと、透明なアバターの表示が乱れます。", + "spread_zero": "広がりが 0 よりも大きな影は、0 と同じです。", + "inset_classic": "内側の影は {0} を使います。" + }, + "components": { + "panel": "パネル", + "panelHeader": "パネルヘッダー", + "topBar": "トップバー", + "avatar": "ユーザーアバター (プロフィール)", + "avatarStatus": "ユーザーアバター (投稿)", + "popup": "ポップアップとツールチップ", + "button": "ボタン", + "buttonHover": "ボタン (ホバー)", + "buttonPressed": "ボタン (押されているとき)", + "buttonPressedHover": "ボタン (ホバー、かつ、押されているとき)", + "input": "インプットフィールド" + } + }, + "fonts": { + "_tab_label": "フォント", + "help": "「カスタム」を選んだときは、システムにあるフォントの名前を、正しく入力してください。", + "components": { + "interface": "インターフェース", + "input": "インプットフィールド", + "post": "投稿", + "postCode": "等幅 (投稿がリッチテキストであるとき)" + }, + "family": "フォント名", + "size": "大きさ (px)", + "weight": "太さ", + "custom": "カスタム" + }, + "preview": { + "header": "プレビュー", + "content": "本文", + "error": "エラーの例", + "button": "ボタン", + "text": "これは{0}と{1}の例です。", + "mono": "monospace", + "input": "羽田空港に着きました。", + "faint_link": "とても助けになるマニュアル", + "fine_print": "私たちの{0}を、読まないでください!", + "header_faint": "エラーではありません", + "checkbox": "利用規約を読みました", + "link": "ハイパーリンク" + } + }, + "version": { + "title": "バージョン", + "backend_version": "バックエンドのバージョン", + "frontend_version": "フロントエンドのバージョン" + } + }, + "timeline": { + "collapse": "たたむ", + "conversation": "スレッド", + "error_fetching": "読み込みがエラーになりました", + "load_older": "古いステータス", + "no_retweet_hint": "投稿を「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります", + "repeated": "リピート", + "show_new": "読み込み", + "up_to_date": "最新", + "no_more_statuses": "これで終わりです", + "no_statuses": "ステータスはありません" + }, + "status": { + "favorites": "お気に入り", + "repeats": "リピート", + "delete": "ステータスを削除", + "pin": "プロフィールにピン留め", + "unpin": "プロフィールのピン留めを外す", + "pinned": "ピン留め", + "delete_confirm": "本当にこのステータスを削除してもよろしいですか?", + "reply_to": "返信", + "replies_list": "返信:" + }, + "user_card": { + "approve": "受け入れ", + "block": "ブロック", + "blocked": "ブロックしています!", + "deny": "お断り", + "favorites": "お気に入り", + "follow": "フォロー", + "follow_sent": "リクエストを送りました!", + "follow_progress": "リクエストしています…", + "follow_again": "再びリクエストを送りますか?", + "follow_unfollow": "フォローをやめる", + "followees": "フォロー", + "followers": "フォロワー", + "following": "フォローしています!", + "follows_you": "フォローされました!", + "its_you": "これはあなたです!", + "media": "メディア", + "mute": "ミュート", + "muted": "ミュートしています!", + "per_day": "/日", + "remote_follow": "リモートフォロー", + "report": "通報", + "statuses": "ステータス", + "unblock": "ブロック解除", + "unblock_progress": "ブロックを解除しています...", + "block_progress": "ブロックしています...", + "unmute": "ミュート解除", + "unmute_progress": "ミュートを解除しています...", + "mute_progress": "ミュートしています...", + "admin_menu": { + "moderation": "モデレーション", + "grant_admin": "管理者権限を付与", + "revoke_admin": "管理者権限を解除", + "grant_moderator": "モデレーター権限を付与", + "revoke_moderator": "モデレーター権限を解除", + "activate_account": "アカウントをアクティブにする", + "deactivate_account": "アカウントをアクティブでなくする", + "delete_account": "アカウントを削除", + "force_nsfw": "すべての投稿をNSFWにする", + "strip_media": "投稿からメディアを除去する", + "force_unlisted": "投稿を未収載にする", + "sandbox": "投稿をフォロワーのみにする", + "disable_remote_subscription": "他のインスタンスからフォローされないようにする", + "disable_any_subscription": "フォローされないようにする", + "quarantine": "他のインスタンスからの投稿を止める", + "delete_user": "ユーザーを削除", + "delete_user_confirmation": "あなたの精神状態に何か問題はございませんか? この操作を取り消すことはできません。" + } + }, + "user_profile": { + "timeline_title": "ユーザータイムライン", + "profile_does_not_exist": "申し訳ない。このプロフィールは存在しません。", + "profile_loading_error": "申し訳ない。プロフィールの読み込みがエラーになりました。" + }, + "user_reporting": { + "title": "通報する: {0}", + "add_comment_description": "この通報は、あなたのインスタンスのモデレーターに送られます。このアカウントを通報する理由を説明することができます:", + "additional_comments": "追加のコメント", + "forward_description": "このアカウントは他のサーバーに置かれています。この通報のコピーをリモートのサーバーに送りますか?", + "forward_to": "転送する: {0}", + "submit": "送信", + "generic_error": "あなたのリクエストを処理しようとしましたが、エラーになりました。" + }, + "who_to_follow": { + "more": "詳細", + "who_to_follow": "おすすめユーザー" + }, + "tool_tip": { + "media_upload": "メディアをアップロード", + "repeat": "リピート", + "reply": "返信", + "favorite": "お気に入り", + "user_settings": "ユーザー設定" + }, + "upload":{ + "error": { + "base": "アップロードに失敗しました。", + "file_too_big": "ファイルが大きすぎます [{filesize} {filesizeunit} / {allowedsize} {allowedsizeunit}]", + "default": "しばらくしてから試してください" + }, + "file_size_units": { + "B": "B", + "KiB": "KiB", + "MiB": "MiB", + "GiB": "GiB", + "TiB": "TiB" + } + } +} diff --git a/src/i18n/messages.js b/src/i18n/messages.js index ab697948..404a4079 100644 --- a/src/i18n/messages.js +++ b/src/i18n/messages.js @@ -23,6 +23,7 @@ const messages = { hu: require('./hu.json'), it: require('./it.json'), ja: require('./ja.json'), + ja_pedantic: require('./ja_pedantic.json'), ko: require('./ko.json'), nb: require('./nb.json'), nl: require('./nl.json'), diff --git a/src/main.js b/src/main.js index 92f843b1..e12db6a3 100644 --- a/src/main.js +++ b/src/main.js @@ -24,6 +24,7 @@ import messages from './i18n/messages.js' import VueChatScroll from 'vue-chat-scroll' import VueClickOutside from 'v-click-outside' +import PortalVue from 'portal-vue' import afterStoreSetup from './boot/after_store.js' @@ -42,6 +43,7 @@ Vue.use(VueTimeago, { Vue.use(VueI18n) Vue.use(VueChatScroll) Vue.use(VueClickOutside) +Vue.use(PortalVue) const i18n = new VueI18n({ // By default, use the browser locale, we will update it if neccessary diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 559eb25d..7ffc8ff1 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -1,5 +1,4 @@ /* eslint-env browser */ -const LOGIN_URL = '/api/account/verify_credentials.json' const BG_UPDATE_URL = '/api/qvitter/update_background_image.json' const EXTERNAL_PROFILE_URL = '/api/externalprofile/show.json' const QVITTER_USER_NOTIFICATIONS_READ_URL = '/api/qvitter/statuses/notifications/read.json' @@ -15,7 +14,9 @@ const PERMISSION_GROUP_URL = (screenName, right) => `/api/pleroma/admin/users/${ const ACTIVATION_STATUS_URL = screenName => `/api/pleroma/admin/users/${screenName}/activation_status` const ADMIN_USERS_URL = '/api/pleroma/admin/users' const SUGGESTIONS_URL = '/api/v1/suggestions' +const NOTIFICATION_SETTINGS_URL = '/api/pleroma/notification_settings' +const MASTODON_LOGIN_URL = '/api/v1/accounts/verify_credentials' const MASTODON_REGISTRATION_URL = '/api/v1/accounts' const MASTODON_USER_FAVORITES_TIMELINE_URL = '/api/v1/favourites' const MASTODON_USER_NOTIFICATIONS_URL = '/api/v1/notifications' @@ -97,6 +98,21 @@ const promisedRequest = ({ method, url, payload, credentials, headers = {} }) => }) } +const updateNotificationSettings = ({credentials, settings}) => { + const form = new FormData() + + each(settings, (value, key) => { + form.append(key, value) + }) + + return fetch(NOTIFICATION_SETTINGS_URL, { + headers: authHeaders(credentials), + method: 'PUT', + body: form + }) + .then((data) => data.json()) +} + const updateAvatar = ({credentials, avatar}) => { const form = new FormData() form.append('avatar', avatar) @@ -507,8 +523,7 @@ const fetchPinnedStatuses = ({ id, credentials }) => { } const verifyCredentials = (user) => { - return fetch(LOGIN_URL, { - method: 'POST', + return fetch(MASTODON_LOGIN_URL, { headers: authHeaders(user) }) .then((response) => { @@ -520,6 +535,7 @@ const verifyCredentials = (user) => { } } }) + .then((data) => data.error ? data : parseUser(data)) } @@ -777,7 +793,8 @@ const apiService = { markNotificationsAsSeen, fetchFavoritedByUsers, fetchRebloggedByUsers, - reportUser + reportUser, + updateNotificationSettings } export default apiService diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index 3d6edfc3..09bc6168 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -87,6 +87,10 @@ const backendInteractorService = (credentials) => { return apiService.deleteUser({screen_name, credentials}) } + const updateNotificationSettings = ({settings}) => { + return apiService.updateNotificationSettings({credentials, settings}) + } + const fetchMutes = () => apiService.fetchMutes({credentials}) const muteUser = (id) => apiService.muteUser({credentials, id}) const unmuteUser = (id) => apiService.unmuteUser({credentials, id}) @@ -171,7 +175,8 @@ const backendInteractorService = (credentials) => { favorite, unfavorite, retweet, - unretweet + unretweet, + updateNotificationSettings } return backendInteractorServiceInstance diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 46ca7602..0e55ed2a 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -33,6 +33,7 @@ export const parseUser = (data) => { if (masto) { output.screen_name = data.acct + output.statusnet_profile_url = data.url // There's nothing else to get if (mastoShort) { @@ -42,7 +43,7 @@ export const parseUser = (data) => { output.name = data.display_name output.name_html = addEmojis(data.display_name, data.emojis) - // output.description = ??? missing + output.description = data.note output.description_html = addEmojis(data.note, data.emojis) // Utilize avatar_static for gif avatars? @@ -56,8 +57,6 @@ export const parseUser = (data) => { output.bot = data.bot - output.statusnet_profile_url = data.url - if (data.pleroma) { const relationship = data.pleroma.relationship @@ -72,6 +71,23 @@ export const parseUser = (data) => { moderator: data.pleroma.is_moderator, admin: data.pleroma.is_admin } + // TODO: Clean up in UI? This is duplication from what BE does for qvitterapi + if (output.rights.admin) { + output.role = 'admin' + } else if (output.rights.moderator) { + output.role = 'moderator' + } else { + output.role = 'member' + } + } + + if (data.source) { + output.description = data.source.note + output.default_scope = data.source.privacy + if (data.source.pleroma) { + output.no_rich_text = data.source.pleroma.no_rich_text + output.show_role = data.source.pleroma.show_role + } } // TODO: handle is_local @@ -106,8 +122,6 @@ export const parseUser = (data) => { output.muted = data.muted - // QVITTER ONLY FOR NOW - // Really only applies to logged in user, really.. I THINK if (data.rights) { output.rights = { moderator: data.rights.delete_others_notice, @@ -135,15 +149,16 @@ export const parseUser = (data) => { if (data.pleroma) { output.follow_request_count = data.pleroma.follow_request_count - } - if (data.pleroma) { output.tags = data.pleroma.tags output.deactivated = data.pleroma.deactivated + + output.notification_settings = data.pleroma.notification_settings } output.tags = output.tags || [] output.rights = output.rights || {} + output.notification_settings = output.notification_settings || {} return output } |
