Add-ons ontwikkelen¶
Add-ons zijn een manier om de werkwijze voor vertalen in Weblate aan te passen.
- class weblate.addons.base.BaseAddon(storage)¶
Base class for Weblate add-ons.
- classmethod can_install(*, component=None, category=None, project=None) bool¶
Check whether add-on is compatible with given component.
- change_event(change, activity_log_id: int | None = None)¶
Event handler for change event.
- check_change_action(change) bool¶
Early filtering of Change actions before triggering change_event callback.
- component_update(component, activity_log_id: int | None = None)¶
Event handler for component update.
- configure(configuration) None¶
Save configuration.
- daily(component=None, category=None, project=None, activity_log_id: int | None = None)¶
Scope-aware daily entry point.
Override this for project-level logic, or override daily_component() for per-component logic.
- daily_component(component, activity_log_id: int | None = None)¶
Per-component daily processing. Override this for component-level logic.
- classmethod get_add_form(user, *, component=None, category=None, project=None, **kwargs)¶
Return configuration form for adding new add-on.
- get_change_details(compared_configuration)¶
Return a public configuration snapshot and changed field names.
- get_public_configuration()¶
Return configuration with non-public values redacted.
- classmethod get_public_configuration_fields() frozenset[str]¶
Return configuration fields which are safe for public use.
- get_settings_form(user, **kwargs)¶
Return configuration form for this add-on.
- manual(component=None, category=None, project=None, activity_log_id: int | None = None)¶
Scope-aware manual entry point.
By default this mirrors the daily handler and lets add-ons opt in explicitly by subscribing to the manual event.
- manual_component(component, activity_log_id: int | None = None)¶
Per-component manual processing.
- post_add(translation, activity_log_id: int | None = None)¶
Event handler after new translation is added.
- post_commit(component, store_hash: bool, activity_log_id: int | None = None)¶
Event handler after changes are committed to the repository.
- post_install(component, store_hash: bool, activity_log_id: int | None = None)¶
Event handler after add-on is installed.
- post_push(component, activity_log_id: int | None = None)¶
Event handler after repository is pushed upstream.
- post_remove(translation, activity_log_id: int | None = None)¶
Event handler after a translation is removed.
- post_update(component, previous_head: str, skip_push: bool, changed_files: list[str], parse_after_update: bool = False, activity_log_id: int | None = None)¶
Event handler after repository is updated from upstream.
- Parameters:
previous_head (str) – HEAD of the repository prior to update, can be blank on initial clone.
skip_push (bool) – Whether the add-on operation should skip pushing changes upstream. Usually you can pass this to underlying methods as
commit_and_pushorcommit_pending.changed_files (list[str]) – Files changed by the repository update.
- pre_commit(translation, author: str, store_hash: bool, activity_log_id: int | None = None)¶
Event handler before changes are committed to the repository.
- pre_push(component, activity_log_id: int | None = None)¶
Event handler before repository is pushed upstream.
- pre_update(component, activity_log_id: int | None = None)¶
Event handler before repository is updated from upstream.
- resolve_components(*, component=None, category=None, project=None)¶
Resolve scope to components iterator.
- save_state() None¶
Save add-on state information.
- unit_pre_create(unit, activity_log_id: int | None = None)¶
Event handler before new unit is created.
- update_component_state(component, updater: Callable[[dict[str, object]], None]) None¶
Atomically merge component-scoped add-on state into the shared JSON field.
- user()¶
Weblate user used to track changes by this add-on.
Add-onhooks ontvangen ORM-objecten vanuit de modules weblate.*.models, inclusief Addon, Component, Translation, Category, Project, Unit, Change en User. Formulieren voor configuraties van add-ons zouden de subklasse weblate.addons.forms.BaseAddonForm moeten vermelden.
Hier is een voorbeeld add-on:
# Copyright © Michal Čihař <michal@weblate.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
from __future__ import annotations
from typing import TYPE_CHECKING, ClassVar
from django.utils.translation import gettext_lazy
from weblate.addons.base import BaseAddon
from weblate.addons.events import AddonEvent
if TYPE_CHECKING:
from weblate.addons.base import CompatDict
from weblate.trans.models import Translation
class ExampleAddon(BaseAddon):
# Filter for compatible components, every key is
# matched against property of component
compat: ClassVar[CompatDict] = {
"file_format": {"po", "po-mono"},
}
# List of events add-on should receive
events: ClassVar[set[AddonEvent]] = {
AddonEvent.EVENT_PRE_COMMIT,
}
# Add-on unique identifier
name = "weblate.example.example"
# Verbose name shown in the user interface
verbose = gettext_lazy("Example add-on")
# Detailed add-on description
description = gettext_lazy("This add-on does nothing it is just an example.")
# Callback to implement custom behavior
def pre_commit(
self,
translation: Translation | None,
author: str,
store_hash: bool,
activity_log_id: int | None = None,
) -> None:
return
Normale configuratie add-on¶
Configuratie van de add-on wordt opgeslagen in het JSON-veld Addon.configuration, dus het model behoudt de vastgelegde gegevens als ruwe JSON. Implementaties van add-ons mogen hun eigen configuratie typeren met de parameters BaseAddon en BaseAddonForm.
Gebruik twee klassen TypedDict als de opgeslagen JSON kan verschillen van de vorm in runtime: een toestemmende, gewoonlijk total=False, opgeslagen configuratie voor verouderde of ontbrekende waarden en een totale runtime-configuratie die wordt teruggegeven door normalize_configuration(). Code voor de runtime-add-on zou self.configuration of self.get_configuration() moeten lezen, zodat het genormaliseerde standaarden ziet in plaats van ruw vastgelegde JSON.
Voor eenvoudige add-ons waar de opgeslagen en runtime vormen identiek zijn, definieer een enkele TypedDict en gebruik die voor beide BaseAddon typen parameters. Houdt het terugkeertype serialize_form() van het formulier in lijn met het opgeslagen configuratietype.
Add-onconfiguratie publiceren¶
Geschiedenis voor wijzigen add-on kan zichtbaar zijn zonder rechten voor beheer van de add-on. Vermeld configuratievelden die veilig gepubliceerd kunnen worden in het attribuut public_configuration_fields van het formulier. Velden die niet expliciet zijn vermeld worden in het snapshot behouden met een waarde null en geïdentificeerd als bewerkt. De standaard is een lege set, zodat nieuw toegevoegde instellingen niet per ongeluk worden gepubliceerd.
Gebruik BaseAddon.get_public_configuration() altijd als de configuratie wordt weergegeven buiten vertrouwde code voor beheer van add-ons. Interne bewerkingen die opzettelijk een werkende add-on klonen kunnen doorgaan met het gebruiken van de opgeslagen configuratie.