2
0
Files
gitcaddy-server/templates/repo/settings/pages_languages.tmpl
logikonline 965ef8966f
All checks were successful
Build and Release / Create Release (push) Successful in 0s
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 4m4s
Build and Release / Unit Tests (push) Successful in 4m38s
Build and Release / Lint (push) Successful in 6m26s
Build and Release / Build Binaries (amd64, darwin, macos) (push) Successful in 3m52s
Build and Release / Build Binaries (amd64, linux, linux-latest) (push) Successful in 4m52s
Build and Release / Build Binaries (amd64, windows, windows-latest) (push) Successful in 9h5m22s
Build and Release / Build Binaries (arm64, darwin, macos) (push) Successful in 3m38s
Build and Release / Build Binary (linux/arm64) (push) Successful in 7m46s
feat(pages): add navigation label translation support
Add translation support for navigation section labels (Value Props, Features, Pricing, Blog, Gallery, Compare, etc.). Adds TemplateDefaultLabels function that returns template-specific creative names (e.g., "Systems Analysis" for value props in Architecture Deep Dive). Auto-applies defaults when enabling pages or changing templates. Includes UI fields in languages settings and translation JSON serialization. Enables full localization of section headings.
2026-03-17 23:34:29 -04:00

419 lines
21 KiB
Handlebars

{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings pages")}}
<div class="user-main-content twelve wide column">
<h4 class="ui top attached header">
{{ctx.Locale.Tr "repo.settings.pages.languages"}}
</h4>
<div class="ui attached segment">
<form class="ui form" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="update_i18n">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.default_lang"}}</label>
<select name="default_lang" class="ui dropdown">
{{range $code, $name := .LanguageNames}}
<option value="{{$code}}" {{if eq $code $.Config.I18n.DefaultLang}}selected{{end}}>{{$name}}</option>
{{end}}
</select>
<p class="help">{{ctx.Locale.Tr "repo.settings.pages.default_lang_help"}}</p>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.enabled_languages"}}</label>
<p class="help">{{ctx.Locale.Tr "repo.settings.pages.enabled_languages_help"}}</p>
<div class="grouped fields">
{{range $code, $name := .LanguageNames}}
<div class="field">
<div class="ui checkbox">
<input type="checkbox" name="languages" value="{{$code}}" {{if index $.EnabledLangs $code}}checked{{end}}>
<label>{{$name}} ({{$code}})</label>
</div>
</div>
{{end}}
</div>
</div>
<div class="field">
<button class="ui primary button">{{ctx.Locale.Tr "repo.settings.pages.save_languages"}}</button>
</div>
</form>
</div>
{{if .Config.I18n.Languages}}
<h4 class="ui top attached header tw-mt-4">
{{ctx.Locale.Tr "repo.settings.pages.translations"}}
</h4>
<div class="ui attached segment">
{{/* Action bar: language selector + buttons */}}
<div class="tw-flex tw-flex-wrap tw-gap-2 tw-items-center tw-mb-4">
<select id="lang-selector" class="ui dropdown" style="min-width:200px;">
{{range .Config.I18n.Languages}}
{{if ne . $.Config.I18n.DefaultLang}}
<option value="{{.}}">{{index $.LanguageNames .}} ({{.}}) {{if index $.TranslationMap .}}{{end}}</option>
{{end}}
{{end}}
</select>
{{if .AIEnabled}}
<form method="post" class="tw-inline-block" id="ai-translate-form">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="ai_translate">
<input type="hidden" name="target_lang" id="ai-translate-lang" value="">
<button class="ui purple tiny button" type="submit">{{svg "octicon-copilot" 14}} {{ctx.Locale.Tr "repo.settings.pages.ai_translate"}}</button>
</form>
<form method="post" class="tw-inline-block" id="ai-translate-all-form">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="ai_translate_all">
<button class="ui purple tiny button" type="submit">{{svg "octicon-copilot" 14}} {{ctx.Locale.Tr "repo.settings.pages.ai_translate_all"}}</button>
</form>
{{end}}
<form method="post" class="tw-inline-block" id="delete-translation-form" style="display:none;">
{{.CsrfTokenHtml}}
<input type="hidden" name="action" value="delete_translation">
<input type="hidden" name="target_lang" id="delete-translate-lang" value="">
<button class="ui red tiny button" type="submit">{{svg "octicon-trash" 14}} {{ctx.Locale.Tr "repo.settings.pages.delete_translation"}}</button>
</form>
</div>
<div id="ai-translate-loading" class="tw-hidden tw-py-4">
<div class="ui active centered inline loader"></div>
<p class="tw-text-center tw-mt-2" style="color:var(--color-text-light);">{{ctx.Locale.Tr "repo.settings.pages.ai_translating"}}</p>
</div>
{{/* Language panels (one per non-default language, only one visible at a time) */}}
{{range .Config.I18n.Languages}}
{{if ne . $.Config.I18n.DefaultLang}}
<div class="lang-panel" id="lang-panel-{{.}}" style="display:none;">
<form class="ui form" method="post">
{{$.CsrfTokenHtml}}
<input type="hidden" name="action" value="save_translation">
<input type="hidden" name="target_lang" value="{{.}}">
{{$trans := index $.TranslationMap .}}
{{/* Brand */}}
{{if or $.Config.Brand.Name $.Config.Brand.Tagline}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_brand"}}</h5>
{{if $.Config.Brand.Name}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_brand_name"}}</label>
<input name="trans_brand_name" value="{{if $trans}}{{$trans.BrandName}}{{end}}" placeholder="{{$.Config.Brand.Name}}">
</div>
{{end}}
{{if $.Config.Brand.Tagline}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_brand_tagline"}}</label>
<input name="trans_brand_tagline" value="{{if $trans}}{{$trans.BrandTagline}}{{end}}" placeholder="{{$.Config.Brand.Tagline}}">
</div>
{{end}}
{{end}}
{{/* Hero */}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_hero"}}</h5>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_headline"}}</label>
<input name="trans_headline" value="{{if $trans}}{{$trans.Headline}}{{end}}" placeholder="{{$.Config.Hero.Headline}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_subheadline"}}</label>
<input name="trans_subheadline" value="{{if $trans}}{{$trans.Subheadline}}{{end}}" placeholder="{{$.Config.Hero.Subheadline}}">
</div>
<div class="two fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_primary_cta"}}</label>
<input name="trans_primary_cta" value="{{if $trans}}{{$trans.PrimaryCTA}}{{end}}" placeholder="{{$.Config.Hero.PrimaryCTA.Label}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_secondary_cta"}}</label>
<input name="trans_secondary_cta" value="{{if $trans}}{{$trans.SecondaryCTA}}{{end}}" placeholder="{{$.Config.Hero.SecondaryCTA.Label}}">
</div>
</div>
{{/* Stats */}}
{{if $.Config.Stats}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_stats"}}</h5>
{{range $i, $s := $.Config.Stats}}
<div class="two fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_stat_value"}} — <em>{{$s.Value}}</em></label>
<input name="trans_stat_{{$i}}_value" value="{{if $trans}}{{index $trans.StatsValues $i}}{{end}}" placeholder="{{$s.Value}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_stat_label"}} — <em>{{$s.Label}}</em></label>
<input name="trans_stat_{{$i}}_label" value="{{if $trans}}{{index $trans.StatsLabels $i}}{{end}}" placeholder="{{$s.Label}}">
</div>
</div>
{{end}}
{{end}}
{{/* Value Props */}}
{{if $.Config.ValueProps}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_value_props"}}</h5>
{{range $i, $vp := $.Config.ValueProps}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_title"}} — <em>{{$vp.Title}}</em></label>
<input name="trans_vp_{{$i}}_title" value="{{if $trans}}{{index $trans.ValuePropTitles $i}}{{end}}" placeholder="{{$vp.Title}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_description"}}</label>
<input name="trans_vp_{{$i}}_desc" value="{{if $trans}}{{index $trans.ValuePropDescs $i}}{{end}}" placeholder="{{$vp.Description}}">
</div>
{{end}}
{{end}}
{{/* Features */}}
{{if $.Config.Features}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_features"}}</h5>
{{range $i, $f := $.Config.Features}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_title"}} — <em>{{$f.Title}}</em></label>
<input name="trans_feat_{{$i}}_title" value="{{if $trans}}{{index $trans.FeatureTitles $i}}{{end}}" placeholder="{{$f.Title}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_description"}}</label>
<input name="trans_feat_{{$i}}_desc" value="{{if $trans}}{{index $trans.FeatureDescs $i}}{{end}}" placeholder="{{$f.Description}}">
</div>
{{end}}
{{end}}
{{/* Testimonials */}}
{{if $.Config.SocialProof.Testimonials}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_testimonials"}}</h5>
{{range $i, $t := $.Config.SocialProof.Testimonials}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_quote"}} — <em>{{$t.Author}}</em></label>
<textarea name="trans_test_{{$i}}_quote" rows="2" placeholder="{{$t.Quote}}">{{if $trans}}{{index $trans.TestimonialQuotes $i}}{{end}}</textarea>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_role"}}</label>
<input name="trans_test_{{$i}}_role" value="{{if $trans}}{{index $trans.TestimonialRoles $i}}{{end}}" placeholder="{{$t.Role}}">
</div>
{{end}}
{{end}}
{{/* Pricing */}}
{{if or $.Config.Pricing.Headline $.Config.Pricing.Plans}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_pricing"}}</h5>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_pricing_headline"}}</label>
<input name="trans_pricing_headline" value="{{if $trans}}{{$trans.PricingHeadline}}{{end}}" placeholder="{{$.Config.Pricing.Headline}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_pricing_subheadline"}}</label>
<input name="trans_pricing_subheadline" value="{{if $trans}}{{$trans.PricingSubheadline}}{{end}}" placeholder="{{$.Config.Pricing.Subheadline}}">
</div>
{{range $i, $p := $.Config.Pricing.Plans}}
<div class="three fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_plan_name"}} — <em>{{$p.Name}}</em></label>
<input name="trans_plan_{{$i}}_name" value="{{if $trans}}{{index $trans.PlanNames $i}}{{end}}" placeholder="{{$p.Name}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_plan_period"}}</label>
<input name="trans_plan_{{$i}}_period" value="{{if $trans}}{{index $trans.PlanPeriods $i}}{{end}}" placeholder="{{$p.Period}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_plan_cta"}}</label>
<input name="trans_plan_{{$i}}_cta" value="{{if $trans}}{{index $trans.PlanCTAs $i}}{{end}}" placeholder="{{$p.CTA}}">
</div>
</div>
{{end}}
{{end}}
{{/* CTA Section */}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_cta"}}</h5>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_cta_headline"}}</label>
<input name="trans_cta_headline" value="{{if $trans}}{{$trans.CTAHeadline}}{{end}}" placeholder="{{$.Config.CTASection.Headline}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_cta_subheadline"}}</label>
<input name="trans_cta_subheadline" value="{{if $trans}}{{$trans.CTASubheadline}}{{end}}" placeholder="{{$.Config.CTASection.Subheadline}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_cta_button"}}</label>
<input name="trans_cta_button" value="{{if $trans}}{{$trans.CTAButton}}{{end}}" placeholder="{{$.Config.CTASection.Button.Label}}">
</div>
{{/* Blog */}}
{{if $.Config.Blog.Enabled}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_blog"}}</h5>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_blog_headline"}}</label>
<input name="trans_blog_headline" value="{{if $trans}}{{$trans.BlogHeadline}}{{end}}" placeholder="{{if $.Config.Blog.Headline}}{{$.Config.Blog.Headline}}{{else}}Latest Posts{{end}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_blog_subheadline"}}</label>
<input name="trans_blog_subheadline" value="{{if $trans}}{{$trans.BlogSubheadline}}{{end}}" placeholder="{{$.Config.Blog.Subheadline}}">
</div>
{{if $.Config.Blog.CTAButton.Label}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_blog_cta"}}</label>
<input name="trans_blog_cta" value="{{if $trans}}{{$trans.BlogCTAButton}}{{end}}" placeholder="{{$.Config.Blog.CTAButton.Label}}">
</div>
{{end}}
{{end}}
{{/* Gallery */}}
{{if $.Config.Gallery.Enabled}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_gallery"}}</h5>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_gallery_headline"}}</label>
<input name="trans_gallery_headline" value="{{if $trans}}{{$trans.GalleryHeadline}}{{end}}" placeholder="{{if $.Config.Gallery.Headline}}{{$.Config.Gallery.Headline}}{{else}}Gallery{{end}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_gallery_subheadline"}}</label>
<input name="trans_gallery_subheadline" value="{{if $trans}}{{$trans.GallerySubheadline}}{{end}}" placeholder="{{$.Config.Gallery.Subheadline}}">
</div>
{{end}}
{{/* Comparison */}}
{{if $.Config.Comparison.Enabled}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_comparison"}}</h5>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_comparison_headline"}}</label>
<input name="trans_comparison_headline" value="{{if $trans}}{{$trans.ComparisonHeadline}}{{end}}" placeholder="{{if $.Config.Comparison.Headline}}{{$.Config.Comparison.Headline}}{{else}}How We Compare{{end}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_comparison_subheadline"}}</label>
<input name="trans_comparison_subheadline" value="{{if $trans}}{{$trans.ComparisonSubheadline}}{{end}}" placeholder="{{$.Config.Comparison.Subheadline}}">
</div>
{{end}}
{{/* Footer */}}
{{if or $.Config.Footer.Copyright $.Config.Footer.Links}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_footer"}}</h5>
{{if $.Config.Footer.Copyright}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_footer_copyright"}}</label>
<input name="trans_footer_copyright" value="{{if $trans}}{{$trans.FooterCopyright}}{{end}}" placeholder="{{$.Config.Footer.Copyright}}">
</div>
{{end}}
{{range $i, $link := $.Config.Footer.Links}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_footer_link"}} — <em>{{$link.Label}}</em></label>
<input name="trans_footer_link_{{$i}}" value="{{if $trans}}{{index $trans.FooterLinkLabels $i}}{{end}}" placeholder="{{$link.Label}}">
</div>
{{end}}
{{end}}
{{/* SEO */}}
{{if or $.Config.SEO.Title $.Config.SEO.Description}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_seo"}}</h5>
{{if $.Config.SEO.Title}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_seo_title"}}</label>
<input name="trans_seo_title" value="{{if $trans}}{{$trans.SEOTitle}}{{end}}" placeholder="{{$.Config.SEO.Title}}">
</div>
{{end}}
{{if $.Config.SEO.Description}}
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_seo_description"}}</label>
<textarea name="trans_seo_description" rows="2" placeholder="{{$.Config.SEO.Description}}">{{if $trans}}{{$trans.SEODescription}}{{end}}</textarea>
</div>
{{end}}
{{end}}
{{/* Navigation Labels */}}
<h5 class="ui dividing header">{{ctx.Locale.Tr "repo.settings.pages.trans_section_navigation"}}</h5>
<div class="two fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{$.Config.Navigation.LabelValueProps}}</em></label>
<input name="trans_nav_label_value_props" value="{{if $trans}}{{$trans.NavLabelValueProps}}{{end}}" placeholder="{{$.Config.Navigation.LabelValueProps}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{$.Config.Navigation.LabelFeatures}}</em></label>
<input name="trans_nav_label_features" value="{{if $trans}}{{$trans.NavLabelFeatures}}{{end}}" placeholder="{{$.Config.Navigation.LabelFeatures}}">
</div>
</div>
<div class="two fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{$.Config.Navigation.LabelBlog}}</em></label>
<input name="trans_nav_label_blog" value="{{if $trans}}{{$trans.NavLabelBlog}}{{end}}" placeholder="{{$.Config.Navigation.LabelBlog}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{$.Config.Navigation.LabelGallery}}</em></label>
<input name="trans_nav_label_gallery" value="{{if $trans}}{{$trans.NavLabelGallery}}{{end}}" placeholder="{{$.Config.Navigation.LabelGallery}}">
</div>
</div>
<div class="two fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{$.Config.Navigation.LabelPricing}}</em></label>
<input name="trans_nav_label_pricing" value="{{if $trans}}{{$trans.NavLabelPricing}}{{end}}" placeholder="{{$.Config.Navigation.LabelPricing}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{$.Config.Navigation.LabelCompare}}</em></label>
<input name="trans_nav_label_compare" value="{{if $trans}}{{$trans.NavLabelCompare}}{{end}}" placeholder="{{$.Config.Navigation.LabelCompare}}">
</div>
</div>
<div class="two fields">
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{if $.Config.Navigation.LabelDocs}}{{$.Config.Navigation.LabelDocs}}{{else}}Docs{{end}}</em></label>
<input name="trans_nav_label_docs" value="{{if $trans}}{{$trans.NavLabelDocs}}{{end}}" placeholder="{{if $.Config.Navigation.LabelDocs}}{{$.Config.Navigation.LabelDocs}}{{else}}Docs{{end}}">
</div>
<div class="field">
<label>{{ctx.Locale.Tr "repo.settings.pages.trans_nav_label"}} — <em>{{if $.Config.Navigation.LabelReleases}}{{$.Config.Navigation.LabelReleases}}{{else}}Releases{{end}}</em></label>
<input name="trans_nav_label_releases" value="{{if $trans}}{{$trans.NavLabelReleases}}{{end}}" placeholder="{{if $.Config.Navigation.LabelReleases}}{{$.Config.Navigation.LabelReleases}}{{else}}Releases{{end}}">
</div>
</div>
<div class="field">
<button class="ui primary tiny button">{{ctx.Locale.Tr "repo.settings.pages.save_translation"}}</button>
</div>
</form>
</div>
{{end}}
{{end}}
</div>
{{end}}
</div>
<script>
(function() {
var selector = document.getElementById('lang-selector');
if (!selector) return;
var aiForm = document.getElementById('ai-translate-form');
var aiLangInput = document.getElementById('ai-translate-lang');
var deleteForm = document.getElementById('delete-translation-form');
var deleteLangInput = document.getElementById('delete-translate-lang');
function showPanel() {
var lang = selector.value;
document.querySelectorAll('.lang-panel').forEach(function(p) { p.style.display = 'none'; });
var panel = document.getElementById('lang-panel-' + lang);
if (panel) panel.style.display = '';
// Update AI translate target
if (aiLangInput) aiLangInput.value = lang;
// Update delete button target + visibility
if (deleteLangInput) deleteLangInput.value = lang;
if (deleteForm) {
// Show delete button only if this language has a translation
var hasTranslation = selector.options[selector.selectedIndex].textContent.indexOf('\u2713') !== -1;
deleteForm.style.display = hasTranslation ? '' : 'none';
}
}
selector.addEventListener('change', showPanel);
// Show first language on load
showPanel();
// Loading spinners for AI translate buttons
function showTranslateLoading(form) {
if (!form) return;
form.addEventListener('submit', function() {
var btn = form.querySelector('button[type="submit"]');
btn.classList.add('loading', 'disabled');
btn.disabled = true;
// Hide all lang panels and action bar buttons, show loader
document.querySelectorAll('.lang-panel').forEach(function(p) { p.style.display = 'none'; });
var loading = document.getElementById('ai-translate-loading');
if (loading) loading.classList.remove('tw-hidden');
});
}
showTranslateLoading(document.getElementById('ai-translate-form'));
showTranslateLoading(document.getElementById('ai-translate-all-form'));
})();
</script>
{{template "repo/settings/layout_footer" .}}