├── .discourse-compatibility ├── .github └── workflows │ └── discourse-plugin.yml ├── .gitignore ├── .prettierrc.cjs ├── .rubocop.yml ├── .simplecov ├── .streerc ├── .template-lintrc.cjs ├── COPYRIGHT.txt ├── Gemfile ├── Gemfile.lock ├── LICENSE.txt ├── README.md ├── app ├── controllers │ └── multilingual │ │ ├── admin_controller.rb │ │ ├── admin_languages_controller.rb │ │ └── admin_translations_controller.rb ├── models │ └── multilingual │ │ └── custom_translation.rb └── serializers │ └── multilingual │ ├── basic_language_serializer.rb │ ├── custom_translation_serializer.rb │ └── language_serializer.rb ├── assets ├── javascripts │ ├── discourse │ │ ├── components │ │ │ ├── admin-language-list.js │ │ │ ├── admin-language.js │ │ │ ├── admin-multilingual-translations.js │ │ │ ├── admin-translation.js │ │ │ ├── content-language-discovery.js │ │ │ ├── content-tag-groups-form.js │ │ │ ├── language-switcher-bar.js │ │ │ ├── language-switcher-menu.gjs │ │ │ ├── language-switcher.gjs │ │ │ ├── legacy-table-header-toggle.js │ │ │ ├── multilingual-navigation.js │ │ │ └── multilingual-uploader.gjs │ │ ├── connectors │ │ │ ├── above-footer │ │ │ │ ├── language-switcher-footer.hbs │ │ │ │ └── language-switcher-footer.js │ │ │ ├── admin-menu │ │ │ │ └── multilingual-nav-button.hbs │ │ │ ├── before-create-topic-button │ │ │ │ └── before-create-topic-button.hbs │ │ │ ├── composer-fields │ │ │ │ ├── composer-language-selector.hbs │ │ │ │ └── composer-language-selector.js │ │ │ ├── edit-topic │ │ │ │ ├── topic-language-selector.hbs │ │ │ │ └── topic-language-selector.js │ │ │ └── user-preferences-interface │ │ │ │ ├── content-language.hbs │ │ │ │ └── content-language.js │ │ ├── controllers │ │ │ └── admin-multilingual-languages.js │ │ ├── initializers │ │ │ └── multilingual-initializer.js │ │ ├── lib │ │ │ ├── multilingual-route.js │ │ │ ├── multilingual-tag.js │ │ │ └── multilingual.js │ │ ├── models │ │ │ ├── multilingual-language.js │ │ │ └── multilingual-translation.js │ │ ├── routes │ │ │ ├── admin-multilingual-languages.js │ │ │ ├── admin-multilingual-translations.js │ │ │ └── admin-multilingual.js │ │ ├── templates │ │ │ ├── admin-multilingual-languages.hbs │ │ │ ├── admin-multilingual-translations.hbs │ │ │ ├── admin-multilingual.hbs │ │ │ ├── components │ │ │ │ ├── admin-language-list.hbs │ │ │ │ ├── admin-language.hbs │ │ │ │ ├── admin-multilingual-translations.hbs │ │ │ │ ├── admin-translation.hbs │ │ │ │ ├── category-name-fields.hbs │ │ │ │ ├── content-language-discovery.hbs │ │ │ │ ├── content-tag-groups-form.hbs │ │ │ │ ├── discourse-tag-bound.hbs │ │ │ │ ├── language-switcher-bar.hbs │ │ │ │ ├── legacy-table-header-toggle.hbs │ │ │ │ └── multilingual-navigation.hbs │ │ │ └── tag-groups-edit.hbs │ │ └── widgets │ │ │ └── language-switcher-menu.js │ ├── multilgingual-admin-route-map.js │ └── select-kit │ │ └── components │ │ ├── content-languages-dropdown.js │ │ ├── content-languages-header.js │ │ ├── content-languages-row.js │ │ └── content-languages-selector.js └── stylesheets │ ├── common │ ├── multilingual.scss │ └── multilingual │ │ ├── admin.scss │ │ ├── content-language-select-kit.scss │ │ ├── content-language-tags.scss │ │ └── language-switcher.scss │ └── mobile │ └── multilingual.scss ├── config ├── locales │ ├── client.af.yml │ ├── client.ar.yml │ ├── client.az.yml │ ├── client.be.yml │ ├── client.bg.yml │ ├── client.bn.yml │ ├── client.bo.yml │ ├── client.bs.yml │ ├── client.ca.yml │ ├── client.cs.yml │ ├── client.cy.yml │ ├── client.da.yml │ ├── client.de.yml │ ├── client.el.yml │ ├── client.en.yml │ ├── client.eo.yml │ ├── client.es.yml │ ├── client.et.yml │ ├── client.eu.yml │ ├── client.fa.yml │ ├── client.fi.yml │ ├── client.fr.yml │ ├── client.gl.yml │ ├── client.he.yml │ ├── client.hi.yml │ ├── client.hr.yml │ ├── client.hu.yml │ ├── client.hy.yml │ ├── client.id.yml │ ├── client.is.yml │ ├── client.it.yml │ ├── client.ja.yml │ ├── client.ka.yml │ ├── client.kk.yml │ ├── client.km.yml │ ├── client.kn.yml │ ├── client.ko.yml │ ├── client.ku.yml │ ├── client.lo.yml │ ├── client.lt.yml │ ├── client.lv.yml │ ├── client.mk.yml │ ├── client.ml.yml │ ├── client.mn.yml │ ├── client.ms.yml │ ├── client.ne.yml │ ├── client.nl.yml │ ├── client.no.yml │ ├── client.om.yml │ ├── client.pa.yml │ ├── client.pl.yml │ ├── client.pt.yml │ ├── client.ro.yml │ ├── client.ru.yml │ ├── client.sd.yml │ ├── client.sk.yml │ ├── client.sl.yml │ ├── client.sq.yml │ ├── client.sr.yml │ ├── client.sv.yml │ ├── client.sw.yml │ ├── client.ta.yml │ ├── client.te.yml │ ├── client.th.yml │ ├── client.tl.yml │ ├── client.tr.yml │ ├── client.tt.yml │ ├── client.uk.yml │ ├── client.ur.yml │ ├── client.vi.yml │ ├── client.yi.yml │ ├── client.zh.yml │ ├── client.zu.yml │ ├── server.af.yml │ ├── server.ar.yml │ ├── server.az.yml │ ├── server.be.yml │ ├── server.bg.yml │ ├── server.bn.yml │ ├── server.bo.yml │ ├── server.bs.yml │ ├── server.ca.yml │ ├── server.cs.yml │ ├── server.cy.yml │ ├── server.da.yml │ ├── server.de.yml │ ├── server.el.yml │ ├── server.en.yml │ ├── server.eo.yml │ ├── server.es.yml │ ├── server.et.yml │ ├── server.eu.yml │ ├── server.fa.yml │ ├── server.fi.yml │ ├── server.fr.yml │ ├── server.gl.yml │ ├── server.he.yml │ ├── server.hi.yml │ ├── server.hr.yml │ ├── server.hu.yml │ ├── server.hy.yml │ ├── server.id.yml │ ├── server.is.yml │ ├── server.it.yml │ ├── server.ja.yml │ ├── server.ka.yml │ ├── server.kk.yml │ ├── server.km.yml │ ├── server.kn.yml │ ├── server.ko.yml │ ├── server.ku.yml │ ├── server.lo.yml │ ├── server.lt.yml │ ├── server.lv.yml │ ├── server.mk.yml │ ├── server.ml.yml │ ├── server.mn.yml │ ├── server.ms.yml │ ├── server.ne.yml │ ├── server.nl.yml │ ├── server.no.yml │ ├── server.om.yml │ ├── server.pa.yml │ ├── server.pl.yml │ ├── server.pt.yml │ ├── server.ro.yml │ ├── server.ru.yml │ ├── server.sd.yml │ ├── server.sk.yml │ ├── server.sl.yml │ ├── server.sq.yml │ ├── server.sr.yml │ ├── server.sv.yml │ ├── server.sw.yml │ ├── server.ta.yml │ ├── server.te.yml │ ├── server.th.yml │ ├── server.tl.yml │ ├── server.tr.yml │ ├── server.tt.yml │ ├── server.uk.yml │ ├── server.ur.yml │ ├── server.vi.yml │ ├── server.yi.yml │ ├── server.zh.yml │ └── server.zu.yml ├── routes.rb └── settings.yml ├── coverage └── .last_run.json ├── crowdin.yml ├── db └── migrate │ └── 20220620010101_create_custom_translations.rb ├── eslint.config.mjs ├── extensions ├── application_controller.rb ├── category_list.rb ├── discourse_tagging.rb ├── extra_locales_controller.rb ├── i18n.rb ├── js_locale_helper.rb ├── post.rb ├── tag.rb ├── tag_group.rb └── topic_serializer.rb ├── jobs └── update_content_language_tags.rb ├── lib ├── multilingual │ ├── cache.rb │ ├── language.rb │ ├── language │ │ ├── content.rb │ │ ├── content_tag.rb │ │ ├── custom.rb │ │ ├── exclusion.rb │ │ └── interface.rb │ ├── locale_loader.rb │ ├── multilingual.rb │ ├── translation.rb │ ├── translation │ │ └── locale.rb │ └── translator.rb └── validators │ ├── content_languages_validator.rb │ ├── language_switcher_validator.rb │ └── translator_content_tag_validator.rb ├── package.json ├── plugin.rb ├── pnpm-lock.yaml ├── spec ├── components │ ├── category_list_spec.rb │ ├── discourse_tagging_spec.rb │ ├── multilingual │ │ ├── content_tag_spec.rb │ │ └── language_spec.rb │ ├── tag_spec.rb │ ├── topic_creator_spec.rb │ ├── topic_query_spec.rb │ └── translation_spec.rb ├── fixtures │ ├── category_description.wbp.yml │ ├── category_name.wbp.yml │ ├── client.fr.yml │ ├── client.wbp.yml │ ├── custom_languages.yml │ ├── server.wbp.yml │ └── tag.wbp.yml ├── models │ └── tag_group_extension_spec.rb ├── plugin_helper.rb ├── requests │ ├── application_controller_spec.rb │ └── multilingual │ │ ├── admin_controller_spec.rb │ │ ├── admin_languages_controller_spec.rb │ │ └── admin_translations_controller_spec.rb └── serializers │ ├── basic_category_serializer_spec.rb │ └── site_serializer_spec.rb ├── svg-icons └── translate.svg └── test └── javascripts ├── acceptance ├── content-languages-dropdown-test.js ├── content-languages-tags-test.js ├── content-languages-user-preferences-test.js └── translate-tag-test.js └── fixtures ├── tag-translations.js └── topic-list.js /.discourse-compatibility: -------------------------------------------------------------------------------- 1 | < 3.4.0.beta1-dev: 145e00967d93fd5f5c94aac820ab198f506e3f46 2 | < 3.3.0.beta1-dev: d238baf5b0417b9f93d3c7f67c1ee7cebbc73110 3 | -------------------------------------------------------------------------------- /.github/workflows/discourse-plugin.yml: -------------------------------------------------------------------------------- 1 | name: Discourse Plugin 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | ci: 11 | uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | coverage/* 2 | !coverage/.last_run.json 3 | gems/ 4 | .bundle/ 5 | auto_generated 6 | .DS_Store 7 | node_modules/ 8 | config/translations/ 9 | assets/locales/ 10 | yarn.lock 11 | -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = require("@discourse/lint-configs/prettier"); 2 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | inherit_gem: 2 | rubocop-discourse: stree-compat.yml 3 | -------------------------------------------------------------------------------- /.simplecov: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | plugin = "discourse-multilingual" 3 | 4 | SimpleCov.configure do 5 | track_files "plugins/#{plugin}/**/*.rb" 6 | add_filter { |src| !(src.filename =~ /(\/#{plugin}\/app\/|\/#{plugin}\/lib\/)/) } 7 | end 8 | -------------------------------------------------------------------------------- /.streerc: -------------------------------------------------------------------------------- 1 | --print-width=100 2 | --plugins=plugin/trailing_comma,plugin/disable_auto_ternary 3 | -------------------------------------------------------------------------------- /.template-lintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = require("@discourse/lint-configs/template-lint"); 2 | -------------------------------------------------------------------------------- /COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | All code in this repository is Copyright 2020 by Angus McLeod. 2 | 3 | This program is free software; you can redistribute it and/or modify 4 | it under the terms of the GNU General Public License as published by 5 | the Free Software Foundation; either version 2 of the License, or (at 6 | your option) any later version. 7 | 8 | This program is distributed in the hope that it will be useful, but 9 | WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 10 | or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 | for more details. 12 | 13 | You should have received a copy of the GNU General Public License 14 | along with this program as the file LICENSE.txt; if not, please see 15 | http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 16 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source "https://rubygems.org" 4 | 5 | group :development do 6 | gem "rubocop-discourse" 7 | gem "syntax_tree" 8 | end 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | See further https://meta.discourse.org/t/multilingual-plugin/142740 -------------------------------------------------------------------------------- /app/controllers/multilingual/admin_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::AdminController < Admin::AdminController 3 | requires_plugin Multilingual::PLUGIN_NAME 4 | 5 | def index 6 | render_json_dump(content_language_tag_group_id: Multilingual::ContentTag.enabled_group.id) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/serializers/multilingual/basic_language_serializer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::BasicLanguageSerializer < ::ApplicationSerializer 3 | attributes :locale, :name 4 | end 5 | -------------------------------------------------------------------------------- /app/serializers/multilingual/custom_translation_serializer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::CustomTranslationSerializer < ::ApplicationSerializer 3 | attributes :locale, :file_type 4 | 5 | def locale 6 | object[:locale] 7 | end 8 | 9 | def file_type 10 | object[:file_type] 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/serializers/multilingual/language_serializer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::LanguageSerializer < Multilingual::BasicLanguageSerializer 3 | attributes :custom, 4 | :nativeName, 5 | :content_enabled, 6 | :content_tag_conflict, 7 | :interface_enabled, 8 | :interface_supported 9 | end 10 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/admin-language-list.js: -------------------------------------------------------------------------------- 1 | import Component from "@ember/component"; 2 | import { set } from "@ember/object"; 3 | import { observes } from "discourse-common/utils/decorators"; 4 | 5 | export default Component.extend({ 6 | classNames: "admin-language-list", 7 | controlColumnClassNames: ["language-control"], 8 | allContentEnabled: false, 9 | allInterfaceEnabled: false, 10 | 11 | @observes("allContentEnabled") 12 | updateAllContent() { 13 | this.languages.forEach((l) => { 14 | set(l, "content_enabled", this.allContentEnabled); 15 | }); 16 | }, 17 | 18 | @observes("allInterfaceEnabled") 19 | updateAllInterface() { 20 | this.languages.forEach((l) => { 21 | if (l.locale !== "en") { 22 | set(l, "interface_enabled", this.allInterfaceEnabled); 23 | } 24 | }); 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/admin-multilingual-translations.js: -------------------------------------------------------------------------------- 1 | import Component from "@glimmer/component"; 2 | import { tracked } from "@glimmer/tracking"; 3 | import { action } from "@ember/object"; 4 | import MultilingualTranslation from "../models/multilingual-translation"; 5 | 6 | export default class AdminMultilingualTranslations extends Component { 7 | @tracked refreshing = false; 8 | @tracked translations = []; 9 | 10 | constructor() { 11 | super(...arguments); 12 | this._refresh(); 13 | } 14 | 15 | _refresh() { 16 | this.refreshing = true; 17 | 18 | MultilingualTranslation.list() 19 | .then((result) => { 20 | this.translations = result; 21 | }) 22 | .finally(() => { 23 | this.refreshing = false; 24 | }); 25 | } 26 | 27 | @action 28 | refresh() { 29 | this._refresh(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/admin-translation.js: -------------------------------------------------------------------------------- 1 | import Component from "@glimmer/component"; 2 | import { tracked } from "@glimmer/tracking"; 3 | import { action } from "@ember/object"; 4 | import MultilingualTranslation from "../models/multilingual-translation"; 5 | 6 | export default class AdminTranslation extends Component { 7 | @tracked removing = false; 8 | 9 | @action 10 | remove() { 11 | this.removing = true; 12 | 13 | MultilingualTranslation.remove( 14 | this.args.translation.locale, 15 | this.args.translation.file_type 16 | ).then(() => { 17 | this.removing = false; 18 | this.args.removed(); 19 | }); 20 | } 21 | 22 | @action 23 | download() { 24 | MultilingualTranslation.download( 25 | this.args.translation.locale, 26 | this.args.translation.file_type 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/content-tag-groups-form.js: -------------------------------------------------------------------------------- 1 | import { service } from "@ember/service"; 2 | import TagGroupsForm from "discourse/components/tag-groups-form"; 3 | import { ajax } from "discourse/lib/ajax"; 4 | import { popupAjaxError } from "discourse/lib/ajax-error"; 5 | import I18n from "I18n"; 6 | 7 | export default TagGroupsForm.extend({ 8 | dialog: service(), 9 | updateContentTags() { 10 | this.set( 11 | "changingContentTags", 12 | I18n.t("tagging.groups.content_tags.update.message") 13 | ); 14 | 15 | ajax(`/tag_groups/${this.model.id}/content-tags`, { 16 | type: "PUT", 17 | }) 18 | .catch(popupAjaxError) 19 | .then(() => this.set("changingContentTags", null)) 20 | .finally(() => this.tagsChanged()); 21 | }, 22 | 23 | destroyContentTags() { 24 | this.set( 25 | "changingContentTags", 26 | I18n.t("tagging.groups.content_tags.delete.message") 27 | ); 28 | 29 | ajax(`/tag_groups/${this.model.id}/content-tags`, { 30 | type: "DELETE", 31 | }) 32 | .catch(popupAjaxError) 33 | .then(() => this.set("changingContentTags", null)) 34 | .finally(() => this.tagsChanged()); 35 | }, 36 | 37 | actions: { 38 | destroyContentTags() { 39 | this.dialog.deleteConfirm({ 40 | title: I18n.t("tagging.groups.content_tags.delete.confirm"), 41 | didConfirm: () => this.destroyContentTags(), 42 | }); 43 | }, 44 | 45 | updateContentTags() { 46 | this.updateContentTags(); 47 | }, 48 | }, 49 | }); 50 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/language-switcher-menu.gjs: -------------------------------------------------------------------------------- 1 | import Component from "@glimmer/component"; 2 | import { fn } from "@ember/helper"; 3 | import { on } from "@ember/modifier"; 4 | import { action } from "@ember/object"; 5 | import { service } from "@ember/service"; 6 | import concatClass from "discourse/helpers/concat-class"; 7 | import I18n from "discourse-i18n"; 8 | import eq from "truth-helpers/helpers/eq"; 9 | import { addParam, localeParam } from "../lib/multilingual-route"; 10 | 11 | export default class LanguageSwitcherMenu extends Component { 12 | @service site; 13 | 14 | get currentLocale() { 15 | return I18n.currentLocale(); 16 | } 17 | 18 | @action 19 | change(locale) { 20 | addParam(localeParam, locale, { add_cookie: true, ctx: this }); 21 | } 22 | 23 | 44 | } 45 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/language-switcher.gjs: -------------------------------------------------------------------------------- 1 | import i18n from "discourse-common/helpers/i18n"; 2 | import DMenu from "float-kit/components/d-menu"; 3 | import LanguageSwitcherMenu from "./language-switcher-menu"; 4 | 5 | 17 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/components/multilingual-navigation.js: -------------------------------------------------------------------------------- 1 | import Component from "@ember/component"; 2 | 3 | export default Component.extend({ 4 | tagName: "nav", 5 | }); 6 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/above-footer/language-switcher-footer.hbs: -------------------------------------------------------------------------------- 1 | {{language-switcher-bar}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/above-footer/language-switcher-footer.js: -------------------------------------------------------------------------------- 1 | export default { 2 | shouldRender(attrs, ctx) { 3 | return ( 4 | ctx.siteSettings.multilingual_enabled && 5 | ctx.siteSettings.multilingual_guest_language_switcher === "footer" && 6 | !ctx.siteSettings.login_required && 7 | !ctx.currentUser 8 | ); 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/admin-menu/multilingual-nav-button.hbs: -------------------------------------------------------------------------------- 1 | {{#if this.currentUser.admin}} 2 | {{nav-item route="adminMultilingual" label="multilingual.label"}} 3 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/before-create-topic-button/before-create-topic-button.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/composer-fields/composer-language-selector.hbs: -------------------------------------------------------------------------------- 1 | {{#if this.showSelector}} 2 | {{content-languages-selector 3 | content=this.site.content_languages 4 | value=this.model.content_language_tags 5 | filterPlaceholder="topic.content_languages.placeholder" 6 | onChange=(action (mut this.model.content_language_tags)) 7 | }} 8 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/composer-fields/composer-language-selector.js: -------------------------------------------------------------------------------- 1 | import { schedule } from "@ember/runloop"; 2 | import $ from "jquery"; 3 | import { getOwner } from "discourse-common/lib/get-owner"; 4 | 5 | function setupSelector(isFirstPost, ctx) { 6 | ctx.set("showSelector", isFirstPost); 7 | 8 | if (isFirstPost) { 9 | schedule("afterRender", () => { 10 | $(".content-languages-selector").appendTo(".title-and-category"); 11 | }); 12 | } 13 | } 14 | 15 | export default { 16 | shouldRender(_, ctx) { 17 | return ( 18 | ctx.siteSettings.multilingual_enabled && 19 | ctx.siteSettings.multilingual_content_languages_enabled 20 | ); 21 | }, 22 | 23 | setupComponent(attrs, ctx) { 24 | setupSelector(attrs.model.topicFirstPost, ctx); 25 | 26 | const controller = getOwner(this).lookup("service:composer"); 27 | if (controller) { 28 | controller.addObserver("model.topicFirstPost", this, function () { 29 | if (this._state === "destroying") { 30 | return; 31 | } 32 | setupSelector(controller.get("model.topicFirstPost"), ctx); 33 | }); 34 | } 35 | }, 36 | }; 37 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/edit-topic/topic-language-selector.hbs: -------------------------------------------------------------------------------- 1 | {{content-languages-selector 2 | content=this.site.content_languages 3 | value=this.buffered.content_language_tags 4 | filterPlaceholder="topic.content_languages.placeholder" 5 | }} -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/edit-topic/topic-language-selector.js: -------------------------------------------------------------------------------- 1 | export default { 2 | shouldRender(_, ctx) { 3 | return ( 4 | ctx.siteSettings.multilingual_enabled && 5 | ctx.siteSettings.multilingual_content_languages_enabled 6 | ); 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/user-preferences-interface/content-language.hbs: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | {{content-languages-selector 7 | content=this.site.content_languages 8 | value=this.model.custom_fields.content_languages 9 | noneLabel="user.content_languages.placeholder" 10 | onChange=(action (mut this.model.custom_fields.content_languages)) 11 | initializeContentLanguges=false 12 | }} 13 |
14 |
15 | {{i18n "user.content_languages.instructions"}} 16 |
17 |
-------------------------------------------------------------------------------- /assets/javascripts/discourse/connectors/user-preferences-interface/content-language.js: -------------------------------------------------------------------------------- 1 | import { schedule } from "@ember/runloop"; 2 | import $ from "jquery"; 3 | 4 | export default { 5 | shouldRender(_, ctx) { 6 | return ( 7 | ctx.siteSettings.multilingual_enabled && 8 | ctx.siteSettings.multilingual_content_languages_enabled && 9 | ctx.siteSettings.multilingual_content_languages_topic_filtering_enabled 10 | ); 11 | }, 12 | 13 | setupComponent() { 14 | schedule("afterRender", () => { 15 | const content = ".control-group.content-languages"; 16 | const int = ".control-group.pref-locale"; 17 | const text = ".control-group.text-size"; 18 | const form = ".user-preferences form"; 19 | 20 | if ($(text).length && !$(form).children(content).length) { 21 | $(content).prependTo(form); 22 | } 23 | 24 | if (!$(content).next(int).length) { 25 | $(int).insertAfter(content); 26 | } 27 | }); 28 | }, 29 | }; 30 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/lib/multilingual.js: -------------------------------------------------------------------------------- 1 | import Site from "discourse/models/site"; 2 | 3 | function isContentLanguage(locale, siteSettings) { 4 | if (!locale || !siteSettings.multilingual_content_languages_enabled) { 5 | return false; 6 | } 7 | 8 | const site = Site.current(); 9 | if (!site.content_languages) { 10 | return false; 11 | } 12 | 13 | return site.content_languages.find((cl) => cl.locale === locale); 14 | } 15 | 16 | export { isContentLanguage }; 17 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/models/multilingual-language.js: -------------------------------------------------------------------------------- 1 | import EmberObject from "@ember/object"; 2 | import { ajax } from "discourse/lib/ajax"; 3 | import { popupAjaxError } from "discourse/lib/ajax-error"; 4 | 5 | const MultilingualLanguage = EmberObject.extend(); 6 | const LanguagesPath = "/admin/multilingual/languages"; 7 | 8 | function getParams() { 9 | const searchParams = new URLSearchParams(window.location.search); 10 | let params = {}; 11 | for (let pair of searchParams.entries()) { 12 | if (["query", "order", "ascending"].indexOf(pair[0]) > -1) { 13 | params[pair[0]] = pair[1]; 14 | } 15 | } 16 | return params; 17 | } 18 | 19 | MultilingualLanguage.reopenClass({ 20 | list(params = {}) { 21 | return ajax(LanguagesPath, { 22 | data: Object.assign(getParams(), params), 23 | }) 24 | .then((result) => { 25 | return result.map((l) => MultilingualLanguage.create(l)); 26 | }) 27 | .catch(popupAjaxError); 28 | }, 29 | 30 | save(languages, params = {}) { 31 | params = Object.assign(getParams(), params); 32 | let data = Object.assign({ languages }, params); 33 | return ajax(LanguagesPath, { 34 | method: "PUT", 35 | data: JSON.stringify(data), 36 | dataType: "json", 37 | contentType: "application/json", 38 | }).catch(popupAjaxError); 39 | }, 40 | 41 | remove(locales) { 42 | return ajax(LanguagesPath, { 43 | method: "DELETE", 44 | data: Object.assign(getParams(), { locales }), 45 | }).catch(popupAjaxError); 46 | }, 47 | }); 48 | 49 | export default MultilingualLanguage; 50 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/models/multilingual-translation.js: -------------------------------------------------------------------------------- 1 | import EmberObject from "@ember/object"; 2 | import { ajax } from "discourse/lib/ajax"; 3 | import { popupAjaxError } from "discourse/lib/ajax-error"; 4 | 5 | const MultilingualTranslation = EmberObject.extend(); 6 | const TranslationPath = "/admin/multilingual/translations"; 7 | 8 | MultilingualTranslation.reopenClass({ 9 | list() { 10 | return ajax(TranslationPath).catch(popupAjaxError); 11 | }, 12 | 13 | remove(locale, file_type) { 14 | return ajax(TranslationPath, { 15 | method: "DELETE", 16 | data: { 17 | locale, 18 | file_type, 19 | }, 20 | }).catch(popupAjaxError); 21 | }, 22 | 23 | download(locale, file_type) { 24 | return ajax(TranslationPath + "/download", { 25 | data: { 26 | locale, 27 | file_type, 28 | }, 29 | xhrFields: { 30 | responseType: "blob", 31 | }, 32 | }); 33 | }, 34 | }); 35 | 36 | export default MultilingualTranslation; 37 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/routes/admin-multilingual-languages.js: -------------------------------------------------------------------------------- 1 | import DiscourseRoute from "discourse/routes/discourse"; 2 | import MultilingualLanguage from "../models/multilingual-language"; 3 | 4 | export default DiscourseRoute.extend({ 5 | model(params) { 6 | return MultilingualLanguage.list(params); 7 | }, 8 | 9 | setupController(controller, model) { 10 | controller.set("languages", model); 11 | controller.setupObservers(); 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/routes/admin-multilingual-translations.js: -------------------------------------------------------------------------------- 1 | import DiscourseRoute from "discourse/routes/discourse"; 2 | import MultilingualTranslation from "../models/multilingual-translation"; 3 | 4 | export default DiscourseRoute.extend({ 5 | model(params) { 6 | return MultilingualTranslation.list(params); 7 | }, 8 | 9 | setupController(controller, model) { 10 | controller.set("translations", model); 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/routes/admin-multilingual.js: -------------------------------------------------------------------------------- 1 | import { action } from "@ember/object"; 2 | import Route from "@ember/routing/route"; 3 | import { service } from "@ember/service"; 4 | import { ajax } from "discourse/lib/ajax"; 5 | 6 | export default class AdminMultilingualRoute extends Route { 7 | @service router; 8 | 9 | beforeModel(transition) { 10 | if ( 11 | transition.intent.url === "/admin/multilingual" || 12 | transition.intent.name === "adminMultilingual" 13 | ) { 14 | this.router.transitionTo("adminMultilingualLanguages"); 15 | } 16 | } 17 | 18 | setupController(controller, model) { 19 | controller.setProperties({ 20 | tagGroupId: model.content_language_tag_group_id, 21 | documentationUrl: 22 | "https://thepavilion.io/c/knowledge/discourse/multilingual", 23 | }); 24 | } 25 | 26 | @action 27 | showSettings() { 28 | const controller = this.controllerFor("adminSiteSettings"); 29 | this.router 30 | .transitionTo("adminSiteSettingsCategory", "plugins") 31 | .then(() => { 32 | controller.set("filter", "multilingual"); 33 | controller.set("_skipBounce", true); 34 | controller.filterContentNow("plugins"); 35 | }); 36 | } 37 | 38 | model() { 39 | return ajax("/admin/multilingual"); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/admin-multilingual-languages.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{text-field value=this.query placeholder=this.queryPlaceholder}} 4 | 5 |
6 | {{input type="checkbox" checked=this.customOnly}} 7 | {{i18n "multilingual.languages.custom_only"}} 8 |
9 |
10 | 11 |
12 | {{multilingual-uploader 13 | id="multilingual-languages-uploader" 14 | uploading=this.uploading 15 | uploadType="language" 16 | done=(action "languagesUploaded") 17 | }} 18 | 19 | {{d-button 20 | action=(action "update") 21 | class="btn-primary" 22 | icon="floppy-disk" 23 | label=this.updateState 24 | disabled=this.updateLanguagesDisabled 25 | }} 26 |
27 |
28 | 29 | {{#if this.refreshing}} 30 | {{loading-spinner}} 31 | {{else}} 32 | {{#if this.anyLanguages}} 33 | {{admin-language-list 34 | type="custom" 35 | languages=this.filteredLanguages 36 | order=this.order 37 | ascending=this.ascending 38 | updatedLanguages=this.updatedLanguages 39 | updateLanguages=(action "updateLanguages") 40 | }} 41 | {{else}} 42 |

{{i18n "search.no_results"}}

43 | {{/if}} 44 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/admin-multilingual-translations.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/admin-multilingual.hbs: -------------------------------------------------------------------------------- 1 |
2 | 38 |
39 | 40 | {{outlet}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/admin-multilingual-translations.hbs: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{multilingual-uploader 4 | id="multilingual-translations-uploader" 5 | uploading=this.uploading 6 | done=(action "refresh") 7 | uploadType="translation" 8 | }} 9 |
10 |
11 | 12 | {{#if this.refreshing}} 13 | {{loading-spinner}} 14 | {{else}} 15 | {{#if this.translations}} 16 | 17 | 18 | {{legacy-table-header-toggle 19 | field="locale" 20 | labelKey="multilingual.locale" 21 | order=this.order 22 | asc=this.ascending 23 | automatic=true 24 | }} 25 | {{legacy-table-header-toggle 26 | field="file_type" 27 | labelKey="multilingual.translations.type" 28 | order=this.order 29 | asc=this.ascending 30 | automatic=true 31 | }} 32 | 33 | 34 | 35 | {{#each this.translations as |translation|}} 36 | 40 | {{/each}} 41 | 42 |
Actions
43 | {{else}} 44 |

{{i18n "search.no_results"}}

45 | {{/if}} 46 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/admin-translation.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{@translation.locale}} 4 | 5 | 6 | 7 | {{@translation.file_type}} 8 | 9 | 10 | 11 | 12 | {{#if this.removing}} 13 | {{loading-spinner size="small"}} 14 | {{else}} 15 | {{d-icon "xmark"}} 16 | {{i18n "multilingual.translations.remove"}} 17 | {{/if}} 18 | 19 | 20 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/category-name-fields.hbs: -------------------------------------------------------------------------------- 1 |
2 | {{#unless this.category.isUncategorizedCategory}} 3 |
4 | {{#if 5 | this.category.name_translations 6 | }}{{d-icon "translate"}}{{/if}} 7 | {{text-field 8 | value=this.category.name 9 | placeholderKey="category.name_placeholder" 10 | maxlength="50" 11 | }} 12 |
13 | {{/unless}} 14 |
15 | 16 | {{text-field 17 | value=this.category.slug 18 | placeholderKey="category.slug_placeholder" 19 | maxlength="255" 20 | }} 21 |
22 |
-------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/content-language-discovery.hbs: -------------------------------------------------------------------------------- 1 | {{#if this.shouldRender}} 2 | {{content-languages-dropdown 3 | content=this.contentLanguages 4 | options=(hash hasLanguages=this.hasLanguages) 5 | }} 6 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/content-tag-groups-form.hbs: -------------------------------------------------------------------------------- 1 |
2 |

{{this.model.name}}

3 |
4 | 5 |
6 |
    7 | {{#each this.buffered.tag_names as |name|}} 8 |
  • 9 | {{name}} 10 | ({{discourse-tag name contentLanguageTag=true}}) 11 |
  • 12 | {{/each}} 13 |
14 |
15 | 16 | {{d-button 17 | class="btn-danger" 18 | action=(action "destroy") 19 | disabled=this.changingContentTags 20 | icon="far-trash-can" 21 | label="tagging.groups.delete" 22 | }} 23 | 24 | 45 |
-------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/discourse-tag-bound.hbs: -------------------------------------------------------------------------------- 1 | {{discourse-tag this.tagRecord.id}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/language-switcher-bar.hbs: -------------------------------------------------------------------------------- 1 | {{#each this.visibleLanguages as |l|}}
{{l.name}}
{{/each}} 6 | 7 | {{#if this.showHiddenToggle}} 8 | {{d-button icon="plus" action=(action "toggleHidden") class="toggle-hidden"}} 9 | 10 | {{#if this.showHidden}} 11 |
12 |
    13 | {{#each this.hiddenLanguages as |l|}}
  • {{l.name}}
  • {{/each}} 18 |
19 |
20 | {{/if}} 21 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/legacy-table-header-toggle.hbs: -------------------------------------------------------------------------------- 1 | 2 | {{directory-table-header-title 3 | field=this.field 4 | labelKey=this.labelKey 5 | icon=this.icon 6 | translated=this.translated 7 | }} 8 | {{this.chevronIcon}} 9 | 10 | 11 | {{yield}} -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/components/multilingual-navigation.hbs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/javascripts/discourse/templates/tag-groups-edit.hbs: -------------------------------------------------------------------------------- 1 | {{#if this.model.content_language_group}} 2 | {{content-tag-groups-form 3 | model=this.model 4 | onDestroy=(action "onDestroy") 5 | tagsChanged=(route-action "tagsChanged") 6 | }} 7 | {{else}} 8 | {{tag-groups-form model=this.model onDestroy=(action "onDestroy")}} 9 | {{/if}} -------------------------------------------------------------------------------- /assets/javascripts/multilgingual-admin-route-map.js: -------------------------------------------------------------------------------- 1 | export default { 2 | resource: "admin", 3 | map() { 4 | this.route( 5 | "adminMultilingual", 6 | { path: "/multilingual", resetNamespace: true }, 7 | function () { 8 | this.route("adminMultilingualLanguages", { 9 | path: "/languages", 10 | resetNamespace: true, 11 | }); 12 | this.route("adminMultilingualTranslations", { 13 | path: "/translations", 14 | resetNamespace: true, 15 | }); 16 | } 17 | ); 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /assets/javascripts/select-kit/components/content-languages-dropdown.js: -------------------------------------------------------------------------------- 1 | import { set } from "@ember/object"; 2 | import DropdownSelectBox from "select-kit/components/dropdown-select-box"; 3 | import { 4 | contentLanguageParam, 5 | getDiscoveryParam, 6 | } from "../../discourse/lib/multilingual-route"; 7 | 8 | export default DropdownSelectBox.extend({ 9 | classNames: "content-languages-dropdown", 10 | valueProperty: "locale", 11 | nameProperty: "name", 12 | 13 | selectKitOptions: { 14 | icon: "translate", 15 | showFullTitle: false, 16 | autoFilterable: false, 17 | headerComponent: "content-languages-header", 18 | hasLanguages: false, 19 | }, 20 | 21 | didInsertElement() { 22 | this._super(...arguments); 23 | 24 | if (!this.currentUser) { 25 | this.selectKit.options.set("filterable", true); 26 | } 27 | }, 28 | 29 | modifyComponentForRow() { 30 | return "content-languages-row"; 31 | }, 32 | 33 | modifyContent(content) { 34 | if (!this.currentUser) { 35 | const param = getDiscoveryParam(this, contentLanguageParam); 36 | let activeIndex; 37 | 38 | content.forEach((l, i) => { 39 | if (l.locale === param) { 40 | set(l, "classNames", `${l.classNames} active`); 41 | set(l, "icon", "xmark"); 42 | activeIndex = i; 43 | } else if (l.icon === "xmark") { 44 | set(l, "classNames", "guest-content-language"); 45 | set(l, "icon", null); 46 | } 47 | }); 48 | 49 | content.sort((a, b) => a.locale.localeCompare(b.locale)); 50 | content.splice(0, 0, content.splice(activeIndex, 1)[0]); 51 | } 52 | 53 | return content; 54 | }, 55 | }); 56 | -------------------------------------------------------------------------------- /assets/javascripts/select-kit/components/content-languages-header.js: -------------------------------------------------------------------------------- 1 | import discourseComputed from "discourse-common/utils/decorators"; 2 | import DropdownSelectBoxHeaderComponent from "select-kit/components/dropdown-select-box/dropdown-select-box-header"; 3 | 4 | export default DropdownSelectBoxHeaderComponent.extend({ 5 | @discourseComputed("selectKit.options.hasLanguages") 6 | btnClassName(hasLanguages) { 7 | return `btn no-text btn-icon ${hasLanguages ? "has-languages" : ""}`; 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /assets/javascripts/select-kit/components/content-languages-row.js: -------------------------------------------------------------------------------- 1 | import { default as DiscourseURL, userPath } from "discourse/lib/url"; 2 | import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; 3 | import { 4 | addParam, 5 | contentLanguageParam, 6 | } from "../../discourse/lib/multilingual-route"; 7 | 8 | export default SelectKitRowComponent.extend({ 9 | click(e) { 10 | if (this.rowValue === "set_content_language") { 11 | DiscourseURL.routeTo( 12 | userPath(this.currentUser.username_lower + "/preferences/interface") 13 | ); 14 | } else if (this.item.icon === "xmark") { 15 | addParam(contentLanguageParam, null, { ctx: this }); 16 | } else if (!this.currentUser) { 17 | addParam(contentLanguageParam, this.rowValue, { ctx: this }); 18 | } else { 19 | this._super(e); 20 | } 21 | }, 22 | }); 23 | -------------------------------------------------------------------------------- /assets/javascripts/select-kit/components/content-languages-selector.js: -------------------------------------------------------------------------------- 1 | import MultiSelectComponent from "select-kit/components/multi-select"; 2 | 3 | export default MultiSelectComponent.extend({ 4 | classNames: ["content-languages-selector", "classNames"], 5 | allowAny: false, 6 | valueProperty: "locale", 7 | nameProperty: "name", 8 | options: { 9 | filterable: true, 10 | }, 11 | initializeContentLanguges: true, 12 | 13 | didInsertElement() { 14 | this._super(...arguments); 15 | 16 | if ( 17 | !this.value && 18 | this.initializeContentLanguges && 19 | this.currentUser.content_languages.length 20 | ) { 21 | this.set("value", this.currentUser.content_languages[0].locale); 22 | } 23 | }, 24 | }); 25 | -------------------------------------------------------------------------------- /assets/stylesheets/common/multilingual.scss: -------------------------------------------------------------------------------- 1 | @import "multilingual/content-language-tags"; 2 | @import "multilingual/content-language-select-kit"; 3 | @import "multilingual/language-switcher"; 4 | @import "multilingual/admin"; 5 | 6 | #reply-control .title-and-category { 7 | align-items: initial; 8 | } 9 | 10 | ol.category-breadcrumb li.content-language-discovery { 11 | margin: 0; 12 | } 13 | 14 | .topic-language-selector { 15 | margin-bottom: 9px; 16 | background-color: #f1f1f1; 17 | color: rgba(#333, 0.7); 18 | } 19 | 20 | .content-language-discovery { 21 | display: inline-block; 22 | } 23 | -------------------------------------------------------------------------------- /assets/stylesheets/common/multilingual/content-language-select-kit.scss: -------------------------------------------------------------------------------- 1 | .content-languages-selector.select-kit { 2 | width: initial; 3 | min-width: 300px; 4 | 5 | .choices .selected-name { 6 | background: initial; 7 | } 8 | 9 | .select-kit-header .name, 10 | .select-kit-row .name { 11 | color: var(--primary); 12 | } 13 | } 14 | 15 | .content-languages-dropdown.select-kit { 16 | .select-kit-header { 17 | outline-style: none !important; 18 | margin-left: 5px; 19 | 20 | &.has-languages { 21 | background-color: var(--tertiary); 22 | 23 | .d-icon { 24 | color: var(--secondary); 25 | } 26 | } 27 | } 28 | 29 | .select-kit-collection { 30 | font-size: 1em; 31 | } 32 | 33 | li.select-kit-row { 34 | width: 100%; 35 | cursor: initial; 36 | padding: 10px; 37 | 38 | .texts .name { 39 | font-weight: initial; 40 | } 41 | 42 | &[data-value="set_content_language"], 43 | &[data-value="clear_content_language"] { 44 | cursor: pointer; 45 | } 46 | 47 | &.guest-content-language { 48 | cursor: pointer; 49 | 50 | &.active { 51 | background: var(--tertiary-low); 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /assets/stylesheets/common/multilingual/content-language-tags.scss: -------------------------------------------------------------------------------- 1 | .discourse-tags .discourse-tag.simple:not(:last-child)::after, 2 | .list-tags .discourse-tag.simple:not(:last-child)::after { 3 | content: ""; 4 | margin-left: 0; 5 | } 6 | 7 | .discourse-tags a.discourse-tag.simple:not(:last-of-type)::after, 8 | .list-tags a.discourse-tag.simple:not(:last-of-type)::after, 9 | .content-language-tags a.content-language-tag:not(:last-of-type)::after { 10 | content: ", "; 11 | margin-left: 1px; 12 | } 13 | 14 | .discourse-tags a { 15 | display: inline-block; 16 | 17 | & + .content-language-tags { 18 | margin-left: 8px; 19 | } 20 | } 21 | 22 | .content-language-tags { 23 | display: inline-block; 24 | vertical-align: middle; 25 | 26 | > .d-icon { 27 | margin-right: 3px; 28 | height: 0.8706em; 29 | width: 0.8706em; 30 | } 31 | 32 | .content-language-tag { 33 | @extend .discourse-tag, .simple; 34 | } 35 | } 36 | 37 | .tag-groups-container.content-tags { 38 | .tag-group-content { 39 | margin-bottom: 40px; 40 | 41 | .group-tags-list { 42 | ul { 43 | display: flex; 44 | flex-flow: wrap; 45 | list-style: none; 46 | margin: 0; 47 | 48 | li { 49 | margin: 0 15px 10px 0; 50 | } 51 | } 52 | } 53 | 54 | .content-tag-controls { 55 | float: right; 56 | 57 | button.btn { 58 | margin-right: 0; 59 | margin-left: 10px; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /assets/stylesheets/mobile/multilingual.scss: -------------------------------------------------------------------------------- 1 | .edit-topic-title .content-languages-selector { 2 | width: calc(100vw - 20px); 3 | } 4 | 5 | .list-controls .category-breadcrumb.no-category { 6 | flex: initial; 7 | 8 | & > li:not(.content-language-discovery) { 9 | display: none; 10 | } 11 | 12 | .content-languages-dropdown { 13 | height: 35px; 14 | margin-bottom: 0; 15 | } 16 | } 17 | 18 | .composer-fields .content-languages-selector { 19 | margin-left: 0; 20 | } 21 | 22 | .language-switcher-bar { 23 | width: 100%; 24 | border-top: 1px solid var(--primary-low); 25 | box-sizing: border-box; 26 | box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.15); 27 | background-color: var(--secondary); 28 | position: fixed; 29 | bottom: 0; 30 | left: 0; 31 | z-index: 100; 32 | 33 | a, 34 | .btn { 35 | font-size: 0.9em; 36 | } 37 | 38 | .hidden-languages { 39 | max-width: 80vw; 40 | max-height: 70vh; 41 | margin: 0 auto; 42 | right: 0; 43 | left: 0; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /config/locales/client.af.yml: -------------------------------------------------------------------------------- 1 | af: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ar.yml: -------------------------------------------------------------------------------- 1 | ar: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.az.yml: -------------------------------------------------------------------------------- 1 | az: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.be.yml: -------------------------------------------------------------------------------- 1 | be: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.bg.yml: -------------------------------------------------------------------------------- 1 | bg: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.bn.yml: -------------------------------------------------------------------------------- 1 | bn: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.bo.yml: -------------------------------------------------------------------------------- 1 | bo: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.bs.yml: -------------------------------------------------------------------------------- 1 | bs: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ca.yml: -------------------------------------------------------------------------------- 1 | ca: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.cs.yml: -------------------------------------------------------------------------------- 1 | cs: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.cy.yml: -------------------------------------------------------------------------------- 1 | cy: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.da.yml: -------------------------------------------------------------------------------- 1 | da: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.de.yml: -------------------------------------------------------------------------------- 1 | de: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.el.yml: -------------------------------------------------------------------------------- 1 | el: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | 14 | topic: 15 | content_languages: 16 | placeholder: "topic language(s)" 17 | 18 | user: 19 | content_languages: 20 | title: "Content languages" 21 | placeholder: "Select content languages" 22 | instructions: "User content languages" 23 | set: "Set content languages" 24 | 25 | admin_js: 26 | multilingual: 27 | label: "Multilingual" 28 | locale: "Locale" 29 | documentation: Documentation 30 | 31 | languages: 32 | title: "Languages" 33 | custom: "Custom" 34 | base: "Base" 35 | name: "Name" 36 | native_name: "Native Name" 37 | content: "Content" 38 | content_tag: "Content Tag" 39 | content_tag_conflict: "tag conflict" 40 | interface: "Interface" 41 | type: "Type" 42 | actions: "Actions" 43 | interface_not_supported: "no translations" 44 | query_placeholder: "code or name" 45 | custom_only: "custom only" 46 | disabled: "disabled" 47 | toggle_all: "all" 48 | 49 | translations: 50 | type: "Type" 51 | remove: "Remove" 52 | title: "Translations" 53 | -------------------------------------------------------------------------------- /config/locales/client.eo.yml: -------------------------------------------------------------------------------- 1 | eo: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.es.yml: -------------------------------------------------------------------------------- 1 | es: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Eliminar todas las etiquetas" 8 | confirm: "¿Estás seguro que deseas eliminar todas las etiquetas?" 9 | message: "Eliminando todas las etiquetas" 10 | update: 11 | btn: "Actualizar todas las etiquetas" 12 | message: "Actualizando todas las etiquetas" 13 | topic: 14 | content_languages: 15 | placeholder: "Idioma(s) del tema" 16 | user: 17 | content_languages: 18 | title: "Idiomas del contenido" 19 | placeholder: "Seleccionar idiomas del contenido" 20 | instructions: "Idiomas de contenido del usuario" 21 | set: "Seleccionar lenguajes del contenido" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingüe" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Idiomas" 29 | custom: "Personalizado" 30 | base: "Base" 31 | name: "Nombre" 32 | native_name: "Nombre original" 33 | content: "Contenido" 34 | content_tag: "Etiqueta de contenido" 35 | content_tag_conflict: "conflicto de etiqueta" 36 | interface: "Interfase" 37 | type: "Tipo" 38 | actions: "Acciones" 39 | interface_not_supported: "no hay traducciones" 40 | query_placeholder: "código o nombre" 41 | custom_only: "sólo personalizado" 42 | disabled: "deshabilitado" 43 | toggle_all: "todo" 44 | translations: 45 | type: "Tipo" 46 | remove: "Eliminar" 47 | title: "Traducciones" 48 | -------------------------------------------------------------------------------- /config/locales/client.et.yml: -------------------------------------------------------------------------------- 1 | et: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.eu.yml: -------------------------------------------------------------------------------- 1 | eu: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.fa.yml: -------------------------------------------------------------------------------- 1 | fa: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.fi.yml: -------------------------------------------------------------------------------- 1 | fi: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.fr.yml: -------------------------------------------------------------------------------- 1 | fr: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.gl.yml: -------------------------------------------------------------------------------- 1 | gl: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.he.yml: -------------------------------------------------------------------------------- 1 | he: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.hi.yml: -------------------------------------------------------------------------------- 1 | hi: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.hr.yml: -------------------------------------------------------------------------------- 1 | hr: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.hu.yml: -------------------------------------------------------------------------------- 1 | hu: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.hy.yml: -------------------------------------------------------------------------------- 1 | hy: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.id.yml: -------------------------------------------------------------------------------- 1 | id: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.is.yml: -------------------------------------------------------------------------------- 1 | is: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.it.yml: -------------------------------------------------------------------------------- 1 | it: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ja.yml: -------------------------------------------------------------------------------- 1 | ja: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ka.yml: -------------------------------------------------------------------------------- 1 | ka: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.kk.yml: -------------------------------------------------------------------------------- 1 | kk: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.km.yml: -------------------------------------------------------------------------------- 1 | km: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.kn.yml: -------------------------------------------------------------------------------- 1 | kn: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ko.yml: -------------------------------------------------------------------------------- 1 | ko: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ku.yml: -------------------------------------------------------------------------------- 1 | ku: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.lo.yml: -------------------------------------------------------------------------------- 1 | lo: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.lt.yml: -------------------------------------------------------------------------------- 1 | lt: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.lv.yml: -------------------------------------------------------------------------------- 1 | lv: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.mk.yml: -------------------------------------------------------------------------------- 1 | mk: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ml.yml: -------------------------------------------------------------------------------- 1 | ml: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.mn.yml: -------------------------------------------------------------------------------- 1 | mn: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ms.yml: -------------------------------------------------------------------------------- 1 | ms: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ne.yml: -------------------------------------------------------------------------------- 1 | ne: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.nl.yml: -------------------------------------------------------------------------------- 1 | nl: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.no.yml: -------------------------------------------------------------------------------- 1 | "no": 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.om.yml: -------------------------------------------------------------------------------- 1 | om: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.pa.yml: -------------------------------------------------------------------------------- 1 | pa: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.pl.yml: -------------------------------------------------------------------------------- 1 | pl: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.pt.yml: -------------------------------------------------------------------------------- 1 | pt: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ro.yml: -------------------------------------------------------------------------------- 1 | ro: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ru.yml: -------------------------------------------------------------------------------- 1 | ru: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sd.yml: -------------------------------------------------------------------------------- 1 | sd: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sk.yml: -------------------------------------------------------------------------------- 1 | sk: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sl.yml: -------------------------------------------------------------------------------- 1 | sl: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sq.yml: -------------------------------------------------------------------------------- 1 | sq: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sr.yml: -------------------------------------------------------------------------------- 1 | sr-Cyrl: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sv.yml: -------------------------------------------------------------------------------- 1 | sv: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.sw.yml: -------------------------------------------------------------------------------- 1 | sw: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ta.yml: -------------------------------------------------------------------------------- 1 | ta: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.te.yml: -------------------------------------------------------------------------------- 1 | te: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.th.yml: -------------------------------------------------------------------------------- 1 | th: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.tl.yml: -------------------------------------------------------------------------------- 1 | tl: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.tr.yml: -------------------------------------------------------------------------------- 1 | tr: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.tt.yml: -------------------------------------------------------------------------------- 1 | tt: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.uk.yml: -------------------------------------------------------------------------------- 1 | uk: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.ur.yml: -------------------------------------------------------------------------------- 1 | ur: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.vi.yml: -------------------------------------------------------------------------------- 1 | vi: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.yi.yml: -------------------------------------------------------------------------------- 1 | yi: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.zh.yml: -------------------------------------------------------------------------------- 1 | zh-CN: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/client.zu.yml: -------------------------------------------------------------------------------- 1 | zu: 2 | js: 3 | tagging: 4 | groups: 5 | content_tags: 6 | delete: 7 | btn: "Delete all tags" 8 | confirm: "Are you sure you want to delete all content languge tags?" 9 | message: "Deleting all tags" 10 | update: 11 | btn: "Update all tags" 12 | message: "Updating all tags" 13 | topic: 14 | content_languages: 15 | placeholder: "topic language(s)" 16 | user: 17 | content_languages: 18 | title: "Content languages" 19 | placeholder: "Select content languages" 20 | instructions: "User content languages" 21 | set: "Set content languages" 22 | admin_js: 23 | multilingual: 24 | label: "Multilingual" 25 | locale: "Locale" 26 | documentation: Documentation 27 | languages: 28 | title: "Languages" 29 | custom: "Custom" 30 | base: "Base" 31 | name: "Name" 32 | native_name: "Native Name" 33 | content: "Content" 34 | content_tag: "Content Tag" 35 | content_tag_conflict: "tag conflict" 36 | interface: "Interface" 37 | type: "Type" 38 | actions: "Actions" 39 | interface_not_supported: "no translations" 40 | query_placeholder: "code or name" 41 | custom_only: "custom only" 42 | disabled: "disabled" 43 | toggle_all: "all" 44 | translations: 45 | type: "Type" 46 | remove: "Remove" 47 | title: "Translations" 48 | -------------------------------------------------------------------------------- /config/locales/server.af.yml: -------------------------------------------------------------------------------- 1 | af: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.ar.yml: -------------------------------------------------------------------------------- 1 | ar: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.az.yml: -------------------------------------------------------------------------------- 1 | az: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.be.yml: -------------------------------------------------------------------------------- 1 | be: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.bg.yml: -------------------------------------------------------------------------------- 1 | bg: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.bn.yml: -------------------------------------------------------------------------------- 1 | bn: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.bo.yml: -------------------------------------------------------------------------------- 1 | bo: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.bs.yml: -------------------------------------------------------------------------------- 1 | bs: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.ca.yml: -------------------------------------------------------------------------------- 1 | ca: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.cs.yml: -------------------------------------------------------------------------------- 1 | cs: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.cy.yml: -------------------------------------------------------------------------------- 1 | cy: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.da.yml: -------------------------------------------------------------------------------- 1 | da: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.de.yml: -------------------------------------------------------------------------------- 1 | de: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.el.yml: -------------------------------------------------------------------------------- 1 | el: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.eo.yml: -------------------------------------------------------------------------------- 1 | eo: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/locales/server.et.yml: -------------------------------------------------------------------------------- 1 | et: 2 | site_settings: 3 | multilingual_enabled: Multilingual plugin enabled. 4 | multilingual_content_languages_enabled: Content languages enabled. 5 | multilingual_content_languages_topic_filtering_enabled: Topic filtering for content languages enabled. 6 | multilingual_require_content_language_tag: Require a content language tag on all topics. 7 | multilingual_guest_language_switcher: Enable guest language switcher. 8 | multilingual_guest_language_switcher_footer_visible: Languages always visible in the footer language switcher. 9 | multilingual_tag_translations_enforce_format: Enforce Discourse tag formatting on tag translations. 10 | multilingual_translator_content_tag_sync: > 11 | Sync content language tags with post languages detected by Discourse Translator Plugin. Requires Discourse Translator Plugin, and content languages to be enabled. 12 | errors: 13 | multilingual_disabled: Multilingual plugin is disabled 14 | multilingual_content_languages_disabled: Content languages are disabled 15 | multilingual_translator_disabled: Translator plugin is not installed and enabled 16 | multilingual_allow_user_locale_disabled: allow user locale is disabled 17 | multilingual: 18 | content_tag_group_name: "Multilingual Content Tags" 19 | content_tag_group_name_disabled: "Multilingual Disabled Content Tags" 20 | content_language_tag_required: "You must include at least 1 topic language." 21 | languages: 22 | upload_format_incorrect: "Incorrect format. Use format of [Discourse names.yml](https://github.com/discourse/discourse/blob/master/config/locales/names.yml)." 23 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | Discourse::Application.routes.append do 3 | mount ::Multilingual::Engine, at: "multilingual" 4 | 5 | scope module: "multilingual", constraints: AdminConstraint.new do 6 | get "admin/multilingual" => "admin#index" 7 | 8 | get "admin/multilingual/languages" => "admin_languages#list" 9 | put "admin/multilingual/languages" => "admin_languages#update" 10 | post "admin/multilingual/languages" => "admin_languages#upload" 11 | delete "admin/multilingual/languages" => "admin_languages#remove" 12 | 13 | get "admin/multilingual/translations" => "admin_translations#list" 14 | post "admin/multilingual/translations" => "admin_translations#upload" 15 | delete "admin/multilingual/translations" => "admin_translations#remove" 16 | 17 | get "admin/multilingual/translations/download" => "admin_translations#download" 18 | end 19 | 20 | delete "tag_groups/:id/content-tags" => "tag_groups#destroy_content_tags" 21 | put "tag_groups/:id/content-tags" => "tag_groups#update_content_tags" 22 | end 23 | -------------------------------------------------------------------------------- /config/settings.yml: -------------------------------------------------------------------------------- 1 | plugins: 2 | multilingual_enabled: 3 | default: true 4 | client: true 5 | multilingual_content_languages_enabled: 6 | default: false 7 | client: true 8 | validator: ContentLanguagesValidator 9 | multilingual_content_languages_topic_filtering_enabled: 10 | default: true 11 | client: true 12 | multilingual_guest_language_switcher: 13 | client: true 14 | type: enum 15 | default: "off" 16 | choices: 17 | - "off" 18 | - "footer" 19 | - "header" 20 | validator: LanguageSwitcherValidator 21 | multilingual_guest_language_switcher_footer_visible: 22 | type: list 23 | default: ar|zh_CN|en|es|fr|ru 24 | client: true 25 | multilingual_require_content_language_tag: 26 | type: enum 27 | default: "non-staff" 28 | choices: 29 | - "no" 30 | - "yes" 31 | - "non-staff" 32 | multilingual_tag_translations_enforce_format: false 33 | multilingual_translator_content_tag_sync: 34 | default: false 35 | validator: TranslatorContentTagValidator 36 | -------------------------------------------------------------------------------- /coverage/.last_run.json: -------------------------------------------------------------------------------- 1 | { 2 | "result": { 3 | "line": 82.74 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | pull_request_title: 'i18n: Update translations' 2 | files: 3 | - source: /config/locales/client.en.yml 4 | translation: /config/locales/client.%two_letters_code%.yml 5 | - source: /config/locales/server.en.yml 6 | translation: /config/locales/server.%two_letters_code%.yml 7 | -------------------------------------------------------------------------------- /db/migrate/20220620010101_create_custom_translations.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class CreateCustomTranslations < ActiveRecord::Migration[5.2] 4 | def change 5 | create_table :custom_translations do |t| 6 | t.string "file_name", null: false 7 | t.string "file_type", null: false 8 | t.string "locale", null: false 9 | t.string "file_ext", null: false 10 | t.text "translation_data", null: false 11 | 12 | t.timestamps 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import DiscourseRecommended from "@discourse/lint-configs/eslint"; 2 | 3 | export default [...DiscourseRecommended]; 4 | -------------------------------------------------------------------------------- /extensions/application_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module ApplicationControllerMultilingualExtension 3 | def with_resolved_locale(check_current_user: true) 4 | if guest_locale_switcher_enabled && client_locale.present? 5 | I18n.ensure_all_loaded! 6 | I18n.with_locale(client_locale) { yield } 7 | else 8 | super 9 | end 10 | end 11 | 12 | def client_locale 13 | params[:locale] || cookies[:discourse_locale] 14 | end 15 | 16 | def guest_locale_switcher_enabled 17 | SiteSetting.multilingual_enabled && SiteSetting.multilingual_guest_language_switcher != "off" 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /extensions/category_list.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | ## Note ## 4 | # The featured topic list in CategoryList is used in the /categories route: 5 | # * when desktop_category_page_style includes 'featured'; and / or 6 | # * on mobile 7 | # It does not use TopicQuery and does not have access to the current_user. 8 | # The modifications to trim_results below ensures non-content-language topics do not appear, but 9 | # as it is filtering a limited list of 100 featured topics, may be empty when 10 | # relevant topics in the user's content-language remain in the category. 11 | ## 12 | 13 | module CategoryListMultilingualExtension 14 | def trim_results 15 | if Multilingual::ContentLanguage.topic_filtering_enabled 16 | @categories.each do |c| 17 | next if c.displayable_topics.blank? 18 | 19 | c.displayable_topics = 20 | c.displayable_topics.select { |topic| Multilingual::ContentTag.filter(topic.tags).any? } 21 | end 22 | end 23 | 24 | super 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /extensions/discourse_tagging.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module DiscourseTaggingMultilingualExtension 3 | def filter_allowed_tags(guardian, opts = {}) 4 | result = super(guardian, opts) 5 | 6 | if opts[:for_input] && Multilingual::ContentLanguage.enabled 7 | tags_with_counts = opts[:with_context] ? result.first : result 8 | tags_with_counts = 9 | tags_with_counts.select { |tag| Multilingual::ContentTag.all.exclude? tag.name } 10 | result = opts[:with_context] ? [tags_with_counts, result.second] : tags_with_counts 11 | end 12 | 13 | result 14 | end 15 | 16 | def filter_visible(query, guardian = nil) 17 | result = super(query, guardian) 18 | 19 | if Multilingual::ContentLanguage.enabled 20 | result = result.where("tags.id NOT IN (#{Multilingual::ContentTag::QUERY_ALL})") 21 | end 22 | 23 | result 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /extensions/extra_locales_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module ExtraLocalesControllerMultilingualClassExtension 3 | def current_locale 4 | I18n.locale.to_s 5 | end 6 | 7 | def custom_language? 8 | Multilingual::CustomLanguage.is_custom?(current_locale) 9 | end 10 | 11 | def bundle_js(bundle, locale:) 12 | if bundle === "custom-language" && custom_language? 13 | JsLocaleHelper.output_locale(locale) 14 | elsif bundle === "tags" 15 | JsLocaleHelper.output_locale_tags(locale) 16 | else 17 | super(bundle, locale: locale) 18 | end 19 | end 20 | 21 | def bundle_js_hash(bundle, locale:) 22 | if bundle == "tags" 23 | Digest::MD5.hexdigest(bundle_js(bundle, locale: locale)) 24 | else 25 | super(bundle, locale: locale) 26 | end 27 | end 28 | end 29 | 30 | module ExtraLocalesControllerMultilingualExtension 31 | private def valid_bundle?(bundle) 32 | super || 33 | ( 34 | SiteSetting.multilingual_enabled && 35 | ( 36 | ( 37 | bundle === "custom-language" && 38 | Multilingual::CustomLanguage.is_custom?(I18n.locale.to_s) 39 | ) || bundle === "tags" 40 | ) 41 | ) 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /extensions/i18n.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module I18nMultilingualExtension 3 | def available_locales 4 | if SiteSetting.multilingual_enabled 5 | super.select { |l| Multilingual::InterfaceLanguage.enabled?(l) } 6 | else 7 | super 8 | end 9 | end 10 | 11 | def locale_available?(locale) 12 | if SiteSetting.multilingual_enabled 13 | Multilingual::InterfaceLanguage.supported?(locale) || super(locale) 14 | else 15 | super 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /extensions/js_locale_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module JsLocaleHelperMultilingualExtension 3 | def plugin_client_files(locale_str) 4 | files = super(locale_str) 5 | if SiteSetting.multilingual_enabled 6 | files += Dir["#{Multilingual::CustomTranslation::PATH}/client.#{locale_str}.yml"] 7 | end 8 | files 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /extensions/post.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module MultilingualTranslatorPostExtension 3 | def get_old_lang 4 | @custom_fields_orig.present? ? @custom_fields_orig[Multilingual::Translator.lang_field] : nil 5 | end 6 | 7 | def get_new_lang 8 | custom_fields[Multilingual::Translator.lang_field] 9 | end 10 | 11 | def update_lang(old_lang, new_lang) 12 | Multilingual::ContentTag.remove_from_topic(topic, old_lang) 13 | Multilingual::ContentTag.add_to_topic(topic, new_lang) if new_lang 14 | topic.save! 15 | MessageBus.publish("/topic/#{topic.id}", reload_topic: true) 16 | end 17 | 18 | def save_custom_fields(force = false) 19 | old_lang = get_old_lang if Multilingual::Translator.content_tag_sync_enabled 20 | 21 | super(force) 22 | 23 | if Multilingual::Translator.content_tag_sync_enabled 24 | new_lang = get_new_lang 25 | update_lang(old_lang, new_lang) if new_lang != old_lang 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /extensions/tag.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module TagMultilingualExtension 3 | def top_tags(limit_arg: nil, category: nil, guardian: nil) 4 | tags = super(limit_arg: limit_arg, category: category, guardian: guardian) 5 | 6 | if Multilingual::ContentLanguage.enabled 7 | tags = tags.select { |tag| Multilingual::ContentTag.all.exclude? tag } 8 | end 9 | 10 | tags 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /extensions/tag_group.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module TagGroupMultilingualExtension 3 | def visible(guardian) 4 | result = super(guardian) 5 | result = 6 | result.where.not( 7 | name: Multilingual::ContentTag.groups, 8 | ) if Multilingual::ContentLanguage.enabled 9 | result 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /extensions/topic_serializer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module TopicSerializerMultilingualExtension 3 | def tags 4 | result = super 5 | result = result - content_language_tags if Multilingual::ContentLanguage.enabled 6 | result 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /jobs/update_content_language_tags.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module Jobs 3 | class UpdateContentLanguageTags < ::Jobs::Base 4 | def execute(args = {}) 5 | Multilingual::ContentTag.update_all if defined?(Multilingual::ContentLanguage) == "constant" 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /lib/multilingual/language/content.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::ContentLanguage 3 | include ActiveModel::Serialization 4 | 5 | attr_reader :locale, :name 6 | 7 | KEY = "content_language".freeze 8 | 9 | def self.enabled 10 | SiteSetting.multilingual_enabled && SiteSetting.multilingual_content_languages_enabled 11 | end 12 | 13 | def self.topic_filtering_enabled 14 | self.enabled && SiteSetting.multilingual_content_languages_topic_filtering_enabled 15 | end 16 | 17 | def initialize(locale, name) 18 | @locale = locale 19 | @name = name 20 | end 21 | 22 | def self.excluded?(locale) 23 | Multilingual::LanguageExclusion.get(KEY, locale) 24 | end 25 | 26 | def self.enabled?(locale) 27 | Multilingual::Language.exists?(locale) && !excluded?(locale) && 28 | !Multilingual::ContentTag::Conflict.exists?(locale) 29 | end 30 | 31 | def self.all 32 | Multilingual::Cache.wrap(KEY) { Multilingual::Language.all.select { |k, v| !excluded?(k) } } 33 | end 34 | 35 | def self.list 36 | self 37 | .all 38 | .select { |k, v| self.enabled?(k) } 39 | .map { |k, v| self.new(k, v["nativeName"]) } 40 | .sort_by(&:locale) 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /lib/multilingual/language/exclusion.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::LanguageExclusion 3 | KEY = "language_exclusion".freeze 4 | 5 | def self.all 6 | Multilingual::Cache.wrap(KEY) { all_uncached } 7 | end 8 | 9 | def self.all_uncached 10 | PluginStore.get(Multilingual::PLUGIN_NAME, KEY) || {} 11 | end 12 | 13 | def self.list(type) 14 | all[type] || [] 15 | end 16 | 17 | def self.get(type, locale) 18 | list(type).include?(locale.to_s) 19 | end 20 | 21 | def self.set(locale, type, params = {}) 22 | locale = locale.to_s 23 | enabled = ActiveModel::Type::Boolean.new.cast(params[:enabled]) 24 | exclusions = all_uncached[type] || [] 25 | 26 | return if enabled && exclusions.blank? 27 | 28 | if enabled 29 | exclusions.delete(locale) 30 | else 31 | exclusions.push(locale) unless (exclusions.include?(locale) || locale == "en") 32 | end 33 | 34 | data = all_uncached 35 | data[type] = exclusions 36 | 37 | PluginStore.set(Multilingual::PLUGIN_NAME, KEY, data) 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/multilingual/language/interface.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::InterfaceLanguage 3 | include ActiveModel::Serialization 4 | 5 | attr_reader :locale, :name 6 | 7 | KEY = "interface_language".freeze 8 | 9 | def initialize(locale, name) 10 | @locale = locale 11 | @name = name 12 | end 13 | 14 | def self.excluded?(locale) 15 | Multilingual::LanguageExclusion.get(KEY, locale) 16 | end 17 | 18 | def self.supported?(locale) 19 | self.all.include?(locale.to_s) 20 | end 21 | 22 | def self.enabled?(locale) 23 | Multilingual::Language.exists?(locale) && supported?(locale) && !excluded?(locale) 24 | end 25 | 26 | def self.all 27 | Multilingual::Cache.wrap(KEY) { ::LocaleSiteSetting.supported_locales } 28 | end 29 | 30 | def self.list 31 | self 32 | .all 33 | .select { |locale| self.enabled?(locale) } 34 | .map { |locale| self.new(locale, Multilingual::Language.all[locale]["nativeName"]) } 35 | .sort_by(&:locale) 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /lib/multilingual/locale_loader.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class ::Multilingual::LocaleLoader 3 | attr_reader :controller 4 | 5 | delegate :request, to: :controller 6 | delegate :helpers, to: :controller, private: true 7 | delegate :asset_path, to: :helpers 8 | 9 | def initialize(controller) 10 | @controller = controller 11 | end 12 | 13 | def current_locale 14 | I18n.locale.to_s 15 | end 16 | 17 | def custom_locale? 18 | Multilingual::CustomLanguage.is_custom?(current_locale) 19 | end 20 | 21 | def preload_i18n 22 | helpers.preload_script("locales/i18n") 23 | end 24 | 25 | def preload_custom_locale 26 | helpers.preload_script_url(ExtraLocalesController.url("custom-language")) 27 | end 28 | 29 | def preload_tag_translations 30 | helpers.preload_script_url(ExtraLocalesController.url("tags")) 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /lib/multilingual/multilingual.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module Multilingual 3 | PLUGIN_NAME = "discourse-multilingual".freeze 4 | PLUGIN_PATH = "#{Rails.root}/plugins/discourse-multilingual" 5 | 6 | class Engine < ::Rails::Engine 7 | engine_name "multilingual" 8 | isolate_namespace Multilingual 9 | end 10 | 11 | def self.setup 12 | Multilingual::Language.setup 13 | Multilingual::Cache.setup 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/multilingual/translation/locale.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::TranslationLocale 3 | def self.register(file) 4 | locale = file.locale.to_s 5 | type = file.file_type.to_s 6 | 7 | opts = {} 8 | opts["#{type}_locale_file".to_sym] = file.file_name 9 | 10 | locale_chain = locale.split("_") 11 | opts[:fallbackLocale] = locale_chain.first if locale_chain.length === 2 12 | 13 | current_locale = DiscoursePluginRegistry.locales[locale] || {} 14 | new_locale = current_locale.merge(opts) 15 | 16 | DiscoursePluginRegistry.register_locale(locale, new_locale) 17 | LocaleSiteSetting.reset! 18 | end 19 | 20 | def self.deregister(file) 21 | DiscoursePluginRegistry.locales.delete(file.locale.to_s) 22 | LocaleSiteSetting.reset! 23 | end 24 | 25 | def self.load 26 | files.each { |file| register(file) } 27 | end 28 | 29 | def self.files 30 | Multilingual::CustomTranslation.by_type(%i[client server]) 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /lib/multilingual/translator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | class Multilingual::Translator 3 | def self.lang_field 4 | "DiscourseTranslator".constantize::DETECTED_LANG_CUSTOM_FIELD 5 | end 6 | 7 | def self.enabled? 8 | SiteSetting.respond_to?(:translator_enabled) && SiteSetting.translator_enabled 9 | end 10 | 11 | def self.content_tag_sync_allowed? 12 | Multilingual::ContentLanguage.enabled && enabled? 13 | end 14 | 15 | def self.content_tag_sync_enabled 16 | content_tag_sync_allowed? && SiteSetting.multilingual_translator_content_tag_sync 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/validators/content_languages_validator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ContentLanguagesValidator 4 | def initialize(opts = {}) 5 | @opts = opts 6 | end 7 | 8 | def valid_value?(val) 9 | val == "f" || (val == "t" && SiteSetting.multilingual_enabled) 10 | end 11 | 12 | def error_message 13 | I18n.t("site_settings.errors.multilingual_disabled") if !SiteSetting.multilingual_enabled 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/validators/language_switcher_validator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class LanguageSwitcherValidator 4 | def initialize(opts = {}) 5 | @opts = opts 6 | end 7 | 8 | def valid_value?(val) 9 | val == "off" || (%w[footer header].include?(val) && SiteSetting.allow_user_locale) 10 | end 11 | 12 | def error_message 13 | if !SiteSetting.multilingual_enabled 14 | I18n.t("site_settings.errors.multilingual_disabled") 15 | elsif !SiteSetting.allow_user_locale 16 | I18n.t("site_settings.errors.multilingual_allow_user_locale_disabled") 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/validators/translator_content_tag_validator.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class TranslatorContentTagValidator 4 | def initialize(opts = {}) 5 | @opts = opts 6 | end 7 | 8 | def valid_value?(val) 9 | val == "f" || (val == "t" && Multilingual::Translator.content_tag_sync_allowed?) 10 | end 11 | 12 | def error_message 13 | if !SiteSetting.multilingual_enabled 14 | I18n.t("site_settings.errors.multilingual_disabled") 15 | elsif !SiteSetting.multilingual_content_languages_enabled 16 | I18n.t("site_settings.errors.multilingual_content_languages_disabled") 17 | elsif !Multilingual::Translator.enabled? 18 | I18n.t("site_settings.errors.multilingual_translator_disabled") 19 | end 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discourse-multilingual", 3 | "version": "1.0.0", 4 | "repository": "git@github.com:paviliondev/discourse-multilingual.git", 5 | "author": "Pavilion", 6 | "license": "GPL V2", 7 | "devDependencies": { 8 | "@discourse/lint-configs": "2.2.2", 9 | "ember-template-lint": "6.0.0", 10 | "eslint": "9.15.0", 11 | "eslint-config-discourse": "^3.6.0", 12 | "prettier": "2.8.8" 13 | }, 14 | "private": true 15 | } 16 | -------------------------------------------------------------------------------- /spec/components/multilingual/content_tag_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require_relative "../../plugin_helper" 4 | 5 | describe Multilingual::ContentTag do 6 | fab!(:tag1) { Fabricate(:tag, name: "tag1") } 7 | 8 | before do 9 | SiteSetting.multilingual_enabled = true 10 | SiteSetting.multilingual_content_languages_enabled = true 11 | Multilingual::ContentTag.bulk_update(["aa"], "enable") 12 | Multilingual::ContentTag.update_all 13 | end 14 | 15 | it "should create tags" do 16 | language_tag = Tag.find_by(name: "aa") 17 | expect(language_tag.present?).to eq(true) 18 | expect(language_tag.tag_groups.first.id).to eq( 19 | TagGroup.where(name: Multilingual::ContentTag::GROUP).first.id, 20 | ) 21 | end 22 | 23 | it "should filter topic tags" do 24 | Tag.find_by(name: "aa") 25 | topic = Fabricate(:topic, tags: [tag1, Tag.find_by(name: "aa")]) 26 | expect(Multilingual::ContentTag.filter(topic.tags).map(&:name)).to include("aa") 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /spec/components/tag_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require_relative "../plugin_helper" 4 | 5 | describe Tag do 6 | fab!(:tag1) { Fabricate(:tag, name: "fun") } 7 | fab!(:tag2) { Fabricate(:tag, name: "fun2") } 8 | fab!(:public_category) { Fabricate(:category) } 9 | 10 | before do 11 | SiteSetting.tagging_enabled = true 12 | SiteSetting.multilingual_enabled = true 13 | SiteSetting.multilingual_content_languages_enabled = true 14 | 15 | Multilingual::Cache.new(Multilingual::ContentTag::KEY).delete 16 | Multilingual::ContentTag.update_all 17 | end 18 | 19 | it "top_tags doesn't include content language tags" do 20 | Fabricate(:topic, category: public_category, tags: [tag1, tag2, Tag.find_by(name: "fr")]) 21 | expect( 22 | Tag.top_tags(category: public_category, guardian: Guardian.new(Fabricate(:user))), 23 | ).not_to include(Tag.find_by(name: "fr").name) 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /spec/fixtures/category_description.wbp.yml: -------------------------------------------------------------------------------- 1 | welcome: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Egestas pretium aenean pharetra magna ac placerat vestibulum lectus mauris. Maecenas sed enim ut sem viverra aliquet eget sit amet. Sodales neque sodales ut etiam sit amet. Morbi quis commodo odio aenean sed adipiscing diam donec adipiscing." 2 | clients: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Eget aliquet nibh praesent tristique magna. Senectus et netus et malesuada fames. Sodales neque sodales ut etiam sit amet. Tellus mauris a diam maecenas sed enim ut sem.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Eget aliquet nibh praesent tristique magna. Senectus et netus et malesuada fames. Sodales neque sodales ut etiam sit amet. Tellus mauris a diam maecenas sed enim ut sem." 3 | knowledge: 4 | _: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Neque aliquam vestibulum morbi blandit. Libero id faucibus nisl tincidunt eget nullam non nisi. Ac odio tempor orci dapibus ultrices in. Vitae justo eget magna fermentum iaculis eu non." 5 | clients: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In nisl nisi scelerisque eu ultrices. Sollicitudin tempor id eu nisl. Enim sit amet venenatis urna cursus eget nunc. Iaculis eu non diam phasellus vestibulum." -------------------------------------------------------------------------------- /spec/fixtures/category_name.wbp.yml: -------------------------------------------------------------------------------- 1 | welcome: pardu-pardu-mani 2 | clients: kalyardi 3 | knowledge: 4 | _: milya-pinyi 5 | clients: kalyardi milya-pinyi -------------------------------------------------------------------------------- /spec/fixtures/client.fr.yml: -------------------------------------------------------------------------------- 1 | fr: 2 | js: 3 | filters: 4 | latest: 5 | title: "Wowah" 6 | -------------------------------------------------------------------------------- /spec/fixtures/client.wbp.yml: -------------------------------------------------------------------------------- 1 | wbp: 2 | js: 3 | filters: 4 | categories: 5 | title: "karlirr-kari" 6 | 7 | latest: 8 | title: "mintirlpari" 9 | 10 | unread: 11 | title: "waji-nyanyi" 12 | 13 | topic: 14 | create: "yirrarni" -------------------------------------------------------------------------------- /spec/fixtures/custom_languages.yml: -------------------------------------------------------------------------------- 1 | wbp: 2 | name: "Warlpiri" 3 | nativeName: "Warlpiri" -------------------------------------------------------------------------------- /spec/fixtures/server.wbp.yml: -------------------------------------------------------------------------------- 1 | wbp: 2 | title: "Rozprawiać" 3 | topics: "tematy" 4 | posts: "posty" 5 | views: 6 | mountain: "góry" 7 | sea: "morze" 8 | -------------------------------------------------------------------------------- /spec/fixtures/tag.wbp.yml: -------------------------------------------------------------------------------- 1 | pavilion: parnka 2 | follow: ngurra -------------------------------------------------------------------------------- /spec/models/tag_group_extension_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require_relative "../plugin_helper" 4 | 5 | describe TagGroup do 6 | before do 7 | SiteSetting.tagging_enabled = true 8 | SiteSetting.multilingual_enabled = true 9 | SiteSetting.multilingual_content_languages_enabled = true 10 | end 11 | 12 | it "when enabled dont include special Tag Groups in list of visible Tag Groups" do 13 | anon_guardian = Guardian.new 14 | user_guardian = Guardian.new(Fabricate(:user)) 15 | 16 | # Test only valid if there are exactly 2 groups that are special Multilingual Content Tag Groups 17 | expect(Multilingual::ContentTag.groups.count).to eq(2) 18 | 19 | expect(TagGroup.visible(anon_guardian)).not_to include(Multilingual::ContentTag.groups.first) 20 | expect(TagGroup.visible(anon_guardian)).not_to include(Multilingual::ContentTag.groups.second) 21 | expect(TagGroup.visible(user_guardian)).not_to include(Multilingual::ContentTag.groups.first) 22 | expect(TagGroup.visible(user_guardian)).not_to include(Multilingual::ContentTag.groups.second) 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/plugin_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | ## The plugin store is not wiped between each test 3 | 4 | require "webmock/rspec" 5 | 6 | RSpec.configure do |config| 7 | config.before(:each) { ActiveRecord::Base.connection.begin_transaction(joinable: false) } 8 | 9 | config.after(:each) { ActiveRecord::Base.connection.rollback_transaction } 10 | 11 | config.around(:each) { |example| allow_missing_translations { example.run } } 12 | end 13 | 14 | require "rails_helper" 15 | -------------------------------------------------------------------------------- /spec/requests/application_controller_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | require_relative "../plugin_helper" 3 | 4 | describe ApplicationController do 5 | before do 6 | SiteSetting.multilingual_enabled = true 7 | SiteSetting.allow_user_locale = true 8 | SiteSetting.multilingual_guest_language_switcher = "header" 9 | Multilingual::Language.setup 10 | end 11 | 12 | def locale_scripts(body) 13 | Nokogiri::HTML5 14 | .parse(body) 15 | .css('script[src*="assets/locales/"]') 16 | .map { |script| script.attributes["src"].value } 17 | end 18 | 19 | # Using /bootstrap.json because discourse/spec/requests/application_controller_spec.rb does 20 | it "allows locale to be set via query params" do 21 | get "/latest?locale=fr" 22 | expect(response.status).to eq(200) 23 | expect(locale_scripts(response.body)).to include("/assets/locales/fr.js") 24 | end 25 | 26 | it "allows locale to be set via a cookie" do 27 | get "/latest", headers: { Cookie: "discourse_locale=fr" } 28 | expect(response.status).to eq(200) 29 | expect(locale_scripts(response.body)).to include("/assets/locales/fr.js") 30 | end 31 | 32 | it "doesnt leak after requests" do 33 | get "/latest", headers: { Cookie: "discourse_locale=fr" } 34 | expect(response.status).to eq(200) 35 | expect(locale_scripts(response.body)).to include("/assets/locales/fr.js") 36 | expect(I18n.locale.to_s).to eq(SiteSettings::DefaultsProvider::DEFAULT_LOCALE) 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /spec/requests/multilingual/admin_controller_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | require_relative "../../plugin_helper" 3 | 4 | describe Multilingual::AdminController do 5 | fab!(:admin_user) { Fabricate(:user, admin: true) } 6 | 7 | before { sign_in(admin_user) } 8 | 9 | it "returns the content_language_tag_group_id" do 10 | sign_in(admin_user) 11 | get "/admin/multilingual.json" 12 | expect(response.status).to eq(200) 13 | expect(response.parsed_body["content_language_tag_group_id"]).to be_present 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /svg-icons/translate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Translate 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /test/javascripts/acceptance/content-languages-tags-test.js: -------------------------------------------------------------------------------- 1 | import { visit } from "@ember/test-helpers"; 2 | import { test } from "qunit"; 3 | import { acceptance } from "discourse/tests/helpers/qunit-helpers"; 4 | import { topicList } from "../fixtures/topic-list"; 5 | 6 | const content_languages = [{ locale: "aa", name: "Qafár af" }]; 7 | 8 | acceptance("Content language tags", function (needs) { 9 | needs.user(); 10 | needs.settings({ 11 | multilingual_enabled: true, 12 | multilingual_content_languages_enabled: true, 13 | tagging_enabled: true, 14 | }); 15 | needs.site({ content_languages }); 16 | 17 | needs.pretender((server) => { 18 | server.get("/latest.json", () => topicList); 19 | }); 20 | 21 | test("displays content language tags correctly", async (assert) => { 22 | await visit("/"); 23 | 24 | assert.dom(".discourse-tag.content-language-tag").hasText("Qafár af"); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /test/javascripts/acceptance/translate-tag-test.js: -------------------------------------------------------------------------------- 1 | import { test } from "qunit"; 2 | import { acceptance } from "discourse/tests/helpers/qunit-helpers"; 3 | import I18n from "I18n"; 4 | import { multilingualTagTranslator } from "discourse/plugins/discourse-multilingual/discourse/lib/multilingual-tag"; 5 | import { tag_translations } from "../fixtures/tag-translations"; 6 | 7 | acceptance("Translated tags", function () { 8 | I18n.tag_translations = tag_translations; 9 | 10 | test("translates included data correctly", async (assert) => { 11 | I18n.locale = "fr"; 12 | assert.equal(I18n.currentLocale(), "fr"); 13 | assert.equal(multilingualTagTranslator("motor-car"), "voiture"); 14 | }); 15 | 16 | test("doesn't translate tag when data does not include translation", async (assert) => { 17 | I18n.locale = "en"; 18 | assert.equal(I18n.currentLocale(), "en"); 19 | assert.equal(multilingualTagTranslator("motor-car"), "motor-car"); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /test/javascripts/fixtures/tag-translations.js: -------------------------------------------------------------------------------- 1 | export const tag_translations = { 2 | fr: { 3 | "motor-car": "voiture", 4 | "bubble-gum": "gomme-à-bulles", 5 | music: "musique", 6 | compliment: "féliciter", 7 | }, 8 | }; 9 | --------------------------------------------------------------------------------