Локализация с использованием файла ресурсов

Для локализации я использую файл * .resx. Имя - это фраза или слово на английском языке. Ценность - перевод этой фразы на другой язык. Я выбираю этот подход, чтобы иметь один файл локализации для всего приложения. И любой, у кого есть этот файл, может сделать перевод самостоятельно.

Но в редакторе resx Visual Studio 2010 каждая запись с именем, в котором есть пробелы, имеет предупреждение: «Имя ресурса не является допустимым идентификатором». Хотя он компилируется и работает, но скажите, пожалуйста, если я здесь что-то не так делаю.


person Peter17    schedule 04.03.2011    source источник


Ответы (3)


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

Например, вы можете создать Forms.en-GB.resx, Forms.pl-PL.resx, Forms.de-DE.resx, и соответствующий файл будет выбран на основе текущей культуры пользовательского интерфейса без каких-либо действий ( кроме обеспечения установки соответствующей культуры).

Visual Studio сгенерирует класс ресурсов, содержащий все ваши пары ключ / значение из файла ресурсов в качестве свойств, что упрощает использование в коде. Полученное предупреждение означает, что ключи, которые вы указали в файле ресурсов, не являются допустимыми идентификаторами (они содержат пробелы). Вы можете использовать _ вместо пробела в ключах.

Если вы не хотите использовать сгенерированный класс, игнорируйте это предупреждение - ваши файлы resx в порядке и могут использоваться напрямую. Вы можете удалить ResXFileCodeGenerator из свойства «Custom Tool» вашего файла resx (окна свойств) или установить для параметра «Модификатор доступа» значение «Без создания кода» в редакторе файлов resx, если вам не нужно создавать класс, но вы все равно получите предупреждение.

person Jakub Konecki    schedule 04.03.2011
comment
Имейте в виду, что это то, что он уже делал; проблема, которую он поднимает, - это один из пробелов в идентификаторах. Редактор VS допускает только сопоставления ключей / значений / описаний; это не таблица переводов. - person Noon Silk; 04.03.2011
comment
@Noon Silk - «проблема, которую он поднимает, заключается в одном из пробелов в идентификаторах» - я сказал, что это предупреждение можно безопасно игнорировать, если сгенерированный класс не нужен. - person Jakub Konecki; 04.03.2011

Сила локализации с помощью файлов resx заключается в том, что культура вашего компьютера решает, на каком языке должно быть ваше приложение. Если вы придерживаетесь одного файла resx, по моему мнению, вы игнорируете его силу. Вместо этого попробуйте создать файл resx для каждого языка, который вы хотите интегрировать. например: язык по умолчанию - английский, тогда у вас есть страница по умолчанию localization.resx, где вы сохраняете только английские предложения. Скажем, вам нужен французский перевод, создайте еще один файл resx с именем localization.fr-FR.resx. Таким образом, пользователи, у которых на компьютере включена культура fr-FR, будут использовать этот язык в программе без какой-либо конкретной работы над кодом. Если кто-то с культурой, не интегрированной в ваше приложение, запустит программу, он будет ее искать, а если не найдет, то выберет вариант по умолчанию, то есть английский.

Поэтому, на мой взгляд, не используйте один файл resx для разных языков, а используйте полномочия, указанные в структуре.

person Terry    schedule 04.03.2011
comment
Спасибо за объяснения. Я не понял. На самом деле у меня есть отдельный файл resx для каждого языка. Но все локализации производились вручную. A написал общий метод Localize для формы, который проходит через все элементы управления и переводит их с использованием текущего файла resx: var form = new Form (). Localize (); И все строки в приложении также используются как somestring.Translate (). - person Peter17; 04.03.2011
comment
Есть ли какая-то конкретная причина, по которой вы не хотите указывать программе на перевод и не позволять ей делать это автоматически? - person Terry; 04.03.2011

Я полагаю, это работает, но на самом деле это не та стратегия, которой вы должны следовать.

Взгляните здесь; основная идея состоит в том, что вы пользуетесь преимуществами элементов управления в .NET, чтобы автоматически получать правильную локализацию, поэтому вам не нужно беспокоиться о переводе.

Хотя я не использую это все время, и я иногда делаю то же самое, что и вы, но я обычно использую идентификатор, поэтому у меня может быть:

UserWelcome  Hey, {name}, thanks for dropping by ...

А потом я переведу это. Это полезно, потому что допускает универсальность в языках (например, некоторые языки следует приветствовать формально, а другие нет, вы не хотите, чтобы вам мешал прямой перевод, скажем, «вы»).

Надеюсь, это ясно.

Если то, что у вас есть, работает, я полагаю, что это что-то, но это не «общий» способ сделать это.

person Noon Silk    schedule 04.03.2011