Aggiungere stringhe localizzabili a temi e componenti del tema

Per chi desidera aggiungere lingue e traduzioni personalizzate a un tema o a un componente di tema di Discourse, è ora possibile includere stringhe localizzate, rese disponibili per l’uso nei componenti dell’interfaccia utente. Le traduzioni sono memorizzate nello stesso formato delle traduzioni di core/plugin e possono essere utilizzate in modo quasi identico.

I temi possono fornire file di traduzione in un formato simile a /locales/{locale}.yml. Questi file devono essere YAML validi, con una singola chiave di primo livello uguale alla locale definita. Possono essere definiti utilizzando la CLI discourse_theme, importando un .tar.gz, installando da un repository GIT o tramite l’editor su theme-creator.discourse.org.

Un file di locale di esempio potrebbe essere simile al seguente

en:
  theme_metadata:
    description: "This is a description for my theme"
    settings:
      theme_setting_name: "This is a description for the setting `theme_setting_name`"
      another_theme_setting_name:
        description: "This is a description for the setting `another_theme_setting_name``
  sidebar:
    welcome: "Welcome"
    back: "back,"
    welcome_subhead: "We're glad you're here!"
    likes_header: "Share the Love"
    badges_header: "Your Top Badges"
    full_profile: "View your full profile"

Gli amministratori possono sovrascrivere singole chiave su base per-tema nell’interfaccia utente /admin/customize/themes. Il fallback è gestito nello stesso modo del core, quindi è accettabile avere traduzioni incomplete per lingue non inglesi, che utilizzeranno le chiavi inglesi.

Gli amministratori possono anche gestire queste traduzioni in Aspetto → Testi del sito. Seleziona un tema o un componente per cercare le stringhe del suo file di locale, modifica una traduzione nella lingua selezionata o ripristina una sovrascrittura al valore predefinito del file di locale. La selezione è collegabile utilizzando /admin/customize/site_texts?theme_id=THEME_ID. I testi del sito identificano queste voci come js.theme_translations.THEME_ID.KEY; le modifiche utilizzano le stesse sovrascritture di traduzione del tema dell’editor dei temi.

In background, queste traduzioni sono memorizzate insieme alle traduzioni di core, sotto un namespace specifico del tema. Ad esempio:

theme_translation.{theme_id}.sidebar.welcome

Non dovresti mai codificare in modo fisso il theme_id nel codice del tuo tema. Per costruire dinamicamente la chiave di traduzione, utilizza l’helper themePrefix:

import { i18n } from "discourse-i18n";
import { themePrefix } from "virtual:theme";

// In JS code:
const result = i18n(themePrefix("my_translation_key"));
console.log("From Javascript", result);

// In a template tag:
<template>{{i18n (themePrefix "blah")}}</template>

Per un esempio completo dell’uso delle traduzioni in un tema, dai un’occhiata al tema Fakebook di @awesomerobot: GitHub - discourse/Fakebook · GitHub


Questo documento è sottoposto a controllo di versione - suggerisci modifiche su github.

32 Mi Piace

Come si utilizzano le traduzioni del tema nel CSS? So che possiamo usare i parametri del tema, ma ho bisogno delle traduzioni del tema.

Non è possibile, sono disponibili solo nei template e in JavaScript. È lo stesso caso delle traduzioni del core o dei plugin.

Idealmente, rifattorizza il codice in modo che la stringa sia impostata in un template. Ma se hai davvero bisogno di una stringa personalizzabile in un file CSS, puoi utilizzare le impostazioni del tema: Developing Discourse Themes & Theme Components

1 Mi Piace

E se uso le impostazioni del tema, è possibile tradurle?

No, non in più lingue, ma permetterebbe agli amministratori di personalizzarlo per il loro sito.

2 Mi Piace

Ciao a tutti.
Sto ridefinendo il template upload-selector.hbs
Voglio aggiungere una frase traducibile.
Ho creato una nuova variabile upload_selector.upload_images
Per esempio

Per favore, ditemi cosa fare dopo?

Ciao,

quando provo questa tecnica nel tema creator di Discourse (vedi qui), tutto funziona correttamente e come spiegato nel post.

Tuttavia, se importo lo stesso tema sul mio server, appare solo " [en.theme_translations.12.blog]". Inoltre, nella pagina delle impostazioni del tema non c’è alcuna sezione “Traduzioni del tema” come nel tema creator.

Non so davvero dove cercare questo errore. Qualcuno ha un suggerimento per me?

[Edit]
Sto usando Discourse 2.6.7 ( [f73cdbbd2f ] ) in un ambiente Docker.

Puoi aggiornare Discourse?

Stai usando una versione vecchia.

Sì, ci sto provando. È un’altra cosa per cui ho bisogno di aiuto, ma non voglio scriverlo qui: è un altro argomento.

Comunque, pensavo che non dovesse essere un problema, dato che la funzionalità di traduzione è stata inclusa nella versione 2.2.0.beta9, vedi commit.

Ciao, scusa in anticipo per la domanda da principiante.
Ho creato un’intestazione solo con html e css

        <div class="top-navbar">
         <span class="j_menu_item" ><a>Download</a></span>     
        </div>

E poi voglio tradurre la parola “Download”
Ho creato il file di traduzione inglese

en: 
  top-navbar: 
    download: "Yeah"

Poi ho modificato il codice html come per l’esempio di facebook


    <script type="text/x-handlebars" data-template-name="/connectors/discovery-below/sidebar">
        <div class="top-navbar">
         <a href="https://www.example.com/download">{{i18n (theme-prefix "top-navbar.download")}}</a></span>     
        </div>
    </script>

Questo traduce e stampa “Yeah” ma rompe il mio layout, immagino sia perché sto usando “/connectors/discovery-below/sidebar”. Voglio solo applicare la mia traduzione senza modificare alcun template ma non capisco come applicare semplicemente la traduzione inline.

Potresti fornire un semplice esempio su come utilizzare una traduzione nell’html personalizzato di un tema?

Grazie!

Ciao,

Il problema è che data-template-name dovrebbe essere un nome univoco. Developing Discourse Themes & Theme Components. Come questo: data-template-name=\"/connectors/PLUGIN-OUTLET-NAME/UNIQUE-NAME\" Ora stai usando il nome sidebar nel tuo esempio che credo sovrascriva il template della sidebar di Facebook.

Ad esempio, questo dovrebbe funzionare :slightly_smiling_face:

<script type="text/x-handlebars" data-template-name="/connectors/discovery-below/downloadlink">
  <div class="top-navbar">
    <span class="j_menu_item" ><a href="https://www.example.com/download">{{i18n (theme-prefix "top-navbar.download")}}</a></span>     
  </div>
</script>
2 Mi Piace

Grazie @Don

Ho dimenticato di menzionare che il plugin non è installato e che ho già provato a cambiare il data-template-name in un UNIQUE-NAME casuale con lo stesso risultato o non mostrando affatto il mio banner se ho inventato il PLUGIN-OUTLET-NAME.
Probabilmente puoi capire a questo punto, non ho alcuna familiarità con handlebars/ember :slight_smile:
La mia comprensione è che sto personalizzando un template che ha il suo posto predefinito nell’html e ha come risultato che l’html personalizzato non è più sopra /html/body/section main ma in profondità, risultando in un’ereditarietà CSS che non avevo prima.
Ciò che fatico a capire è perché devo personalizzare qualsiasi template per usare una traduzione…
Sono riuscito a identificare il template da personalizzare usando Ember inspector come consigliato qui
E grazie alla tua risposta e al link sul plugin-outlet ho trovato il giusto data-template-name=“/connectors/above-site-header/my-navbar”
Grazie ancora per il tuo aiuto

1 Mi Piace

Oh capisco… Pensavo stessi usando il tema Fakebook e volessi posizionare il tuo codice sotto la sezione della barra laterale. :slightly_smiling_face:

Un buon modo per vedere visivamente gli outlet dei plugin è usare il componente tema Plugin Outlet Locations.

2 Mi Piace

Ciao @Don,

Il motivo per cui ho usato quell’esempio di Facebook è dovuto a:

Grazie ancora!

E per quanto riguarda singolare e plurale, come tradurre il testo usando {{theme-i18n}} se ha una e molte traduzioni. Ad esempio “Risultato” e “Risultati”

2 Mi Piace

Ci sono alcuni esempi di come facciamo questo nel codice sorgente di Discourse, tipicamente abbiamo due stringhe e cambiamo in base a un intero:

Screenshot 2022-12-15 at 5.42.58 PM

Questo dovrebbe funzionare anche in un tema, in genere il JS dovrebbe assomigliare a questo:

I18n.t(themePrefix("confirm_remove_tags"), {
  count: exampleCountValue,
});
1 Mi Piace

e per quanto riguarda hbs, si può fare nei template hbs?

1 Mi Piace

Sì, può:

{{theme-i18n "confirm_remove_tags" count=this.exampleCountValue}}
4 Mi Piace

quando faccio così in un template di componente .gjs all’interno di un Tema ottengo:
Errore: Tentativo di risolvere un helper in un template in modalità strict, ma quel valore non era nell'ambito: theme-prefix

Quindi tento di importarlo:
import themePrefix from "discourse/helpers/theme-prefix";

Ma si lamenta:
Identificatore 'themePrefix' è già stato dichiarato

(Ho cercato un esempio sull’ 'hub ma non sembra essercene)

1 Mi Piace

Aggiornamento: devi usare {{i18n (themePrefix "

4 Mi Piace