If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
Дискуссия уже давно потеряла смысл и превратилась в бессмысленный срач.
Было уже сказано с примерами:
1) Перевод должен быть отделён от ввода-вывода.
2) printf не справляется с задачей перевода: строка вроде «item 3 from 12» превращается в «यह आइटम पूरी तरह से 12 वस्तुओं से 3 नंबर है» (если гугл не врёт). Поэтому фразы должны быть с номерами аргументов типа %1 %2, как это есть в boost format.
3) Работать лучше с тем, что удобнее конкретному программеру. Но потоки являются типобезопасными, в этом есть их некоторое приемущество.
Это почему это?
клочок текста один — msgs.get (cat, 1, CODE1, def).
клочок текста два — msgs.get (cat, 1, CODE2, def).
а связи между ними не будет. Такое корректно перевести вообще невозможно.
cout работает с частями текста, поэтому не пригоден для перевода
printf работает со строго заданной последовательностью аргументов, поэтому не пригоден для перевода. «item 3 from 12» для другого языка требует изменить порядок аргументов «यह मद 12 मदों से 3 नंबर है».
Пора бы понять, что они оба не справляются с переводом.
Это почему это? клочок текста один — msgs.get (cat, 1, CODE1, def). клочок текста два — msgs.get (cat, 1, CODE2, def). а связи между ними не будет. Такое корректно перевести вообще невозможно.
а Вы им будете давать типы аргументов вписывать, да?
или таки локализованная строка таки будет выглядеть «## of ## files loaded» и потом (для printf) по ней пройдёт автопарсер и по заданным правилам приведёт строку к «%d of %d files loaded» и положит её в ресурсы?
Это еще почему? Или мы под ресурсами понимаем разные вещи?
ресурсы должны собираться автоматически, вот как у Qt translator (или как там его) сделано, иначе если у тебя вдруг внутренний формат поменяется (а такое бывает) или ещё что то твои переводчики (или кого ты там посадишь) будут работать ишаками перебивая ручками циферки
> какая разница что там будет потом, переводчик видит и работает со строками целиком, а уж как потом они транслируются и хранится - никого не волнует
Это как это? То есть код генерится по ресурсам, а не наоборот? Тогда веселая жизнь обеспечена программистам.
ну зачем Вы глупости говорите, Вы же умный человек :)
код пишут программисты, но чтобы не учить переводчиков в каком внутреннем формате это всё хранится и не переучивать если он внезапно поменялся делается небольшая тулза для них, которая человечий вид переводит во внутренний формат хранения, а там уже пофиг чем и как выводить
эх, не общались Вы с гейм-дизайнерами по рабочим вопросам :)
Возьмем например qt.
Я делаю так tr(«%1 of %2 files loaded»), потом натравливаю lupdate, который генерит ts файл. ts файл открывается в лингвисте переводчиками, которые увидят там полную фразу «%1 of %2 files loaded». В случае с gettext механизм аналогичен.
А как быть вот с этим cout << msgs.get (cat, 1, CODE1, def) << i << msgs.get (cat, 1, CODE2, def) << n; ? Опишите механизм полностью. Мне не понятно каким образом в ресурсах возникнет полная фраза, а не ёё куски.
Что ты уцепился за этот кусок? Меня попросили «перевести» дословно. В продакшне я бы тоже не стал такое писать.
У меня ваще опыта локализации нет, если честно, я специализируюсь по легаси.
> ресурсы должны собираться автоматически, вот как у Qt translator (или как там его) сделано, иначе если у тебя вдруг внутренний формат поменяется (а такое бывает) или ещё что то твои переводчики (или кого ты там посадишь) будут работать ишаками перебивая ручками циферки
Значит мы все же говорим о разных ресурсах. Какая разница переводчикам, какой там внутренний формат? Они работают со строками. С целыми строками. В моем случае это строки диалогов персонажей, объединенных в группы.
Так что не нужно мне рассказывать про некий геймдейв. Вы ведь преподаватель, а не геймдевелопер.
А как быть вот с этим cout << msgs.get (cat, 1, CODE1, def) << i << msgs.get (cat, 1, CODE2, def) << n; ? Опишите механизм полностью. Мне не понятно каким образом в ресурсах возникнет полная фраза, а не ёё куски.
прости дорогой, но твоя проблема в том что ты не понимаешь концепции потоков, это не плохо, это просто вот так сложилось :)
вот сейчас ты путаешь вывод и хранение, к примеру :)
следует относиться относится к приёмнику потока как к буферу, а не устройству вывода
что мешает сделать вот так?
UnicodeString result;
result = MessageFormat::format(
"At {1,time} on {1,date}, there was {2} on planet{0,number,integer}.",
arguments,
3,
result,
err);
а внутри использовать твою «любимую» ;) фразу:
result << msgs.get (cat, 1, CODE1, def) << i << msgs.get (cat, 1, CODE2, def);
что мешает тебе использовать класс для хранения строки целиком и по запросу извлекать из словаря все составляющие?
тебе лучше и дальше использовать концепцию форматирования строк в стиле printf и не забивать себе голову :)