> For the complete documentation index, see [llms.txt](https://lethium.gitbook.io/lethium-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lethium.gitbook.io/lethium-docs/server-setup/lethium-plugins.md).

# LethiumMessages and LethiumLanguage

LethiumMessages (announcements and link commands) and LethiumLanguage (translating other plugins).

### LethiumMessages

Files: `plugins/LethiumMessages/config.yml`, `announcements.yml`, `commands.yml`, `placeholders.yml`, `toggles.yml`. Reload with `/lm reload`. Command: `/lethiummessages` (`/lm`).

It does two things: **repeating announcements** and **custom link commands**.

#### Announcements (`announcements.yml`)

The setup announces the Discord, the store, TikTok, and one message for **every major feature** (profile, upgrades, boosts, gear, artifacts, Echoes, skills, pets, eggs, fusion, masteries, rebirth, quests, achievements, leaderboards, daily rewards, killstreaks, Season Pass, events, cosmetics, VIP perks, clans, gifting). They rotate one after another.

```yaml
Announcements:
  store:
    interval: 900
    sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
    volume: 1
    pitch: 1
    worlds: null
    permission: null
    type: CHAT
    lines:
      - "&r"
      - "  &7Grab ranks, perks, and boosters from the store"
      - "  %%storelink%%"
```

| Key                        | Meaning                                                                        |
| -------------------------- | ------------------------------------------------------------------------------ |
| `interval`                 | Seconds between this announcement. **Only used when `globalMode` is `false`.** |
| `sound`, `volume`, `pitch` | Sound played on send.                                                          |
| `worlds`                   | A list of worlds, or `null` for all.                                           |
| `permission`               | Only players with it receive it. `null` = everyone.                            |
| `type`                     | The display type, `CHAT` here.                                                 |
| `lines`                    | The text. `%%name%%` inserts a clickable text from `placeholders.yml`.         |

```yaml
announcement:
  enabled: true
  globalMode: true
  random: false
  interval: 240
```

| Key          | Meaning                                                                                                                                                                                |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `enabled`    | Master switch.                                                                                                                                                                         |
| `globalMode` | `true`: one timer sends the **next announcement every `interval` seconds** (240 = 4 minutes), ignoring each one's own `interval`. `false`: each announcement runs on its own interval. |
| `random`     | `true` picks randomly, `false` goes in order.                                                                                                                                          |

Players turn announcements and their sound off with **`/lm toggle`** and **`/lm toggle sound`** (saved in `toggles.yml`). ClickEm's own `server-announcements` setting is also respected where it applies.

#### Clickable texts (`placeholders.yml`)

```yaml
Placeholders:
  discord:
    Text: "エ &#BFEEF5Click to join our community!"
    Hover: "&7Click to open our Discord!"
    Click:
      Type: "OPEN_URL"
      Content: "https://discord.gg/yourserver"
  profile:
    Text: "エ &#BFEEF5Click to open your profile"
    Click:
      Type: "RUN_COMMAND"
      Content: "/profile"
```

Click types: `OPEN_URL` and `RUN_COMMAND`. Use it in an announcement or command as `%%discord%%`. There is one per feature (`profile`, `upgrades`, `boosts`, `gearsets`, and so on) so that an announcement can say "click to open Gear".

{% hint style="danger" %}
**Before launch, replace the links.** The shipped ones are placeholders: `https://discord.gg/yourserver`, `https://store.yourserver.com`, `https://tiktok.yourserver.com`. They appear in `placeholders.yml` **and again inside `commands.yml`** as `(url:...)`.
{% endhint %}

#### Link commands (`commands.yml`)

`/discord` (`/dc`, `/discordlink`), `/storelink` (`/store`, `/storelinks`) and `/tiktok`. Each has `description`, `aliases`, `permission` (null = everyone) and `lines`.

```yaml
Commands:
  discord:
    description: "Shows the Discord invite link"
    aliases: [dc, discordlink]
    permission: null
    lines:
      - "&f  エ [&#BFEEF5Click to join our community!](url:https://discord.gg/yourserver)"
```

Link text format: `[visible text](url:https://...)`. To add a command (for example `/vote`), add a block with a new name and lines. Reload with `/lm reload`.

#### Commands and permissions

| Command                    | Permission                                   | Use                        |
| -------------------------- | -------------------------------------------- | -------------------------- |
| `/lm reload`               | `lethiummessages.admin`                      | Reload files.              |
| `/lm send <id>`            | `lethiummessages.admin`                      | Send one announcement now. |
| `/lm list`, `/lm commands` | `lethiummessages.admin`                      | What is loaded.            |
| `/lm toggle [sound]`       | `lethiummessages.toggle` (default: everyone) | Player opt-out.            |

Receiving announcements needs `lethiummessages.receive` (default: everyone).

#### Languages

If ClickEm is installed, LethiumMessages shows each announcement **in the player's ClickEm language**. It matches the English line in your file to a built-in translation. If you **reword an English line**, that line will show in English for everyone until it is translated. `language.enabled` in `config.yml` switches this off.

### LethiumLanguage

LethiumLanguage is a **translator for other plugins**. It works at packet level, so a player who picks Spanish in ClickEm also sees Spanish in TAB, FancyHolograms, DeathControl, Essentials toggles, ExcellentCrates menus, WorldGuard messages, EasyCommandBlocker and AdvancedPortals.

* It needs **packetevents** (the jar is in the package).
* It is an **optional extra and is not installed in the standard Clicker package**. Nothing breaks without it, and LethiumMessages already translates itself.
* ClickEm pushes each player's language to it (`locale.sync-lethium-language: true` in `config.yml`).
* Translations live in `plugins/LethiumLanguage/dictionaries/<Plugin>/<language>.yml`. A "Clicker pack" ships 451 lines per language for 9 plugins, in 12 languages.
* It matches the **plain text** of a message, ignoring colours. If you change the English wording of a plugin's message, add the new wording to that plugin's dictionary.
* Not covered: BetterHud text and the per-reward names inside crates.

{% hint style="info" %}
The TAB Java HUD (BetterHud) cannot be translated this way. The Bedrock TAB scoreboard is translatable.
{% endhint %}

See also [Language and text](/lethium-docs/configuration/language-and-text.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://lethium.gitbook.io/lethium-docs/server-setup/lethium-plugins.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
