Member 14824959 Ответов: 2

Как изменить текстовое содержимое нескольких меток формы VB с помощью текста из массива


Я пишу код на VB 2017 и 2019 годов. В многоязычном приложении на экране входа в систему пользователь вводит имя пользователя, пароль и языковые предпочтения (0=английский по умолчанию, 1=французский и т. д.).Следующая форма имеет 10 меток (Label1, Label2... Label10). Эти метки имеют текстовое содержимое на языке приложения по умолчанию (т. е. на английском языке). У меня есть массив из 10 строковых значений с текстом, описывающим каждую метку на иностранном языке (т. е.Французский). Если выбранный язык был французским, мне нужно изменить все 10 меток на французский текст с помощью цикла...
if gLang = 1 then
   for x=1 to 10
'     don't know what code to enter here? like > Me.Label(x).Text= array1 (x) ?
   next x
end if

Дополнительная информация : переменная Lang будет глобальной и когда каждая последовательная форма
загрузка первой информацией будет количество меток для новой формы и код для загрузки конкретного массива... Другой идеей может быть чтение описания каждого поля из базы данных с ключом FormName + Language + field number...

Любая идея будет оценена по достоинству.

Что я уже пробовал:

тест с 3 полями...
Dim x As Integer

        For x = 1 To 3
            Me.("Label" & x).text.content = Choose(x, "one", "two", "three")
        Next

выдает ошибку ожидаемый идентификатор BC30203

тоже:
Dim x As Integer

        For x = 1 To 3
            Me.ToString("Label" & x).text.content = Choose(x, "one", "two", "three")
        Next

выдает ошибку BC30456 'text' не является членом 'Char'

2 Ответов

Рейтинг:
2

RickZeeland

Вот несколько псевдокодов для более простого подхода:

// Create a dictionary:
Dictionary<string, string> DicLanguage 

// Depending on the users choice fill it from the correct language file:
string fileName = "lang_nl.txt";
var langArray = File.ReadAllLines(fileName);

foreach (var line in langArray)
{
	// the key and text are separated by = 
	// e.g. Form1_textboxInfo = My first textbox
	int pos = line.IndexOf('=');
	string strKey = line.Substring(0, pos);
	string strValue = line.Substring(pos + 1);
	DicLanguage.Add(strKey, strValue);
}

// Test:
textboxInfo.Text = Translate("Form1_textboxInfo");


public static string Translate(string key)
{
	if (DicLanguage.Count > 0)
	{
		string translated;
		
		if (DicLanguage.TryGetValue(key, out translated))
		{
			return translated;
		}

		Debug.Print("Translate() not found: " + key);
	}

	return key;
}


Рейтинг:
0

RickZeeland

Может быть, вы найдете эту библиотеку переводчиков полезной: Библиотека языковых переводов для вашего .Net-приложения[^]
К услугам гостей ресторан TranslateControls() Функция для перевода свойства "текст" элементов управления и их дочерних элементов управления.

Если вы предпочитаете иметь решение с открытым исходным кодом, см.: Локализация приложений .NET Windows Forms[^]
Это также может переводить коллекцию элементов управления и использовать базу данных для хранения языков.
Лично я бы предпочел хранить языки в текстовых или xml-файлах, так переводчику будет гораздо проще перевести файл для вас. И если вы используете систему контроля версий, такую как GIT, вы можете легко обнаружить изменения между версиями.


Member 14824959

Спасибо Рик, это было быстро! ***** оба решения выше выглядят очень многообещающими для обеспечения решения проблемы многоязычного приложения. Я должен оценить, протестировать и решить, что лучше всего подходит для моих нужд. Но если кто-то может предоставить решение для оригинального вопроса кодирования, я был бы признателен! Много лет назад в другом приложении у меня был весь языковой текст в текстовых файлах (загруженных в массив), и в приложении была утилита для обновления файлов перевода. Но когда форма загружалась, у меня было много "разговорчивых" строк кода, таких как...
Me.Text = Fnam(3) 'для заголовка формы -> где Fnam(x) : имя поля в
- выбранный язык
lbNewPassMsg.Text = Fnam(4)
lbOldPassword.Text = Fnam(5)
lbNewPassword.Text = Fnam(6)
lbReNewPassword.Text = Fnam(7)

В форме с 50-60 метками у меня был код, подобный приведенному выше, из 50-60 + 1 строк... нет
эффективное кодирование, но оно работало. Вот почему я хотел бы получить решение кодирования, первоначально запрошенное для эффективного обновления этого приложения.

RickZeeland

Я написал переводчик для Winforms на C#, но, к сожалению, не могу раскрыть исходный код.
Он работает в соответствии с упомянутыми примерами с коллекциями элементов управления, если вы не хотите работать с коллекцией элементов управления forms, я опубликую еще один ответ с некоторыми советами для вас.