Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как написать такую систему языков?

Wh1teInc

Участник
Пользователь
Баллы
36
Имя в Minecraft
Wh1teInc
Всем привет, я работаю на проекте для которого пишу плагины, и сейчас работаю над локализацией проекта, решением было использовать GitLab. Так вот, у нас есть обычная система локализаций, которая по ссылке на ресурс определяет язык, и присваивает ключи из списка, но нужно сделать, чтобы на GitLab в файле к примеру langs.json можно было указать путь к файлу с ключами, и уже из него шло определение, присвоение ключей.

К примеру это должно быть так:

{
"ru": {
"ru/general.yml": "#*",
"ru/lobby": "#Lobby",
}
 
Я вообще не понял, о чём речь, и причём тут гитлаб.
Обычная система локализаций - это какая? По ссылке на какой ресурс определяет язык? Куда ключи присваивает? Что мешает создать langs.json? В чём вообще конкретно заключается твой вопрос?

Распиши нормально всё
 
Я вообще не понял, о чём речь, и причём тут гитлаб.
Обычная система локализаций - это какая? По ссылке на какой ресурс определяет язык? Куда ключи присваивает? Что мешает создать langs.json? В чём вообще конкретно заключается твой вопрос?

Распиши нормально всё
Добрый вечер, смотри, у нас есть класс класс под название LanguageType, в котором идёт ссылка на GitLab-репозиторий с локализацией проекта, так же есть класс LocalizationResource, в котором идут методы получения ресурса, получения сообщений, которые содержатся в этой локализации. Так вот, здесь оно просто получает локализацию из одного файла general.yml, а нам нужно разбить эти файлы на несколько файлов к примеру: skywars.yml, lobby.yml, core.yml и др. Видел некоторые проекты, которые сделали это с помощь json файла, в котором указан путь на эти файлы, но не знаю как это реализовать в коде



LocalizationResource:

@RequiredArgsConstructor
public class LocalizationResource {

private final String resourceURL;

@Getter
private final Map<String, Object> localizationMessages = new LinkedHashMap<>();

private synchronized Yaml newYaml() {
Constructor constructor = new Constructor();

PropertyUtils propertyUtils = new PropertyUtils();
propertyUtils.setSkipMissingProperties(true);

constructor.setPropertyUtils(propertyUtils);
return new Yaml(constructor);
}

@SneakyThrows
public synchronized LocalizationResource initResources() {
localizationMessages.clear();

try (InputStreamReader inputStream = new InputStreamReader(new URL(resourceURL).openStream())) {
localizationMessages.putAll(newYaml().loadAs(inputStream, LinkedHashMap.class));
}

return this;
}

public synchronized String getMessage(@NonNull String messageKey, Object... format) {
return ChatColor.translateAlternateColorCodes('&', String.format(new String(localizationMessages.getOrDefault(messageKey, ChatColor.RED + messageKey).toString().getBytes()), format));
}

public synchronized List<String> getMessageList(@NonNull String messageKey, Object... format) {
// return new ArrayList<>((List<String>) localizationMessages.get(messageKey));

List<String> nonFormatted = new ArrayList<>((List<String>) localizationMessages.get(messageKey));

String joined = ChatColor.translateAlternateColorCodes('&', String.join("\n", nonFormatted.toArray(new String[]{})));

return Arrays.asList(String.format(joined, format).split("\n"));
}

public synchronized boolean hasMessage(@NonNull String messageKey) {
return localizationMessages.containsKey(messageKey);
}

public synchronized boolean isText(@NonNull String messageKey) {
return localizationMessages.get(messageKey) instanceof String;
}

public synchronized boolean isList(@NonNull String messageKey) {
return localizationMessages.get(messageKey) instanceof List;
}

}

LocalizationType:

@RequiredArgsConstructor
@Getter
public enum LanguageType {

RUSSIAN("Русский", new LocalizationResource("здесь указываем ссылку на репозиторий"));

public static LanguageType[] VALUES = values();

private final String displayName;
private final LocalizationResource resource;

}

upd: Если что-то не понятно, то могу показать пример
Добавлю: подобная штука есть на сервере LastCraft
 
Последнее редактирование:
Добрый вечер, смотри, у нас есть класс класс под название LanguageType, в котором идёт ссылка на GitLab-репозиторий с локализацией проекта, так же есть класс LocalizationResource, в котором идут методы получения ресурса, получения сообщений, которые содержатся в этой локализации. Так вот, здесь оно просто получает локализацию из одного файла general.yml, а нам нужно разбить эти файлы на несколько файлов к примеру: skywars.yml, lobby.yml, core.yml и др. Видел некоторые проекты, которые сделали это с помощь json файла, в котором указан путь на эти файлы, но не знаю как это реализовать в коде



LocalizationResource:

@RequiredArgsConstructor
public class LocalizationResource {

private final String resourceURL;

@Getter
private final Map<String, Object> localizationMessages = new LinkedHashMap<>();

private synchronized Yaml newYaml() {
Constructor constructor = new Constructor();

PropertyUtils propertyUtils = new PropertyUtils();
propertyUtils.setSkipMissingProperties(true);

constructor.setPropertyUtils(propertyUtils);
return new Yaml(constructor);
}

@SneakyThrows
public synchronized LocalizationResource initResources() {
localizationMessages.clear();

try (InputStreamReader inputStream = new InputStreamReader(new URL(resourceURL).openStream())) {
localizationMessages.putAll(newYaml().loadAs(inputStream, LinkedHashMap.class));
}

return this;
}

public synchronized String getMessage(@NonNull String messageKey, Object... format) {
return ChatColor.translateAlternateColorCodes('&', String.format(new String(localizationMessages.getOrDefault(messageKey, ChatColor.RED + messageKey).toString().getBytes()), format));
}

public synchronized List<String> getMessageList(@NonNull String messageKey, Object... format) {
// return new ArrayList<>((List<String>) localizationMessages.get(messageKey));

List<String> nonFormatted = new ArrayList<>((List<String>) localizationMessages.get(messageKey));

String joined = ChatColor.translateAlternateColorCodes('&', String.join("\n", nonFormatted.toArray(new String[]{})));

return Arrays.asList(String.format(joined, format).split("\n"));
}

public synchronized boolean hasMessage(@NonNull String messageKey) {
return localizationMessages.containsKey(messageKey);
}

public synchronized boolean isText(@NonNull String messageKey) {
return localizationMessages.get(messageKey) instanceof String;
}

public synchronized boolean isList(@NonNull String messageKey) {
return localizationMessages.get(messageKey) instanceof List;
}

}

LocalizationType:

@RequiredArgsConstructor
@Getter
public enum LanguageType {

RUSSIAN("Русский", new LocalizationResource("здесь указываем ссылку на репозиторий"));

public static LanguageType[] VALUES = values();

private final String displayName;
private final LocalizationResource resource;

}

upd: Если что-то не понятно, то могу показать пример
Добавлю: подобная штука есть на сервере LastCraft
А как ты при попытке получить сообщение поймёшь, из какого файла его нужно загрузить?
Я вижу такие варианты:

1) Определять по ключу локализации. Например, если ключ начинается со "skywars", то загружать из skywars.yml

2) Вместе с ключом передавать и название файла, из которого нужно получить сообщение

3) Хранить локализацию разных файлов в разных классах и при отправке сообщений работать с этими разными классами

Или речь о том, что разные файлы должны быть на разных серверах?

И да, зачем ты каждому методу проставляешь synchronized? Этим ты замедляешь работу приложения, пускай и несущественно
 

Поделиться этой страницей

Назад
Верх