Sari la conținut

Crearea unui selector de limbă personalizat în Hugo PaperMod

Ghid pas cu pas pentru implementarea unui selector de limbă dropdown personalizat în tema Hugo PaperMod, perfect pentru site-urile multilingve cu multe opțiuni de limbă

3 minute

De ce să creezi un selector de limbă personalizat?

În timp ce tema Hugo PaperMod include o funcție încorporată de selecție a limbii, aceasta afișează pur și simplu toate limbile disponibile în antet. Pentru blog-urile care susțin multe limbi (precum Look Scanned, care susține peste 20), această abordare îngrămădește antetul cu opțiuni de limbă. Un selector de limbă dropdown personalizat oferă o soluție mai elegantă.

Selectorul de limbă implicit în tema Hugo PaperMod

Ghid de implementare

Localizează și suprascrie layout-ul original

Selectorul de limbă original este definit în themes/PaperMod/layouts/partials/header.html. Pentru a-l personaliza, trebuie să creăm propria versiune în layouts/partials/header.html. Iată implementarea originală:

{{- $lang := .Lang}} {{- $separator := or $label_text (not
site.Params.disableThemeToggle)}} {{- with site.Home.Translations }}
<ul class="lang-switch">
  {{- if $separator }}
  <li>|</li>
  {{ end }} {{- range . -}} {{- if ne $lang .Lang }}
  <li>
    <a
      href="{{- .Permalink -}}"
      title="{{ .Language.Params.languageAltTitle | default (.Language.LanguageName | emojify) | default (.Lang | title) }}"
      aria-label="{{ .Language.LanguageName | default (.Lang | title) }}"
    >
      {{- if (and site.Params.displayFullLangName (.Language.LanguageName)) }}
      {{- .Language.LanguageName | emojify -}} {{- else }} {{- .Lang | title -}}
      {{- end -}}
    </a>
  </li>
  {{- end -}} {{- end}}
</ul>
{{- end }}

Creează selectorul dropdown personalizat

Implementarea noastră personalizată folosește o pictogramă de limbă din ionicons5 ca buton de declanșare, care dezvăluie un meniu dropdown care conține toate limbile disponibile. Iată implementarea:

{{- $lang := .Lang }}
{{- $separator := or $label_text (not site.Params.disableThemeToggle)}}
{{- with site.Home.Translations }}
{{- if $separator }}<span class="nav-separator">|</span>{{ end }}
<div class="lang-select-dropdown">
    <!-- Buton pictogramă limbă -->
    <button class="lang-select-dropdown-trigger" aria-label="{{- i18n "translations" | default "Traduceri" }}" type="button">
        <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512" width="24" height="18"><path d="M478.33 433.6l-90-218a22 22 0 0 0-40.67 0l-90 218a22 22 0 1 0 40.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 0 0 458 464a22 22 0 0 0 20.32-30.4zM334.83 362L368 281.65L401.17 362z" fill="currentColor"></path><path d="M267.84 342.92a22 22 0 0 0-4.89-30.7c-.2-.15-15-11.13-36.49-34.73c39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 0 0 0-44H214V70a22 22 0 0 0-44 0v20H54a22 22 0 0 0 0 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36c-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 0 0-40.58 17c.58 1.38 14.55 34.23 52.86 83.93c.92 1.19 1.83 2.35 2.74 3.51c-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1 0 21.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59c22.52 24.08 38 35.44 38.93 36.1a22 22 0 0 0 30.75-4.9z" fill="currentColor"></path></svg>
    </button>
    <!-- Conținutul dropdown -->
    <div class="lang-select-dropdown-content">
        {{- range . -}}
        {{- if ne $lang .Lang }}
        <a lang="{{ .Lang }}" href="{{- .Permalink -}}" title="{{ .Language.Params.languageAltTitle | default (.Language.LanguageName | emojify) | default (.Lang | title) }}"
            aria-label="{{ .Language.LanguageName | default (.Lang | title) }}">
            {{- if (and site.Params.displayFullLangName (.Language.LanguageName)) }}
            {{- .Language.LanguageName | emojify -}}
            {{- else }}
            {{- .Lang | title -}}
            {{- end -}}
        </a>
        {{- end -}}
        {{- end}}
    </div>
</div>
{{- end }}

Adaugă stilizarea

Pentru ca dropdown-ul să funcționeze fără probleme și să pară consecvent cu tema, adaugă următorul CSS:

.lang-select-dropdown {
  position: relative;
  display: inline-block;
}

.lang-select-dropdown-content {
  top: 50px;
  display: none;
  position: absolute;
  background-color: var(--entry);
  border-radius: var(--radius);
  border: 1px solid var(--border);
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 1;
  max-height: calc(min(20em, 100vh - 100px));
  overflow-y: auto;
  overflow-x: hidden;
}

.lang-select-dropdown-content a {
  font-size: 14px;
  font-weight: inherit;
  line-height: 1;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  white-space: nowrap;
  transition: background-color 0.1s ease-in-out;
}

.lang-select-dropdown-content a:hover {
  background-color: #f1f1f1;
}

.lang-select-dropdown:hover .lang-select-dropdown-content {
  display: block;
}

.lang-select-dropdown-trigger {
  height: 100%;
  font-size: 26px;
  margin: auto 4px;
}

.nav-separator {
  margin: auto 4px;
}

Rezultatul este un selector de limbă curat, bazat pe dropdown, care apare când planezi cu mouse-ul peste pictograma de limbă:

Selectorul de limbă personalizat în tema Hugo PaperMod

Poți găsi implementarea completă în acest commit GitHub.

Referință

Traduceri: Afrikaans , العربية , বাংলা , Čeština , Deutsch , Ελληνικά , English , Español , Filipino , Français , עברית , हिन्दी , Magyar , Bahasa Indonesia , Italiano , 日本語 , 한국어 , Bahasa Melayu , Nederlands , Polski , Português , Русский , Svenska , Kiswahili , ไทย , Türkçe , Українська , اردو , Tiếng Việt , 繁體中文 , 简体中文
Căutare