Случайная строка локализации

Версия Minecraft
1.18.2
API
Fabric
78
3
10
JSON:
{
    "chat.mymod.randtext.1": "text 1",
    "chat.mymod.randtext.2": "text 2",
    "chat.mymod.randtext.3": "text 3"
}
Есть ли возможность получить случайную строку по ключу chat.mymod.randtext ? При этом должна учитываться выбранная локаль майна.
Выбран русский и есть русские chat.mymod.randtext - получить рандом среди них. Нету - получить рандом из en_US.
 
Решение
Тебе куда это конкретно нужно воткнуть? Если в TextComponent, то сделай обертку, если куда-то еще, то ищи место куда можно вклиниться между получением строки на перевод и местом, где она используется. Затем сделай что-то такое:
  1. В lang файле свою строку указывай в каком-нибудь формате аля "lang.key.name": "first;second;third" или как тебе удобнее будет.
  2. В месте, куда ты вклинишься, достаешь StatCollector'ом/I18n'ом (не знаю как они на 1.18 называется) эту локализацию и просто делишь её через split(";").
  3. Где-то объект Random делаешь заранее и через размер полученного разделенного массива nextInt'ом получаешь случайную строку из него, которую ты и будешь использовать как итоговый результат.
Да, это, наверняка...
78
3
10
Не, предполагалось, что непосредственно в коде и в настройках мода не должно быть указано количество таких строк.
Более того, предполагал, что в разных локалях может быть разное количество.

Перечесал щас всю локализацию, и понял, что без отдельного кастомного сообщения или пакета это не сделать... Какжется.
 
1,329
104
225
Не, предполагалось, что непосредственно в коде и в настройках мода не должно быть указано количество таких строк.
Извини пожалуйста, если прозвучит грубо, но как ты их собирался бы тогда переводить? На ходу генерировать гугловский перевод?
Более того, предполагал, что в разных локалях может быть разное количество.
Стрёмная затея, но реализуемо через Minecraft.getInstance().getLanguageManager().getSelected()
кастомного сообщения или пакета это не сделать
Пакет в данном случае неприменим.
 

TheAndrey

Редактор учебника
1,071
72
372
Увы, штатной реализации выбора сообщений нет. Автору Railcraft, например, пришлось указывать в коде кол-во вариантов сообщения для случайного выбора.
 
78
3
10
пришлось указывать в коде кол-во вариантов сообщения
Этого и хочу избежать. Вероятно, проще всего будет кастомным пакетом на клиент передавать ключ. И использовать не штатные файлы локализации, а дополнительные сделать, и манипулировать ими в зависимости от локали клиента. Хотел как-то из коробки.
Правда, слишком дофига кода и телодвижений, проще отказаться от затеи, тем более, что не ключевая килл-фича.
 
1,200
37
237
Тебе куда это конкретно нужно воткнуть? Если в TextComponent, то сделай обертку, если куда-то еще, то ищи место куда можно вклиниться между получением строки на перевод и местом, где она используется. Затем сделай что-то такое:
  1. В lang файле свою строку указывай в каком-нибудь формате аля "lang.key.name": "first;second;third" или как тебе удобнее будет.
  2. В месте, куда ты вклинишься, достаешь StatCollector'ом/I18n'ом (не знаю как они на 1.18 называется) эту локализацию и просто делишь её через split(";").
  3. Где-то объект Random делаешь заранее и через размер полученного разделенного массива nextInt'ом получаешь случайную строку из него, которую ты и будешь использовать как итоговый результат.
Да, это, наверняка можно сделать "красивее", но зато это безотказный вариант, так как в случае неправильного "синтаксиса" массива или попытке достать локализацию кем-то другим без последующих манипуляций, никакого краша не будет.

--- UPD ---
Вот в какомнибудь Thaumcraft'е ваще каждое исследование в одну lang строчку запихивается со своим собственным синтаксисом с
 
Сверху