├── .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 |
24 |
43 |
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 |
6 |
12 | <:content>
13 |
14 |
15 |
16 |
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 | Actions |
33 |
34 |
35 | {{#each this.translations as |translation|}}
36 |
40 | {{/each}}
41 |
42 |
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 |
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 |
25 | {{#if this.changingContentTags}}
26 | {{loading-spinner size="small"}}
27 | {{this.changingContentTags}}
28 | {{/if}}
29 |
30 | {{d-button
31 | class="btn-default"
32 | action=(action "updateContentTags")
33 | disabled=this.changingContentTags
34 | label="tagging.groups.content_tags.update.btn"
35 | }}
36 |
37 | {{d-button
38 | class="btn-danger"
39 | action=(action "destroyContentTags")
40 | icon="far-trash-can"
41 | disabled=this.changingContentTags
42 | label="tagging.groups.content_tags.delete.btn"
43 | }}
44 |
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 |
10 |
11 | {{yield}}
--------------------------------------------------------------------------------
/assets/javascripts/discourse/templates/components/multilingual-navigation.hbs:
--------------------------------------------------------------------------------
1 |
2 | {{nav-item
3 | route="adminMultilingualLanguages"
4 | label="multilingual.languages.title"
5 | }}
6 | {{nav-item
7 | route="adminMultilingualTranslations"
8 | label="multilingual.translations.title"
9 | }}
10 | {{nav-item
11 | route="tagGroups"
12 | routeParam=this.contentLanguageTagGroupId
13 | label="multilingual.content_languages.tags.title"
14 | icon="tag"
15 | }}
16 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------