mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 06:33:55 +08:00
a16faa27cd
When searching for site texts for admin using the english version of the text, previously we would show the english version in the results _even if_ there was another locale translated version available when a locale was selected from the dropdown. This commit adds a "Only show results in selected locale" checkbox option which will instead make it so the results shown are in the target locale, making it easier for translators to tell when there is actually translations vs. missing tranlsations.
169 lines
3.7 KiB
JavaScript
169 lines
3.7 KiB
JavaScript
import { tracked } from "@glimmer/tracking";
|
|
import Controller from "@ember/controller";
|
|
import { action } from "@ember/object";
|
|
import { service } from "@ember/service";
|
|
import { disableImplicitInjections } from "discourse/lib/implicit-injections";
|
|
import discourseDebounce from "discourse-common/lib/debounce";
|
|
import ReseedModal from "admin/components/modal/reseed";
|
|
|
|
let lastSearch;
|
|
|
|
@disableImplicitInjections
|
|
export default class AdminSiteTextIndexController extends Controller {
|
|
@service router;
|
|
@service siteSettings;
|
|
@service modal;
|
|
@service store;
|
|
|
|
@tracked locale;
|
|
@tracked q;
|
|
@tracked overridden;
|
|
@tracked outdated;
|
|
@tracked untranslated;
|
|
@tracked onlySelectedLocale;
|
|
|
|
@tracked model;
|
|
|
|
@tracked searching = false;
|
|
@tracked preferred = false;
|
|
|
|
queryParams = [
|
|
"q",
|
|
"overridden",
|
|
"outdated",
|
|
"locale",
|
|
"untranslated",
|
|
"onlySelectedLocale",
|
|
];
|
|
|
|
get resolvedOverridden() {
|
|
return [true, "true"].includes(this.overridden) ?? false;
|
|
}
|
|
|
|
get resolvedOutdated() {
|
|
return [true, "true"].includes(this.outdated) ?? false;
|
|
}
|
|
|
|
get resolvedUntranslated() {
|
|
return [true, "true"].includes(this.untranslated) ?? false;
|
|
}
|
|
|
|
get resolvedOnlySelectedLocale() {
|
|
return [true, "true"].includes(this.onlySelectedLocale) ?? false;
|
|
}
|
|
|
|
get resolvedLocale() {
|
|
return this.locale ?? this.siteSettings.default_locale;
|
|
}
|
|
|
|
get showUntranslated() {
|
|
return (
|
|
this.siteSettings.admin_allow_filter_untranslated_text &&
|
|
this.resolvedLocale !== "en"
|
|
);
|
|
}
|
|
|
|
async _performSearch() {
|
|
try {
|
|
this.model = await this.store.find("site-text", {
|
|
q: this.q,
|
|
overridden: this.resolvedOverridden,
|
|
outdated: this.resolvedOutdated,
|
|
locale: this.resolvedLocale,
|
|
untranslated: this.resolvedUntranslated,
|
|
only_selected_locale: this.resolvedOnlySelectedLocale,
|
|
});
|
|
} finally {
|
|
this.searching = false;
|
|
}
|
|
}
|
|
|
|
get availableLocales() {
|
|
return JSON.parse(this.siteSettings.available_locales);
|
|
}
|
|
|
|
get fallbackLocaleFullName() {
|
|
if (this.model.extras.fallback_locale) {
|
|
return this.availableLocales.find((l) => {
|
|
return l.value === this.model.extras.fallback_locale;
|
|
}).name;
|
|
}
|
|
}
|
|
|
|
@action
|
|
edit(siteText) {
|
|
this.router.transitionTo("adminSiteText.edit", siteText.get("id"), {
|
|
queryParams: {
|
|
locale: this.resolvedLocale,
|
|
},
|
|
});
|
|
}
|
|
|
|
@action
|
|
toggleOverridden() {
|
|
if (this.resolvedOverridden) {
|
|
this.overridden = null;
|
|
} else {
|
|
this.overridden = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
toggleOutdated() {
|
|
if (this.resolvedOutdated) {
|
|
this.outdated = null;
|
|
} else {
|
|
this.outdated = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
toggleUntranslated() {
|
|
if (this.resolvedUntranslated) {
|
|
this.untranslated = null;
|
|
} else {
|
|
this.untranslated = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
toggleOnlySelectedLocale() {
|
|
if (this.resolvedOnlySelectedLocale) {
|
|
this.onlySelectedLocale = null;
|
|
} else {
|
|
this.onlySelectedLocale = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
search() {
|
|
const q = this.q;
|
|
if (q !== lastSearch) {
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
lastSearch = q;
|
|
}
|
|
}
|
|
|
|
@action
|
|
updateLocale(value) {
|
|
this.searching = true;
|
|
this.locale = value;
|
|
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
showReseedModal() {
|
|
this.modal.show(ReseedModal);
|
|
}
|
|
}
|