Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/33: Рейтинг темы: голосов - 33, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57

Локализация текста в строке

29.10.2021, 15:47. Показов 7085. Ответов 40

Студворк — интернет-сервис помощи студентам
Привет всем!
Решил вывод от консольных утилит, перед показом в окне программы, перевести на русский и другие языки.
Строчка для обработки не очень большая и нужно перевести лишь некоторые слова, которые будут в "словаре" программы.
Не придумал ничего другого, кроме:
PureBasic
1
2
3
4
Str$ = ReplaceString(Str$, "Convert ", "Конвертируем ")
Str$ = ReplaceString(Str$, "Extraction from ", "Извлечение из ")
Str$ = ReplaceString(Str$, " to ", " в ")
Str$ = ReplaceString(Str$, "Creating filesystem with parameters:", "Создание файловой системы с параметрами:")
Но по мне, так то это громоздко и исходная строка будет обрабатываться много раз, тем более слов для перевода, может быть около пятидесяти...
Может есть у кого то предложения, как улучшить обработку и что использовать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2021, 15:47
Ответы с готовыми решениями:

Локализация текста с игровым счетом
Всем привет. Такая проблема появилась. Делаю локализацию в игре, подтягиваю через ключи из файла xml. Название игры, меню, и прочий...

Замена текста в html коде (локализация странички)
Всем привет, есть задачка - написать программку для локализации текста в html коде с английского на другие языки, т.е. есть три поля...

В строке записаны слова исходного текста, в отдельной строке - одно из слов, которое может быть в строке
В строке записаны слова исходного текста, в отдельной строке - одно из слов, которое может быть в строке (количество букв не...

40
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,532
03.11.2021, 07:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Я реализовал просто списком, в текстовом файл.
Программе достаточно порядкового номера строки, можно и комментарии писать в языковом файле, обозначив ; в начале строки.
именно так и устроен ини-файл

Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
НЕ лучший вариант, время на перевод этих файлов уходит много, если не пользоваться какими либо утилитами.
интересно, каким образом дольше
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.11.2021, 12:51  [ТС]
Цитата Сообщение от newJS Посмотреть сообщение
именно так и устроен ини-файл
Ини это секции, строка и её значение
Текстовой файл, это просто строки.
Реализацию, нужно выдирать из моего проекта и создать хоть какой то пример.
Сделаю чуть позже и выложу.
0
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,532
05.11.2021, 07:18
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Ини это секции, строка и её значение
Текстовой файл, это просто строки.
для ини-файла уже всё изобрели
ключ-значение, нужное получаем по ключу
в некоторых случаях и секции могут быть полезны, только польза и ни каках помех

для своего нужен свой велик, уже вопрос зачем, если есть готовое
и непонятно как получать нужные строки, если это просто строки без ключа
городить огород с какими то привязками, зачем
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
01.04.2023, 21:38  [ТС]
Цитата Сообщение от newJS Посмотреть сообщение
и непонятно как получать нужные строки
Номер строки, является индексом
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Procedure SetLanguage(UserLang$="")
    Protected PathLang$, i=0, tmp$, count 
    If UserLang$ <> "" : st\Lang = UserLang$ : EndIf
    PathLang$ = ExePath$+"language\"+st\Lang+".lng"
    count=ArraySize(Lng())
    If FileSize(PathLang$) > 1 And ReadFile(9, PathLang$)
        While Eof(9) = 0
            tmp$ = ReadString(9) 
            If tmp$ And Left(tmp$, 1) <> ";"
                i+1
                If i > count : Break : EndIf ;Прерываем цикл, если в файле больше строк, чем в таблице.
                Lng(i) = tmp$
            EndIf
        Wend
        CloseFile(9)
    EndIf
EndProcedure
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
02.04.2023, 23:47
PureBasic
1
If tmp$ And Left(tmp$, 1) <> ";"
сейчас я бы написал так
PureBasic
1
If Asc(tmp$) And Asc(tmp$) <> ';'
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.04.2023, 11:38  [ТС]
AZJIO, Да и так норм работает.... Есть в чём то сакральный смысл делать по другому?

Процедура вырезана из моей программы. И сама мультиязычность проста в реализации
Создаём таблицу, можно большей вместимостью, чем количество строк
Вписываем в неё строки языка по умолчанию. Я подключаю этот файл инклюдом.
Считываем поле нужно строчки с помощью индекса, например: Lng(1)
Я стараюсь в коде делать комментарии, какой текст по умолчанию вписан по этому индексу, что бы не смотреть в таблице
Если загружаем внешний файл локализации, таблица переписывается.
Далее меняем текст в гаджетах, вызывая отдельную процедуру. Что то если надо, перерисовываем.

Самый главный плюс, то что файл локализации очень просто перевести на любой язык, загнав его текст в онлайн переводчик, ручная правка нужна, но лишь для доведения текста до идеала.

Да и минимум кода
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.04.2023, 13:15
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Процедура вырезана из моей программы.
Скорее всего это моя версия немного переделанная, потому что я сам это использовал ещё в AutoIt3, потом перенёс на PureBasic и у меня этот код в нескольких программах на PureBasic.

Я сейчас подумал, если строка пустая то она игнорируется, и счётчик строк не увеличивается. Можно попробовать сделать если строка пуста, то оставить старое значение, как бы не делать перевод для этой строки. Например не нравится одна из строк, добавил только её, а остальные остались оригинальные, не переназначая все строки.

Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Есть в чём то сакральный смысл делать по другому?
Я всегда ищу минимальные затраты на выполнение кода. Функция Asc() берёт первый символ в строке, причём бинарно, если он 00, то строка пуста иначе код символа, например если 65, то это буква "A" (англ.), то есть функция не обращается к переменной как к строке, а берёт первый бинарный код символа по указателю на строку. Далее в одинарных кавычках ';', компилятор преобразует это в код буквы 59, то есть фактически это 100% равен коду
PureBasic
1
Asc(tmp$) <> 59
то есть мы берём по указателю первый бинарный код в строке и сравниваем не равен ли он 59. Это работает быстрее, чем преобразование в строку или сравнивание строк.

Ну и в идеале идентификатор файла переделать на #PB_Any

Добавлено через 15 минут
Вот я его выкладывал на форуме PureBasic.
И AutoIt3 версия
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.04.2023, 13:44  [ТС]
Цитата Сообщение от AZJIO Посмотреть сообщение
Скорее всего это моя версия немного переделанная
Хз, сам уже не помню...
Я и в твоих исходниках что то подсматриваю и в nikzzzz
Цитата Сообщение от AZJIO Посмотреть сообщение
строка пустая то она игнорируется, и счётчик строк не увеличивается
так она не должна быть пустой... Это на совести того кто локализует файл.
Цитата Сообщение от AZJIO Посмотреть сообщение
то есть функция не обращается к переменной как к строке
Буду знать, спасибо.
Цитата Сообщение от AZJIO Посмотреть сообщение
Ну и в идеале идентификатор файла переделать на #PB_Any
Вот этого не понял..
Мне вот не нравится то, что нужно заполнять, таблицу, инклюд с указанием индекса... Куда красивее использовать тоже текстовый файл для языка по умолчанию и считывать с него текст, если не найден не один внешний файл локализации.
А сам текстовик разместить в ресурсах, по типу делфи, так появится возможность править локализацию по умолчанию, изменяя этот ресурс.
Цитата Сообщение от AZJIO Посмотреть сообщение
Вот я его выкладывал на форуме PureBasic.
Не люблю автоматизацию в этом деле, готов потратить неделю и вывести все строки вручную, хотя долго и муторно, зато уверенности больше что автоматизация где то не накосячила. За ссылку мерси, посмотрю.

Добавлено через 11 минут
AZJIO, Посмотрел в коде... У тебя же файл ini и секция Lang
Тут перевод на свой язык занимает больше времени, приходится каждую строку закидывать в переводчик и вставлять результат.
В моём варианте, просто текстовый файл, выделяем весь текст, вставляем в окно гугл переводчика и забираем переведённые строки, вставляем в свой файл, проверяем количество строк. Вроде в 7zip такие файлы локализации, но там вверху комменты и есть пустые строки...
А мне то визуально нужно видеть номер строки, например в Notepad++
Хотя тем кто локализует, особо не важен номер строки, это больше для моего анализа.
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.04.2023, 14:10
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
У тебя же файл ini и секция Lang
это одна из разновидностей. Там же 3 примера, выбираешь какой нравится. Смотри файл "example Windows, Linux + txt.pb" - это тот что читает файл построчно.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.04.2023, 15:03  [ТС]
У видел... Как бы уже реализовано, проверено и отменно работает.
Вот на этапе ручной локализации ранее созданного проекта, была трудность с заполнением таблицы (прописыванием индексов), типо неудобно.
Вот бы файл локализации, по умолчанию, был бы в отдельном текстовом файле и находился в ресурсах основного, после компиляции.
Извлекался в память, считывался и заполнял таблицу. Но я в этом не силён...
Изображения
 
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.04.2023, 16:26
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
и находился в ресурсах основного
Я бы рад использовать стратегию Windows, но для меня важно писать и для Linux, при мизерных затратах - доводки до Linux получаем аудиторию в 2 раза большую.
А вообще-то я использую, только не Windows-стратегию. Первым делом добавляем ini-файл в код целиком.

PureBasic
1
2
3
4
5
DataSection
    ini:
    IncludeBinary "sample.ini"
    iniend:
EndDataSection
далее, если ini-файл не найден, то сохраняем его
PureBasic
1
2
3
4
5
6
7
8
9
10
11
Procedure SaveFile_Buff(File.s, *Buff, Size)
    Protected Result = #False
    Protected ID = CreateFile(#PB_Any, File)
    If ID
        If WriteData(ID, *Buff, Size) = Size
            Result = #True
        EndIf
        CloseFile(ID)
    EndIf
    ProcedureReturn Result
EndProcedure
То есть файл находится в коде, но не как ресурс, который можно открыть через "Resource Hacker", а как бинарные данные. Говорят что исполняемый файл не весь загружается в память, то есть без ресурсов, а ресурсы он читает уже по мере необходимости. Да, здесь выигрышь, так как использование IncludeBinary приводит к загрузке ini-файла как тела программы в память, но там копейки, несколько кб. Опять же не каждый пользователь догадается что исполняемый файл "сгенерировал" файл локализации, а все файлы локализации совать в исполняемый уже накладно, вот один английский как пример ещё ладно, а все - нет. лучше тогда с прогой в архиве положить, или при инсталяции сделать выбор и добавить только выбранный.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.04.2023, 16:40  [ТС]
AZJIO, Всё бы тоже самое, но с текстовым файлом и без его извлечения на диск...
Я тут просвещаюсь на разных ресурсах...
У нас уже имеется
PureBasic
1
ini:
при запуске программы, эти данные же находятся в памяти?
Если да, то можно извлечь строки не извлекая файл на диск:
PureBasic
1
Text.s=PeekS(?ini)
У меня работает что то по тиру этого, только извлекает первую строку, толи памяти мало выделено, толи встречается конец строки

Добавлено через 5 минут
AZJIO, меня чуть не так понимаешь... я хочу отказаться от инклюда-массива с локализацией по умолчанию. Так как неудобен формат его, для заполнения вручную. А вместо его использовать обычный текстовой файл, как и для остальных файлов локализации. Так же просто его править в Notepad++, но при компиляции программы, загонять его в data, при запуске файла, считывать из него строки в массив языка по умолчанию
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.04.2023, 16:48
CryptoNickSoft, должно работать. Если только брать файл UTF, а читать как Ascii, хотя в этом случае прочитает только один символ. Буквально недавно в инструменте FindAllReferences в функции GetScintillaText() используя PeekS читает весь документ Scintilla, даже если там 6 тыс. строк и нигде не обрывался. Надо код смотреть.
Используешь Split для разделения на массив строк?
Используешь файл без BOM? Метка там не нужна.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.04.2023, 17:04  [ТС]
Цитата Сообщение от AZJIO Посмотреть сообщение
Я бы рад использовать стратегию Windows, но для меня важно писать и для Linux, при мизерных затратах
Смотря что писать... У меня в любой проге столько вызовов Windows API, что при всём желании, в Linux она не заведётся. Cделать тоже самое средствами PureBasic, увы нельзя. Кто бы что не говорил, но сам язык, без дополнительного использования Windows Api, не может выполнять даже элементарные действия. Типо накрыли функции API Windows и Linux, универсальными для PureBasic, а если чего то не хватает, то сами их ищите и прописывайте в код. Причём Фред особо и не стремится расширять список команд и их разнообразие. Приходится выискивать код, адаптируя его. На это уходит куча времени, а не на идеи и тестирование. Ещё уходит куча времени на интерфейс, размещение элементов в окне. Хоть есть редактор форм, но он бесполезен, ибо не покрывает даже все действия с гаджетами, предусмотренные языком программирования.

Добавлено через 4 минуты
Цитата Сообщение от AZJIO Посмотреть сообщение
должно работать
Ну не знаю, сделаю тестовый проект, проверю в нём.
Вот, при условии что считали весь текст в переменную: Text, нужно же ещё индексированные строки в массив записать, ну и подчистить за собой мусор...
Можно же так сделать:
PureBasic
1
FreeMemory(?ini)
Или это ничего не даст?
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.04.2023, 17:30
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Или это ничего не даст?
Думаю ничего не даст. Это не динамические данные, ссылка даётся на память внутри загруженного файла программы.

Добавлено через 16 минут
Нашёл всё-таки ссылку, где я сетовал, что трёх-кратное использование строк языкового перевода, как от этого избавиться и чел предложил использовать ресурсы. Может тебе будет интересно.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.04.2023, 18:26  [ТС]
Цитата Сообщение от AZJIO Посмотреть сообщение
Может тебе будет интересно
Интересно.
Но всё таки не очень удобно вручную в эти ресурсы вписывать строки. Ибо у ресурса свой задокументированный формат.
Но может получится адаптировать и внести свой текстовой файл в какую либо секцию. Не все же они имеют определённый PE формат. Есть же и для свободного использования. Пихают же в ресурсы что угодно, в том же делфи. Но нужно что бы Restorator смог открыть этот файл для правки...
В общем, забил на проекты, занимаюсь наработкой знаний
0
63 / 61 / 3
Регистрация: 06.11.2010
Сообщений: 186
Записей в блоге: 1
03.04.2023, 18:49
"Resource Hacker" и ResourcesViewerAndCompiler имеют возможность создать пустой dll для ресурсов, сам лично просил автора "Resource Hacker" добавить эту возможность. Так что не нужен никакой левый dll, чтобы напихать туда ресурсов. ресурсы туда на самом деле легко вставлять, не нужно это делать построчно. Сделай экспорт в rc-файл, он по факту текстовый вставь строки, импортируй обратно. Можно прямо в проге вставить сразу страницей. Можно через ком-строку. Формат для свободного использования он там будет бинарный и скорее всего с теми же проблемами трёхкратного использования памяти. Я не разбирался, но мне кажется надо использовать WinAPI функции ресурсов работая с разделом String, кончено, там строки пронумерованы.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
04.04.2023, 00:42  [ТС]
Цитата Сообщение от AZJIO Посмотреть сообщение
Используешь Split для разделения на массив строк?
Если честно не понял зачем и как адаптировать..
Вот написал пример (на скриншоте)
Вроде как работает, но в конце какой то мусор от
PureBasic
1
PeekS(?lang, ?end_lang-?lang, #PB_UTF8)
Файл в UTF8 пробовал и с BOM и без него
Миниатюры
Локализация текста в строке  
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
04.04.2023, 00:50  [ТС]
так выглядит текстовой файл
Миниатюры
Локализация текста в строке  
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
04.04.2023, 01:00  [ТС]
Так уже без мусора:
PureBasic
1
text$ = PeekS(?lang, (?end_lang-?lang)-3, #PB_UTF8)
Но почему именно три? Открыл текстовый файл в Hex редакторе, ничего лишнего кроме текста в нём нет...

Добавлено через 5 минут
Цитата Сообщение от AZJIO Посмотреть сообщение
Используешь Split для разделения на массив строк?
то есть не использовать получение полного теста из памяти, а прям нарезать в массив строки?
Не понял как адаптировать это под такой вариант работы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2023, 01:00

В строке S записаны слова исходного текста, в отдельной строке S 1 записано одно из слов, которое может быть в строке S (количество букв в S1 не п
В строке S записаны слова исходного текста, в отдельной строке S 1 записано одно из слов, которое может быть в строке S (количество букв...

В строке S записаны слова исходного текста, в отдельной строке S1- одно из слов, которое может быть в строке S (количество букв в S1 не превышает 10)
В строке S записаны слова исходного текста, в отдельной строке S1 - одно из слов, которое может быть в строке S (количество букв в S1 ...

Подсчитать в строке текста гласные, которые входят в каждое слово текста
Подсчитать в строке текста все гласные,которые входят в каждое слово текста... вывод- буква и сколько раз повторяется. (с помощью...

По нажатию кнопок мыши на строке изменяется цвет и фон текста в строке
Добрый вечер! :) Нужно написать программу, которая по нажатию левой кнопки мыши на строке изменяет цвет и фон текста в строке (собственно...

Формулы Mathtype располагаются выше текста в строке текста
Пример во вложении (и я такое встречаю достаточно часто) - смотрите строчку с формулой. Формула Mathtype находится выше текста (в данном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru