aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShpuld Shpludson <shp@cock.li>2020-12-01 10:47:10 +0000
committerShpuld Shpludson <shp@cock.li>2020-12-01 10:47:10 +0000
commit655d985a82d194cd38c5ec75f1b0153804965d5f (patch)
tree72b48d63177d9731edec0a3d5793683012ffd6fe /src
parent276ef31145c4f485c0b899f5243c49e2cbf80cc1 (diff)
parent133294dc2aa56927097e7641dec7f15ad9179d80 (diff)
Merge branch 'develop' into 'fix/use-semantically-correct-buttons'
# Conflicts: # CHANGELOG.md
Diffstat (limited to 'src')
-rw-r--r--src/components/emoji_input/emoji_input.js35
-rw-r--r--src/components/emoji_input/emoji_input.vue2
-rw-r--r--src/components/emoji_input/suggestor.js140
-rw-r--r--src/components/post_status_form/post_status_form.js3
-rw-r--r--src/components/settings_modal/tabs/profile_tab.js8
-rw-r--r--src/i18n/eo.json32
-rw-r--r--src/i18n/es.json12
-rw-r--r--src/i18n/he.json8
-rw-r--r--src/i18n/it.json9
-rw-r--r--src/i18n/ru.json15
-rw-r--r--src/i18n/uk.json99
-rw-r--r--src/i18n/zh.json10
12 files changed, 259 insertions, 114 deletions
diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js
index 87303d08..2068a598 100644
--- a/src/components/emoji_input/emoji_input.js
+++ b/src/components/emoji_input/emoji_input.js
@@ -114,7 +114,8 @@ const EmojiInput = {
showPicker: false,
temporarilyHideSuggestions: false,
keepOpen: false,
- disableClickOutside: false
+ disableClickOutside: false,
+ suggestions: []
}
},
components: {
@@ -124,21 +125,6 @@ const EmojiInput = {
padEmoji () {
return this.$store.getters.mergedConfig.padEmoji
},
- suggestions () {
- const firstchar = this.textAtCaret.charAt(0)
- if (this.textAtCaret === firstchar) { return [] }
- const matchedSuggestions = this.suggest(this.textAtCaret)
- if (matchedSuggestions.length <= 0) {
- return []
- }
- return take(matchedSuggestions, 5)
- .map(({ imageUrl, ...rest }, index) => ({
- ...rest,
- // eslint-disable-next-line camelcase
- img: imageUrl || '',
- highlighted: index === this.highlighted
- }))
- },
showSuggestions () {
return this.focused &&
this.suggestions &&
@@ -188,6 +174,23 @@ const EmojiInput = {
watch: {
showSuggestions: function (newValue) {
this.$emit('shown', newValue)
+ },
+ textAtCaret: async function (newWord) {
+ const firstchar = newWord.charAt(0)
+ this.suggestions = []
+ if (newWord === firstchar) return
+ const matchedSuggestions = await this.suggest(newWord)
+ // Async: cancel if textAtCaret has changed during wait
+ if (this.textAtCaret !== newWord) return
+ if (matchedSuggestions.length <= 0) return
+ this.suggestions = take(matchedSuggestions, 5)
+ .map(({ imageUrl, ...rest }) => ({
+ ...rest,
+ img: imageUrl || ''
+ }))
+ },
+ suggestions (newValue) {
+ this.$nextTick(this.resize)
}
},
methods: {
diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue
index d308bf86..4becdc41 100644
--- a/src/components/emoji_input/emoji_input.vue
+++ b/src/components/emoji_input/emoji_input.vue
@@ -37,7 +37,7 @@
v-for="(suggestion, index) in suggestions"
:key="index"
class="autocomplete-item"
- :class="{ highlighted: suggestion.highlighted }"
+ :class="{ highlighted: index === highlighted }"
@click.stop.prevent="onClick($event, suggestion)"
>
<span class="image">
diff --git a/src/components/emoji_input/suggestor.js b/src/components/emoji_input/suggestor.js
index 8330345b..14a2b41e 100644
--- a/src/components/emoji_input/suggestor.js
+++ b/src/components/emoji_input/suggestor.js
@@ -1,4 +1,3 @@
-import { debounce } from 'lodash'
/**
* suggest - generates a suggestor function to be used by emoji-input
* data: object providing source information for specific types of suggestions:
@@ -11,19 +10,19 @@ import { debounce } from 'lodash'
* doesn't support user linking you can just provide only emoji.
*/
-const debounceUserSearch = debounce((data, input) => {
- data.updateUsersList(input)
-}, 500)
-
-export default data => input => {
- const firstChar = input[0]
- if (firstChar === ':' && data.emoji) {
- return suggestEmoji(data.emoji)(input)
- }
- if (firstChar === '@' && data.users) {
- return suggestUsers(data)(input)
+export default data => {
+ const emojiCurry = suggestEmoji(data.emoji)
+ const usersCurry = data.store && suggestUsers(data.store)
+ return input => {
+ const firstChar = input[0]
+ if (firstChar === ':' && data.emoji) {
+ return emojiCurry(input)
+ }
+ if (firstChar === '@' && usersCurry) {
+ return usersCurry(input)
+ }
+ return []
}
- return []
}
export const suggestEmoji = emojis => input => {
@@ -57,50 +56,75 @@ export const suggestEmoji = emojis => input => {
})
}
-export const suggestUsers = data => input => {
- const noPrefix = input.toLowerCase().substr(1)
- const users = data.users
-
- const newUsers = users.filter(
- user =>
- user.screen_name.toLowerCase().startsWith(noPrefix) ||
- user.name.toLowerCase().startsWith(noPrefix)
-
- /* taking only 20 results so that sorting is a bit cheaper, we display
- * only 5 anyway. could be inaccurate, but we ideally we should query
- * backend anyway
- */
- ).slice(0, 20).sort((a, b) => {
- let aScore = 0
- let bScore = 0
-
- // Matches on screen name (i.e. user@instance) makes a priority
- aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
- bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
-
- // Matches on name takes second priority
- aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
- bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
-
- const diff = (bScore - aScore) * 10
-
- // Then sort alphabetically
- const nameAlphabetically = a.name > b.name ? 1 : -1
- const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
-
- return diff + nameAlphabetically + screenNameAlphabetically
- /* eslint-disable camelcase */
- }).map(({ screen_name, name, profile_image_url_original }) => ({
- displayText: screen_name,
- detailText: name,
- imageUrl: profile_image_url_original,
- replacement: '@' + screen_name + ' '
- }))
-
- // BE search users to get more comprehensive results
- if (data.updateUsersList) {
- debounceUserSearch(data, noPrefix)
+export const suggestUsers = ({ dispatch, state }) => {
+ // Keep some persistent values in closure, most importantly for the
+ // custom debounce to work. Lodash debounce does not return a promise.
+ let suggestions = []
+ let previousQuery = ''
+ let timeout = null
+ let cancelUserSearch = null
+
+ const userSearch = (query) => dispatch('searchUsers', { query })
+ const debounceUserSearch = (query) => {
+ cancelUserSearch && cancelUserSearch()
+ return new Promise((resolve, reject) => {
+ timeout = setTimeout(() => {
+ userSearch(query).then(resolve).catch(reject)
+ }, 300)
+ cancelUserSearch = () => {
+ clearTimeout(timeout)
+ resolve([])
+ }
+ })
+ }
+
+ return async input => {
+ const noPrefix = input.toLowerCase().substr(1)
+ if (previousQuery === noPrefix) return suggestions
+
+ suggestions = []
+ previousQuery = noPrefix
+ // Fetch more and wait, don't fetch if there's the 2nd @ because
+ // the backend user search can't deal with it.
+ // Reference semantics make it so that we get the updated data after
+ // the await.
+ if (!noPrefix.includes('@')) {
+ await debounceUserSearch(noPrefix)
+ }
+
+ const newSuggestions = state.users.users.filter(
+ user =>
+ user.screen_name.toLowerCase().startsWith(noPrefix) ||
+ user.name.toLowerCase().startsWith(noPrefix)
+ ).slice(0, 20).sort((a, b) => {
+ let aScore = 0
+ let bScore = 0
+
+ // Matches on screen name (i.e. user@instance) makes a priority
+ aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
+ bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0
+
+ // Matches on name takes second priority
+ aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
+ bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0
+
+ const diff = (bScore - aScore) * 10
+
+ // Then sort alphabetically
+ const nameAlphabetically = a.name > b.name ? 1 : -1
+ const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
+
+ return diff + nameAlphabetically + screenNameAlphabetically
+ /* eslint-disable camelcase */
+ }).map(({ screen_name, name, profile_image_url_original }) => ({
+ displayText: screen_name,
+ detailText: name,
+ imageUrl: profile_image_url_original,
+ replacement: '@' + screen_name + ' '
+ }))
+ /* eslint-enable camelcase */
+
+ suggestions = newSuggestions || []
+ return suggestions
}
- return newUsers
- /* eslint-enable camelcase */
}
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
index 3ff4a3c8..4148381c 100644
--- a/src/components/post_status_form/post_status_form.js
+++ b/src/components/post_status_form/post_status_form.js
@@ -159,8 +159,7 @@ const PostStatusForm = {
...this.$store.state.instance.emoji,
...this.$store.state.instance.customEmoji
],
- users: this.$store.state.users.users,
- updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })
+ store: this.$store
})
},
emojiSuggestor () {
diff --git a/src/components/settings_modal/tabs/profile_tab.js b/src/components/settings_modal/tabs/profile_tab.js
index a3e4feaf..a4fed629 100644
--- a/src/components/settings_modal/tabs/profile_tab.js
+++ b/src/components/settings_modal/tabs/profile_tab.js
@@ -68,8 +68,7 @@ const ProfileTab = {
...this.$store.state.instance.emoji,
...this.$store.state.instance.customEmoji
],
- users: this.$store.state.users.users,
- updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })
+ store: this.$store
})
},
emojiSuggestor () {
@@ -79,10 +78,7 @@ const ProfileTab = {
] })
},
userSuggestor () {
- return suggestor({
- users: this.$store.state.users.users,
- updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })
- })
+ return suggestor({ store: this.$store })
},
fieldsLimits () {
return this.$store.state.instance.fieldsLimits
diff --git a/src/i18n/eo.json b/src/i18n/eo.json
index 1247d50d..b0a15cfe 100644
--- a/src/i18n/eo.json
+++ b/src/i18n/eo.json
@@ -134,14 +134,14 @@
"registration": {
"bio": "Priskribo",
"email": "Retpoŝtadreso",
- "fullname": "Vidiga nomo",
+ "fullname": "Prezenta nomo",
"password_confirm": "Konfirmo de pasvorto",
"registration": "Registriĝo",
"token": "Invita ĵetono",
"captcha": "TESTO DE HOMECO",
"new_captcha": "Klaku la bildon por akiri novan teston",
"username_placeholder": "ekz. lain",
- "fullname_placeholder": "ekz. Lain Iwakura",
+ "fullname_placeholder": "ekz. Lain Ivakura",
"bio_placeholder": "ekz.\nSaluton, mi estas Lain.\nMi estas animea knabino vivanta en Japanujo. Eble vi konas min pro la retejo « Wired ».",
"validations": {
"username_required": "ne povas resti malplena",
@@ -164,7 +164,7 @@
"blocks_tab": "Blokitoj",
"btnRadius": "Butonoj",
"cBlue": "Blua (respondi, aboni)",
- "cGreen": "Verda (kunhavigi)",
+ "cGreen": "Verda (diskonigi)",
"cOrange": "Oranĝa (ŝati)",
"cRed": "Ruĝa (nuligi)",
"change_password": "Ŝanĝi pasvorton",
@@ -207,8 +207,8 @@
"import_theme": "Enlegi antaŭagordojn",
"inputRadius": "Enigaj kampoj",
"checkboxRadius": "Markbutonoj",
- "instance_default": "(implicita: {value})",
- "instance_default_simple": "(implicita)",
+ "instance_default": "(originale: {value})",
+ "instance_default_simple": "(originale)",
"interface": "Fasado",
"interfaceLanguage": "Lingvo de fasado",
"invalid_theme_imported": "La elektita dosiero ne estas subtenata haŭto de Pleromo. Neniuj ŝanĝoj al via haŭto okazis.",
@@ -219,7 +219,7 @@
"loop_video_silent_only": "Ripetadi nur filmojn sen sono (ekz. la «GIF-ojn» de Mastodon)",
"mutes_tab": "Silentigoj",
"play_videos_in_modal": "Ludi filmojn en ŝpruca kadro",
- "use_contain_fit": "Ne tondi la kunsendaĵon en bildetoj",
+ "use_contain_fit": "Ne pritondi bildetojn de kunsendaĵoj",
"name": "Nomo",
"name_bio": "Nomo kaj priskribo",
"new_password": "Nova pasvorto",
@@ -265,7 +265,7 @@
"subject_line_email": "Kiel retpoŝto: «re: temo»",
"subject_line_mastodon": "Kiel Mastodon: kopii senŝanĝe",
"subject_line_noop": "Ne kopii",
- "post_status_content_type": "Afiŝi specon de la enhavo de la stato",
+ "post_status_content_type": "Speco de enhavo de afiŝo",
"stop_gifs": "Movi GIF-bildojn dum ŝvebo de muso",
"streaming": "Ŝalti memagan fluigon de novaj afiŝoj kiam vi vidas la supron de la paĝo",
"text": "Teksto",
@@ -379,7 +379,7 @@
"hint": "Por ombroj vi ankaŭ povas uzi --variable kiel koloran valoron, por uzi variantojn de CSS3. Bonvolu rimarki, ke tiuokaze agordoj de maltravidebleco ne funkcios.",
"filter_hint": {
"always_drop_shadow": "Averto: ĉi tiu ombro ĉiam uzas {0} kiam la foliumilo tion subtenas.",
- "drop_shadow_syntax": "{0} ne subtenas parametron {1} kaj ŝlosilvorton {2}.",
+ "drop_shadow_syntax": "{0} ne subtenas parametron {1} kaj ĉefvorton {2}.",
"avatar_inset": "Bonvolu rimarki, ke agordi ambaŭ internajn kaj eksterajn ombrojn por profilbildoj povas redoni neatenditajn rezultojn ĉe profilbildoj travideblaj.",
"spread_zero": "Ombroj kun vastigo > 0 aperos kvazaŭ ĝi estus fakte nulo",
"inset_classic": "Internaj ombroj uzos {0}"
@@ -394,7 +394,7 @@
"button": "Butono",
"buttonHover": "Butono (je ŝvebo)",
"buttonPressed": "Butono (premita)",
- "buttonPressedHover": "Butono (premita kaj je ŝvebo)",
+ "buttonPressedHover": "Butono (je premo kaj ŝvebo)",
"input": "Eniga kampo"
},
"hintV3": "Kolorojn de ombroj vi ankaŭ povas skribi per la sistemo {0}."
@@ -683,7 +683,7 @@
"replace": "Anstataŭigi",
"reject": "Rifuzi",
"ftl_removal": "Forigo el la historio de «La tuta konata reto»",
- "keyword_policies": "Politiko pri ŝlosilvortoj"
+ "keyword_policies": "Politiko pri ĉefvortoj"
},
"federation": "Federado",
"mrf_policies_desc": "Politikoj de Mesaĝa ŝanĝilaro (MRF) efikas sur federa konduto de la nodo. La sekvaj politikoj estas ŝaltitaj:"
@@ -739,8 +739,8 @@
"week_short": "{0}s",
"weeks": "{0} semajnoj",
"week": "{0} semajno",
- "seconds_short": "{0}s",
- "second_short": "{0}s",
+ "seconds_short": "{0}sek",
+ "second_short": "{0}sek",
"seconds": "{0} sekundoj",
"second": "{0} sekundo",
"now_short": "nun",
@@ -749,14 +749,14 @@
"month_short": "{0}m",
"months": "{0} monatoj",
"month": "{0} monato",
- "minutes_short": "{0}m",
- "minute_short": "{0}m",
+ "minutes_short": "{0}min",
+ "minute_short": "{0}min",
"minutes": "{0} minutoj",
"minute": "{0} minuto",
"in_past": "antaŭ {0}",
"in_future": "post {0}",
- "hours_short": "{0}h",
- "hour_short": "{0}h",
+ "hours_short": "{0}hor",
+ "hour_short": "{0}hor",
"hours": "{0} horoj",
"hour": "{0} horo",
"days_short": "{0}t",
diff --git a/src/i18n/es.json b/src/i18n/es.json
index 6889df9a..0c2cc3e9 100644
--- a/src/i18n/es.json
+++ b/src/i18n/es.json
@@ -104,7 +104,8 @@
"no_more_notifications": "No hay más notificaciones",
"reacted_with": "reaccionó con {0}",
"migrated_to": "migrado a",
- "follow_request": "quiere seguirte"
+ "follow_request": "quiere seguirte",
+ "error": "Error obteniendo notificaciones:{0}"
},
"polls": {
"add_poll": "Añadir encuesta",
@@ -313,7 +314,7 @@
"hide_followers_count_description": "No mostrar el número de cuentas que me siguen",
"show_admin_badge": "Mostrar la insignia de Administrador en mi perfil",
"show_moderator_badge": "Mostrar la insignia de Moderador en mi perfil",
- "nsfw_clickthrough": "Activar el clic para ocultar los adjuntos NSFW",
+ "nsfw_clickthrough": "Habilitar la ocultación de la imagen de vista previa del enlace y el adjunto para los estados NSFW por defecto",
"oauth_tokens": "Tokens de OAuth",
"token": "Token",
"refresh_token": "Actualizar el token",
@@ -605,7 +606,8 @@
"up_to_date": "Actualizado",
"no_more_statuses": "No hay más estados",
"no_statuses": "Sin estados",
- "reload": "Recargar"
+ "reload": "Recargar",
+ "error": "Error obteniendo la linea de tiempo:{0}"
},
"status": {
"favorites": "Favoritos",
@@ -628,7 +630,9 @@
"copy_link": "Copiar el enlace al estado",
"status_unavailable": "Estado no disponible",
"bookmark": "Marcar",
- "unbookmark": "Desmarcar"
+ "unbookmark": "Desmarcar",
+ "status_deleted": "Esta entrada ha sido eliminada",
+ "nsfw": "NSFW (No apropiado para el trabajo)"
},
"user_card": {
"approve": "Aprobar",
diff --git a/src/i18n/he.json b/src/i18n/he.json
index 7f2bf58f..4b920536 100644
--- a/src/i18n/he.json
+++ b/src/i18n/he.json
@@ -390,5 +390,13 @@
"GiB": "GiB",
"TiB": "TiB"
}
+ },
+ "about": {
+ "mrf": {
+ "keyword": {
+ "keyword_policies": "פוליסת מילות מפתח"
+ },
+ "federation": "פדרציה"
+ }
}
}
diff --git a/src/i18n/it.json b/src/i18n/it.json
index 67e92b32..58dafca5 100644
--- a/src/i18n/it.json
+++ b/src/i18n/it.json
@@ -50,7 +50,8 @@
"follow_request": "vuole seguirti",
"no_more_notifications": "Fine delle notifiche",
"migrated_to": "è migrato verso",
- "reacted_with": "ha reagito con {0}"
+ "reacted_with": "ha reagito con {0}",
+ "error": "Errore nel caricare le notifiche: {0}"
},
"settings": {
"attachments": "Allegati",
@@ -427,7 +428,8 @@
"repeated": "condiviso",
"no_statuses": "Nessun messaggio",
"no_more_statuses": "Fine dei messaggi",
- "reload": "Ricarica"
+ "reload": "Ricarica",
+ "error": "Errore nel caricare la sequenza: {0}"
},
"user_card": {
"follow": "Segui",
@@ -703,7 +705,8 @@
"delete_confirm": "Vuoi veramente eliminare questo messaggio?",
"unbookmark": "Rimuovi segnalibro",
"bookmark": "Aggiungi segnalibro",
- "status_deleted": "Questo messagio è stato cancellato"
+ "status_deleted": "Questo messagio è stato cancellato",
+ "nsfw": "Pruriginoso"
},
"time": {
"years_short": "{0}a",
diff --git a/src/i18n/ru.json b/src/i18n/ru.json
index 8f421b50..f636bdf8 100644
--- a/src/i18n/ru.json
+++ b/src/i18n/ru.json
@@ -18,7 +18,13 @@
"generic_error": "Произошла ошибка",
"optional": "не обязательно",
"show_less": "Показать меньше",
- "show_more": "Показать больше"
+ "show_more": "Показать больше",
+ "peek": "Взглянуть",
+ "dismiss": "Закрыть",
+ "retry": "Попробуйте еще раз",
+ "error_retry": "Пожалуйста попробуйте еще раз",
+ "close": "Закрыть",
+ "loading": "Загрузка…"
},
"login": {
"login": "Войти",
@@ -468,7 +474,9 @@
"media_proxy": "Прокси для внешних вложений",
"text_limit": "Лимит символов",
"title": "Особенности",
- "gopher": "Gopher"
+ "gopher": "Gopher",
+ "who_to_follow": "Предложения кого читать",
+ "pleroma_chat_messages": "Pleroma Чат"
},
"tool_tip": {
"accept_follow_request": "Принять запрос на чтение",
@@ -477,6 +485,7 @@
"image_cropper": {
"save_without_cropping": "Сохранить не обрезая",
"save": "Сохранить",
- "crop_picture": "Обрезать картинку"
+ "crop_picture": "Обрезать картинку",
+ "cancel": "Отмена"
}
}
diff --git a/src/i18n/uk.json b/src/i18n/uk.json
new file mode 100644
index 00000000..73006e6e
--- /dev/null
+++ b/src/i18n/uk.json
@@ -0,0 +1,99 @@
+{
+ "general": {
+ "dismiss": "Закрити",
+ "close": "Закрити",
+ "verify": "Перевірити",
+ "confirm": "Підтвердити",
+ "enable": "Увімкнути",
+ "disable": "Вимкнути",
+ "cancel": "Скасувати",
+ "show_less": "Показати менше",
+ "show_more": "Показати більше",
+ "optional": "необов'язково",
+ "retry": "Спробуйте ще раз",
+ "error_retry": "Будь ласка, спробуйте ще раз",
+ "generic_error": "Виникла помилка",
+ "loading": "Завантаження…",
+ "more": "Більше",
+ "submit": "Відправити",
+ "apply": "Застосувати",
+ "peek": "Глянути"
+ },
+ "finder": {
+ "error_fetching_user": "Користувача не знайдено",
+ "find_user": "Знайти користувача"
+ },
+ "features_panel": {
+ "gopher": "Gopher",
+ "pleroma_chat_messages": "Чат Pleroma",
+ "chat": "Чат",
+ "who_to_follow": "Кого відстежувати",
+ "title": "Особливості",
+ "scope_options": "Параметри осягу",
+ "media_proxy": "Посередник медіа-даних",
+ "text_limit": "Ліміт символів"
+ },
+ "exporter": {
+ "processing": "Опрацьовую, скоро ви зможете завантажити файл",
+ "export": "Експорт"
+ },
+ "domain_mute_card": {
+ "unmute_progress": "Вимикаю…",
+ "unmute": "Вимкнути ігнорування",
+ "mute_progress": "Вмикаю…",
+ "mute": "Ігнорувати"
+ },
+ "shoutbox": {
+ "title": "Для воплів"
+ },
+ "about": {
+ "staff": "Адміністрація",
+ "mrf": {
+ "simple": {
+ "media_nsfw_desc": "Даний інстанс примусово позначає вкладення з наступних інстансів як NSFW:",
+ "media_nsfw": "Примусове визначення вкладення як дратівливого",
+ "media_removal_desc": "Поточний інстанс видаляє вкладення на перелічених інстансах:",
+ "media_removal": "Видалення вкладень",
+ "ftl_removal_desc": "Цей інстанс видаляє перелічені інстанси з \"Усієї відомої мережі\":",
+ "ftl_removal": "Видалення з \"Вся відома мережа\"",
+ "quarantine_desc": "Поточний інстанс буде надсилати тільки публічні пости наступним інстансам:",
+ "quarantine": "Карантин",
+ "reject_desc": "Поточний інстанс не прийматиме повідомлення з перелічених інстансів:",
+ "accept": "Прийняти",
+ "reject": "Відхилити",
+ "accept_desc": "Поточний інстанс приймає повідомлення тільки з перелічених інстансів:",
+ "simple_policies": "Правила поточного інстансу"
+ },
+ "mrf_policies_desc": "Правила MRF розповсюджуються на данний інстанс. Наступні правила активні:",
+ "mrf_policies": "Активні правила MRF (модуль переписування повідомлень)",
+ "keyword": {
+ "is_replaced_by": "→",
+ "replace": "Замінити",
+ "reject": "Відхилити",
+ "ftl_removal": "Прибрати з федеративної стрічки",
+ "keyword_policies": "Політика щодо ключових слів"
+ },
+ "federation": "Федерація"
+ }
+ },
+ "login": {
+ "hint": "Увійдіть, щоб доєднатися до дискусії",
+ "username": "Ім'я користувача",
+ "register": "Зареєструватись",
+ "password": "Пароль",
+ "logout": "Вийти",
+ "description": "Увійти за допомогою OAuth",
+ "login": "Увійти"
+ },
+ "importer": {
+ "error": "Під час імпортування файлу сталася помилка.",
+ "success": "Імпортовано успішно.",
+ "submit": "Відправити"
+ },
+ "image_cropper": {
+ "cancel": "Відмінити",
+ "save_without_cropping": "Зберегти не обрізаючи",
+ "crop_picture": "Обрізати малюнок",
+ "save": "Зберегти"
+ }
+}
diff --git a/src/i18n/zh.json b/src/i18n/zh.json
index 09e2ab0d..7f8e5593 100644
--- a/src/i18n/zh.json
+++ b/src/i18n/zh.json
@@ -22,7 +22,7 @@
},
"general": {
"apply": "应用",
- "submit": "提交",
+ "submit": "发送",
"more": "更多",
"generic_error": "发生了一个错误",
"optional": "可选",
@@ -297,7 +297,7 @@
"hide_follows_description": "不要显示我所关注的人",
"hide_followers_description": "不要显示关注我的人",
"show_admin_badge": "显示管理徽章",
- "show_moderator_badge": "显示版主徽章",
+ "show_moderator_badge": "在我的个人资料中显示监察员标志",
"nsfw_clickthrough": "将不和谐附件隐藏,点击才能打开",
"oauth_tokens": "OAuth令牌",
"token": "令牌",
@@ -655,8 +655,8 @@
"moderation": "权限",
"grant_admin": "赋予管理权限",
"revoke_admin": "撤销管理权限",
- "grant_moderator": "赋予版主权限",
- "revoke_moderator": "撤销版主权限",
+ "grant_moderator": "赋予监察员权限",
+ "revoke_moderator": "撤销监察员权限",
"activate_account": "激活账号",
"deactivate_account": "关闭账号",
"delete_account": "删除账号",
@@ -683,7 +683,7 @@
},
"user_reporting": {
"title": "报告 {0}",
- "add_comment_description": "此报告会发送给您的实例管理员。您可以在下面提供更多详细信息解释报告的缘由:",
+ "add_comment_description": "此报告会发送给您的实例监察员。您可以在下面提供更多详细信息解释报告的缘由:",
"additional_comments": "其它信息",
"forward_description": "这个账号是从另外一个服务器。同时发送一个副本到那里?",
"forward_to": "转发 {0}",