XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
ScorpioT1000
Работаем
offline
Опыт: отключен
[cJass] Localized Library (Alpha)

ЛолШТО?

Удобная библиотека для локализации строк :) но сначала почитай это xgm.ru/forum/showthread.php?p=688121&posted=1#post688121

Лолгде?

пока есть всякая фигня и врятли она пофиксится:
  • вызов лок. строки осуществляется через функцию, т.к. дефайн однопроходен
  • перегружено пока только в 3 случаев: для 2 языков, для 3 языков и для всех языков, ключенных в localized.j
  • нельзя использовать напрямую при инициализации глобалок, тоесть придавать значения им нужно в функциях
» Лолкод!
// Localized.j

// set your L_LANG1,L_LANG2 and L_LANG3 definitions
// use L() to get a localized string

// L(text_lang1,text_lang2) - two languages
// L(text_lang1,text_lang2,text_lang3) - three languages
// L(srus,seng,sdeu,sfre,sspa,sita,spor) - all languages

#guard LOCALIZED_j

library Localized

enum(LANGUAGES) { RUSSIAN, ENGLISH, DEUTCH, FRENCH, SPANISH, ITALIAN, PORTUGUESE }

#define L_LANG1 = RUSSIAN
#define L_LANG2 = ENGLISH
#define L_LANG3 = DEUTCH

#define LANGUAGE = RUSSIAN

string GetLocalizedStringCustom(string s1, string s2) {
    if(LANGUAGE == L_LANG1) { return s1 }
    elseif(LANGUAGE == L_LANG2) { return s2 }
    return " [Undefined language!] "
}

string GetLocalizedStringCustomTripple(string s1, string s2,string s3) {
    if(LANGUAGE == L_LANG1) { return s1 }
    elseif(LANGUAGE == L_LANG2) { return s2 }
    elseif(LANGUAGE == L_LANG3) { return s3 }
    return " [Undefined language!] "
}

string GetLocalizedStringCustomAll(string srus,string seng,string sdeu,string sfre,string sspa,string sita,string spor) {
    if(LANGUAGE == RUSSIAN) { return srus }
    elseif(LANGUAGE == ENGLISH) { return seng }
    elseif(LANGUAGE == DEUTCH) { return sdeu }
    elseif(LANGUAGE == FRENCH) { return sfre }
    elseif(LANGUAGE == SPANISH) { return sspa }
    elseif(LANGUAGE == ITALIAN) { return sita }
    elseif(LANGUAGE == PORTUGUESE) { return spor }
    return " [Undefined language!] "
}

#define L(single) = single
#define L(text_lang1,text_lang2) = GetLocalizedStringCustom(text_lang1,text_lang2)
#define L(text_lang1,text_lang2,text_lang3) = GetLocalizedStringCustomTripple(text_lang1,text_lang2,text_lang3)
#define L(srus,seng,sdeu,sfre,sspa,sita,spor) = GetLocalizedStringCustomAll(srus,seng,sdeu,sfre,sspa,sita,spor)

endlibrary

Лолкак?

А очень просто!
В начале своей карты ты задаешь языки для выбора и язык, который выбран сейчас:
#setdef L_LANG1 = ENGLISH
#setdef L_LANG2 = RUSSIAN
#setdef L_LANG3 = DEUTCH

#setdef LANGUAGE = RUSSIAN //
В тех местах, где нужно получить строку, зависящую от языка:
//...
SayUnitToUnit(u1, u2, L("Hello!", "Привет!", "Hallo!"))
//...
(в том порядке, в котором задавали L_LANG1,2,3)
В результате выведет на том языке, который задан в LANGUAGE

Альфа

Это все альфаверсия и это все моя травка, поэтому не обращайте внимания) Ну а точней, говорите решения круче. Ибо покачто это не совсем тру

Отредактировано ScorpioT1000, 27.10.2009 в 12:20.
Старый 24.10.2009, 09:47
XOR

offline
Опыт: 38,159
Активность:
Это вроде нового стандарта, для удобства при локализации? Или я не понял
Старый 24.10.2009, 10:19
SageOne
x
offline
Опыт: 46,054
Активность:
ScorpioT1000, я так понял, это рассчитано на тот случай, когда карта может идти на нескольких языках сразу?
Старый 24.10.2009, 10:55
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Ммм, такая штука может мне пригодится, только боюсь слишком увеличить вес карты.
Сделать перевод на English и Русский)
Старый 24.10.2009, 10:58
ScorpioT1000
Работаем
offline
Опыт: отключен
Да, это для удобства локализации строк внутри кода, тоесть вместо ввода одной строки, ты вводишь L() и внутри несколько строк(пока можно 2, 3 или 7)
ScorpioT1000 добавил:
з.ы. используется в JC :)
ScorpioT1000 добавил:
только боюсь слишком увеличить вес карты
ну это фэлс
Старый 24.10.2009, 12:11
Sebra

offline
Опыт: 5,603
Активность:
Удобная библиотека для локализации строк :)
Вот если бы язык определялся динамически, в зависимости от языка пользователя( :) ну хотя бы игры ).
А если так:
//#include "english.j"
#include "russian.j"
//#include "deutch.j"
//...

//...
SayUnitToUnit(u1, u2, L("Hello!"))
//...
#guard ENGLISH_J
#define L(ANY)          = ANY
#guard RUSSIAN_J
#define <L("Hello!")> = "Привет!"
//...
#guard DEUTCH_J
#define <L("Hello!")> = "Hallo!"
//...
пока есть всякая фигня и врятли она пофиксится:
  • вызов лок. строки осуществляется через функцию, т.к. дефайн однопроходен
  • перегружено пока только в 3 случаев: для 2 языков, для 3 языков и для всех языков, ключенных в localized.j
  • нельзя использовать напрямую при инициализации глобалок, тоесть придавать значения им нужно в функциях
Мой вариант без функций, без перегрузок, без ограничений для глобалок.
enum(LANGUAGES) { RUSSIAN, ENGLISH, DEUTCH, FRENCH, SPANISH, ITALIAN, PORTUGUESE }
Даже это не нужно.
Старый 24.10.2009, 12:30
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
ScorpioT1000, TRGSTR наше все.
Старый 24.10.2009, 12:33
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Имхо, это стоит делать через условные дефайны:
enum(LANGUAGES) { RUSSIAN, ENGLISH }

define {
  LANG = RUSSIAN

  msg_text01
  msg_text02
  // . . .
}

#if LANG == RUSSIAN
  setdef msg_text01 = "Текст 1"
  setdef msg_text02 = "Текст 2"
  // . . .
#elseif LANG == ENGLISH
  setdef msg_text01 = "Text 1"
  setdef msg_text02 = "Text 2"
  // . . .
#endif
Старый 24.10.2009, 13:09
ScorpioT1000
Работаем
offline
Опыт: отключен
все что вы предложили - неуникально
Sebra, вобще лол, не позорься
ScorpioT1000 добавил:
я делаю минимально, что нужно вводить пользователю. У вас же белиберда какаято, вобще непонятно зачем тогда это надо, можно для каждого языка просто переписать вручную строчки.
у меня же нужно просто поменять язык и перекомпилировать.
Старый 24.10.2009, 13:58
Sebra

offline
Опыт: 5,603
Активность:
Мой лол не лолее твоего лола. :D
Ты для кого пишешь? Для тех, кто может вставить твой инклуд, но не может свой?
Для тех, кто хочет делать карту с возможностью компиляции на N языках, но не собирается добавлять ещё один?
Лучше бы сделал либу, автоматически определяющую язык по какой либо стандартной строке вара. Это было бы куда полезнее. Были бы логичны и необходимы функции, одна и та же карта могла бы работать на разных языках параллельно у разноязычных пользователей. Эло лучше, чем у Айсфрога с его набором карт на разные языки.
Старый 24.10.2009, 14:11
XOR

offline
Опыт: 38,159
Активность:
Может карту пример выложишь? И да это все только на сjassе?
Старый 24.10.2009, 14:12
ScorpioT1000
Работаем
offline
Опыт: отключен
какой тебе пример ? создаешь .j файл вставляешь туда этот код сверху.
пример с кодом написан выше, вместо любой строки пишешь L(строкарус,строкаинг) :) тестишь..
ScorpioT1000 добавил:
ну вобщем, как обычно, никто ничего не шарит.. спасибо за внимание :)
Старый 24.10.2009, 14:15
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Sebra, тоже вариант, правда, громозко получается.
ScorpioT1000, хочешь я скажу правду? Ты не шаришь. ©
Вот скажи мне, чем мой код лольнее твоего? У тебя уникальность так и прет: если понадобится отобразить сообщение, то в твоем случае придется вызывать функцию, которая выдает нужную строку. Почему бы не заинлайнить все локализуемые строки? В моем случае достаточно просто сменить значение дефайна LANG, и АдикПарсер заменит msg_textNN на нужный вариант.
Старый 24.10.2009, 14:19
ScorpioT1000
Работаем
offline
Опыт: отключен
дело в том, дружок, что у меня подкачивает реализация(собстна изза однопроходности - #if нельзя внутри дифайна поместить), а у вас юзер должен создавать какието непонятные строчки, заполнять их непойми где.. это не есть уникальный солюшен, т.е. нет смысла делать либу вобще :)
ScorpioT1000 добавил:
ну да, инлайн нужных функций если будет, тогда будет круто.
ScorpioT1000 добавил:
ну тоесть скажем, у меня есть 5 библиотек, в каждой свои дифинишны строк, в которые разработчик каждой либы предлагает по-своему задавать значения.
в вашем случае я должен буду создать еще один "хэдер" с кучей строк от всего сразу, а потом распасовать по разным библиотеками дифайны?
Старый 24.10.2009, 14:26
Sebra

offline
Опыт: 5,603
Активность:
Ещё вариант:
enum(LANGUAGES) { ENGLISH, RUSSIAN, DEUTCH, FRENCH, SPANISH, ITALIAN, PORTUGUESE }
define LANG = RUSSIAN

#define L(seng,srus,sdeu,sfre,sspa,sita,spor) = (seng)
#if       LANG == RUSSIAN
    setdefine L(seng,srus,sdeu,sfre,sspa,sita,spor) = (srus)
#elseif LANG == DEUTCH
    setdefine L(seng,srus,sdeu,sfre,sspa,sita,spor) = (sdeu)
#elseif LANG == FRENCH
    setdefine L(seng,srus,sdeu,sfre,sspa,sita,spor) = (sfre)
#elseif LANG == SPANISH
    setdefine L(seng,srus,sdeu,sfre,sspa,sita,spor) = (sspa)
#elseif LANG == ITALIAN
    setdefine L(seng,srus,sdeu,sfre,sspa,sita,spor) = (sita)
#elseif LANG == PORTUGUESE
    setdefine L(seng,srus,sdeu,sfre,sspa,sita,spor) = (spor)
#endif

//...
SayUnitToUnit(u1, u2, L("Hello!", "Привет!", "Hallo!","sorry","don't","know","words"))
//...
Опять скажешь, что хуже твоего? Хоть скажи, чем.
Старый 24.10.2009, 14:28
ScorpioT1000
Работаем
offline
Опыт: отключен
вот возьмем
//автор первый либы предлагает это делать так:
void mylib1_string_init() {
  addSomeStr("ololo")
 addSomeStr("ololo")
 addSomeStr("ololo")
 addSomeStr("ololo")
}

//а автор второй - эдак

void mylib2_init_strings(color a,int offset) {
mylib2_str[offset+0] = a+"ololo"
mylib2_str[offset+1] = a+"ololo"
mylib2_str[offset+2] = a+"ololo"
mylib2_str[offset+3] = a+"ololo"
}
в вашем случае я должен создать
#if LANG == RUSSIAN
  setdef msg_text01 = "Текст для либы 1"
  setdef msg_text02 = "Текст для либы 1"
  setdef msg_text03 = "Текст для либы 1"
  setdef msg_text04 = "Текст для либы 2"
  setdef msg_text05 = "Текст для либы 2"
  setdef msg_text06 = "Текст для либы 1" // потом я забыл, мне надо было одну еще впихнуть
  setdef msg_text07 = "Текст для либы 2"
  // . . .

  • это не есть уникально и это херня)
ScorpioT1000 добавил:
Sebra, уже лучше, я думаю, что-то вроде этого и надо было. Только надо также для онли двух и трех выбранных юзером языков, чтобы не писать лишнего)
Старый 24.10.2009, 14:31
Sebra

offline
Опыт: 5,603
Активность:
ScorpioT1000:
в вашем случае я должен буду создать еще один "хэдер" с кучей строк от всего сразу, а потом распасовать по разным библиотеками дифайны?
В моём первом варианте в тексте пишутся фразы на инглише (как самом универсальном), а весь перевод выносится в инклуд.
Преимущества: лёгкость добавления языка, нет необходимости десять раз по тексту переводить хэлло.
Недостатки: нет возможности по разному перевести одинаковые фразы в разном контексте.
Во втором варианте минимальные дефайны и весь текст по местам.
Преимущества: не нужны инклуды на каждый язык, возможность учёта контекста при переводе.
Недостатки: проблематичное добавление ещё одного языка.
Мой второй вариант во всём лучше твоего.
Старый 24.10.2009, 14:40
ScorpioT1000
Работаем
offline
Опыт: отключен
ScorpioT1000, TRGSTR наше все.
ололо да и только) они тормозятся
ScorpioT1000 добавил:
Sebra, собственно скоро его заюзаю.
Старый 24.10.2009, 14:42
Sebra

offline
Опыт: 5,603
Активность:
ScorpioT1000:
Sebra, уже лучше, я думаю, что-то вроде этого и надо было. Только надо также для онли двух и трех выбранных юзером языков, чтобы не писать лишнего)
Всё бы ничего, но как выбрать языки?
Может так?
enum(LANGUAGES) { ENGLISH, RUSSIAN, DEUTCH, FRENCH, SPANISH, ITALIAN, PORTUGUESE }

define { 
    LANGUAGE1 = RUSSIAN
    LANGUAGE2 = DEUTCH
    LANGUAGE3 = SPANISH
}
define LANGUAGE = RUSSIAN

#define L(s0,s1,s2) = (s0)		//English по умолчанию
#if       LANGUAGE == LANGUAGE1
    setdefine L(s0,s1,s2) = (s1)      
#elseif LANGUAGE == LANGUAGE2
    setdefine L(s0,s1,s2) = (s2)
#endif
Собственно это можно уже в либу. Осталось только перегрузить для каждого количества языков.
Проблема только в том, что enum должен быть вне либы, до определения порядка языков и собственно языка.
Старый 24.10.2009, 14:53
XOR

offline
Опыт: 38,159
Активность:
Скорп, проще говоря у меня не выделяется и не копируется текст который наверху) я думаю выбор через диалог
Старый 24.10.2009, 16:07
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 23:48.