Schnellreferenz für Theme-Entwickler

Da Themes immer leistungsfähiger werden, gibt es mehr zu beachten, wie sie funktionieren. Wir haben eine Menge detaillierter Dokumentation unter #theme-guides, aber wenn du nur etwas brauchst, um dein Gedächtnis zu auffrischen, kann diese Anleitung helfen.

Allgemeine Ressourcen

:scroll: Einsteiger-Guide
:scroll: Designer-Guide
:scroll: Entwickler-Guide
:paintbrush: Theme Creator
:desktop_computer: Theme CLI
:notebook_with_decorative_cover: Theme-Verzeichnis
:jigsaw: Komponente-Verzeichnis
:wrench: Theme-Modifier
:wrench: Themeable site settings

Datei-/Ordnerstruktur mehr lesen

about.json
settings.yml
common/, desktop/, mobile/
  {common|desktop|mobile}.scss
  head_tag.html
  header.html
  after_header.html
  body_tag.html
  footer.html
  embedded.scss (nur common)
locales/
  en.yml
  ...
assets/
  (beliebig benannte Dateien, in about.json referenziert)
stylesheets/
  (beliebig benannte Dateien, können sich gegenseitig importieren und common/desktop/mobile.scss)
javascripts/
  (beliebig benannte Dateien. Unterstützt .js, .gjs und .hbs)

about.json Strukturinfo, verfügbare Metadaten

{
  "name": "Mein Theme",
  "component": false,
  "license_url": null,
  "about_url": null,
  "authors": null,
  "theme_version": null,
  "minimum_discourse_version": null,
  "maximum_discourse_version": null,
  "assets": {
    "variable-name": "assets/my-asset.jpg"
  },
  "color_schemes": {
    "Mein Farbschema": {
      "primary": "222222"
    }
  }
}

SCSS

:link: Verfügbare CSS-Variablen

Javascript mehr lesen

// {theme}/javascripts/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  // Dein Code hier
});

:link: JS Plugin API

:link: Mehrere Javascript-Dateien

Einstellungen mehr lesen

settings.yml:

fruit:
  default: apples|oranges
  type: list
  description: # Alte Methode. Es ist besser, diese in den Locale-Dateien zu definieren (siehe unten)
    en: Englische Beschreibung
    fr: Französische Beschreibung

Zugriff aus JavaScript:

console.log(settings.fruit);

Zugriff aus gjs-Templates:

<template>{{settings.fruit}}</template>

Zugriff aus scss:

html {
  font-size: #{$global-font-size}px;
  background: $site-background;
}

Themeable site settings mehr lesen

about.json:

"theme_site_settings": {
  "enable_welcome_banner": false
}

Zugriff aus JavaScript:

@service siteSettings;

this.siteSettings.enable_welcome_banner;

Zugriff aus gjs-Templates:

<template>{{this.siteSettings.enable_welcome_banner}}</template>

Übersetzungen mehr lesen

locales/en.yml

en:
  my_translation_key: "Ich liebe Themes"
  theme_metadata: # Diese werden im Admin-Panel verwendet. Sie sind nicht für deine js/hbs-Dateien verfügbar
    description: Dieses Theme ermöglicht es dir, erstaunliche Dinge auf deinem Discourse zu tun
    settings:
      fruit: Eine Beschreibung der whitelisted_fruits-Einstellung

Zugriff aus JavaScript:

import { i18n } from "discourse-i18n";
i18n(themePrefix("my_translation_key"));

Zugriff aus gjs-Templates:

import { i18n } from "discourse-i18n";

<template>
  {{i18n (themePrefix "my_translation_key")}}
  <DButton @label={{theme-prefix "my_translation_key"}} />
</template>

Dieses Dokument ist versioniert - vorschlage Änderungen auf github.

40 „Gefällt mir“

Das ist super hilfreich.

Könnte ich auch vorschlagen, als nützlichen Hinweis die Liste der verfügbaren Farbumwandlungen hinzuzufügen:

3 „Gefällt mir“

Mir entgeht hier wohl etwas. Ich versuche, I18n.t(themePrefix("my_translation_key")) zu verwenden, aber die Firefox-Konsole meldet, dass themePrefix nicht definiert ist.
Wie kann ich diese Funktion aus einer API-Funktion aufrufen?