# First Translation

# Video Tutorial

If you prefer a video tutorial of this guide, you can follow the official get started video:

# Ways of Translating

Before proceeding, it is important to note that there are 5 ways to translate messages using Triton. This guide will only talk about the first two:

# Triton Placeholders

As an example, we're going to translate the CMI plugin (opens new window), more precisely the info.NoPermission message:



 





info:
  prefix: '&e[&aCMI&e] '
  NoPermission: "&cYou don't have permission!"
  CantHavePermission: "&cYou can't have this permission!"
  NoPlayerPermission: "&c[playerName] doesn't have permission for: [permission]"
  Ingame: '&cYou can only use this in game!'
  NoInformation: '&cNo information found!'

As we can see, the info.NoPermission message is pretty simple to translate because it doesn't have any kind of variables.

# Step 1 - Add the translation to Triton

TIP

You don't have to use the cmi.info.NoPermission key. It was just the example. As long as you use the same key in the placeholder, it can be whatever you want.
However, I'd personally recommend following some kind of convention for your keys.

# Step 2 - Replace the original message with the placeholder

After adding the translation to Triton, you must replace the original message with a Triton placeholder. Triton placeholders follow the following syntax: [lang]insert.translation.key.here[/lang].

With that in mind, you can simply replace the original message with the placeholder.



 





info:
  prefix: '&e[&aCMI&e] '
  NoPermission: '[lang]cmi.info.NoPermission[/lang]'
  CantHavePermission: "&cYou can't have this permission!"
  NoPlayerPermission: "&c[playerName] doesn't have permission for: [permission]"
  Ingame: '&cYou can only use this in game!'
  NoInformation: '&cNo information found!'

# Triton Advanced Placeholders

We've already seen how to translate a message without variables, but what about a message with variables?
Well, that's exactly what we're going to do now.

This is where we left off in the previous section:





 



info:
  prefix: '&e[&aCMI&e] '
  NoPermission: '[lang]cmi.info.NoPermission[/lang]'
  CantHavePermission: "&cYou can't have this permission!"
  NoPlayerPermission: "&c[playerName] doesn't have permission for: [permission]"
  Ingame: '&cYou can only use this in game!'
  NoInformation: '&cNo information found!'

We're now going to translate the info.NoPlayerPermission message.

# Step 1 - Add the translation to Triton

For more information on adding translations to Triton using TWIN or JSON, take a look at the previous section.

The only difference between this section and the previous one is the content of the translation.
Triton works by replacing %1, %2, %3, etc by the given variables. As such, we're going to replace the variables in the original message &c[playerName] doesn''t have permission for: [permission] with %1 and %2.
The result should be something like &c%1 doesn''t have permission for: %2.

TIP

Now matter how the plugin you're translating handles variables, you'll always need to replace them with %1, %2, %3, etc...
The original variables will be used in Step 2.

# Step 2 - Replace the original message with the placeholder

This step is also very similar with the one from the previous section.
When using variables, the format differs slightly: [lang]insert.translation.key.here[args][arg]variable1[/arg][arg]variable2[/arg][/args][/lang].

Keep in mind that everything inside the [arg][/arg] tags will be used as a replacement to %1, %2, etc in the final message, following the order in which they were added.

This is how we'll use it for our use-case:





 



info:
  prefix: '&e[&aCMI&e] '
  NoPermission: '[lang]cmi.info.NoPermission[/lang]'
  CantHavePermission: "&cYou can't have this permission!"
  NoPlayerPermission: '[lang]cmi.info.NoPlayerPermission[args][arg][playerName][/arg][arg][permission][/arg][/args][/lang]'
  Ingame: '&cYou can only use this in game!'
  NoInformation: '&cNo information found!'

# Using the automated generator tool

An open-source tool (opens new window) is in the works that'll mostly automate these steps. A guide on how to use it will be available later.

Already generated translations for some plugins is available in the triton-translation-collection (opens new window) GitHub repository.