ProjectAres/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/localization/MessageTemplate.java

86 lines
2.5 KiB
Java

package tc.oc.commons.bukkit.localization;
import java.text.MessageFormat;
import java.util.Locale;
import javax.inject.Inject;
import org.bukkit.command.CommandSender;
import tc.oc.commons.core.localization.Locales;
/**
* Encapsulates a localized message template across all languages.
*
* Can be converted to a {@link MessageFormat}s by providing a specific {@link Locale}.
*/
public interface MessageTemplate {
/**
* Is this template actually translated into different languages?
*/
boolean isLocalized();
MessageFormat format(Locale locale);
default MessageFormat format() {
return format(Locales.DEFAULT_LOCALE);
}
default MessageFormat format(CommandSender viewer) {
return format(PluginLocales.locale(viewer));
}
class Factory {
private final Translator translator;
@Inject Factory(Translator translator) {
this.translator = translator;
}
/**
* Create a {@link MessageTemplate} that returns the given {@link MessageFormat} for all locales.
*/
public MessageTemplate literal(MessageFormat message) {
return new MessageTemplate() {
@Override
public boolean isLocalized() {
return false;
}
@Override
public MessageFormat format(Locale locale) {
return message;
}
@Override
public String toString() {
return MessageTemplate.class.getSimpleName() + "{text=" + message + "}";
}
};
}
/**
* Create a localized {@link MessageTemplate} from the given message key.
*/
public MessageTemplate fromKey(String key) {
if(!translator.hasKey(key)) {
throw new IllegalArgumentException("Missing translation key '" + key + "'");
}
return new MessageTemplate() {
@Override
public boolean isLocalized() {
return true;
}
@Override
public MessageFormat format(Locale locale) {
return translator.pattern(key, locale).get();
}
@Override
public String toString() {
return MessageTemplate.class.getSimpleName() + "{key=" + key + "}";
}
};
}
}
}