2013-08-07 5 views
2

Мне нужен способ использовать третий «слой» файла ресурсов, специфичного для культуры. Это можно сделать так, как должно быть, и, возможно, каким-то образом взломали. И пока хак не слишком велик, все в порядке! Другое решение также возможно (если я неправильно подхожу к проблеме, скажите, пожалуйста, лучшее решение).Три слоя файлов ресурсов, специфичных для культуры

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

Дело в том, что у нас есть несколько сайтов с разными темами (лошади, автомобили, rc-units и т. Д.), И когда мы используем строку из файла локализованного ресурса, если ресурс не переводится в определенный язык пока, это будет возврат к английскому языку, который является языком по умолчанию. Круто!

Пример проблемы: У нас есть фраза «Добавить свою лошадь» и «Добавить свой автомобиль», и это может показаться одним и тем же (когда речь заходит о грамматике) на английском языке, но это не обязательно так на польском или румынском!

Таким образом, я думаю, что мы должны, если возможно, иметь английский файл с «Добавить ваш {0}», а затем польский файл с эквивалентным предложением на польском языке, кроме того, перевод, где грамматика подходит для слова «Автомобиль» и «Лошадь», специфический польский перевод, где грамматика подходит для слова «Лошадь».

Проблема может быть не так плохо с двумя или тремя темами на двух или трех языках. Было бы легко подумать, что мы могли бы просто переключиться на код, обрабатывающий эти несколько случаев. Дело в том, что у нас есть 15 тем, на 6 разных языках и расширяются.

Надеюсь на некоторые аккуратные хаки или знания некоторых редких экзотических особенностей!

Заранее спасибо

+0

Это звучит слишком запутанным, и легко может стать неуправляемым. Почему бы не придерживаться стандартного подхода и не добавить «Добавить свой автомобиль» и «Добавить свою лошадь» в две полностью отдельные строки? – andreister

+0

Тогда я также понадоблюсь: * Добавить ваш гс-блок * Добавить трактор * Добавить кошки * Добавить собаку * Добавить корвет Три строки для немецких, десяти строк для датского, три для французского, и, наконец, для румынского, испанского, польского и австрийского языков. Мы также планируем дальнейшее расширение (в настоящее время четыре новых сайта поставлены в очередь) – f2lollpll

+0

Ваш конкретный пример работы _might_, предполагающий, что вы готовы рассматривать различия полов/склонения/etc, вносимые конкретными словами (как ThoBa упоминает в своем ответе): т. е. вместо «добавить свой {0}» вам понадобится более универсальный шаблон, например «добавьте ваш [женский] {0}», «добавьте ваш [мужской] {0}» и т. д., все языковые - как я уже сказал, это быстро станет кошмаром. Строки должны быть такими же простыми и легкими в переводе, насколько это возможно - время переводчиков обычно менее дорогое, чем время разработчиков, затрачиваемое на сортировку проблем локализации и внедрение суровых решений. – andreister

ответ

2

Я не указывая решение для вашей проблемы, но я, тем не менее, озабоченность по поводу вашей строкового форматирования:

Одна из проблем с вашим примером является использование String.Format с переводами.

«Добавить вашу {0}» часть, на некоторых языках, потребует разные формулировки в зависимости от того, что будет вставлено в часть {0}.

Пример:

«Добавить вам лошадь» будет, в переводе на датский язык, стать «Tilføj дин Хест», тогда как «Добавить осла» переведут в «Tilføj æsel дит». Итак, вы видите, что есть разница: din/dit, которые не будут правильно переведены из «Добавить ваш {0}». То же самое касается других языков, таких как немецкий.


Edit: псевдо-ответ может быть что-то вроде: Добавить больше строк в каждой Resx-файл (с идентификаторами, как AddYourItemHorse, AddYourItemRacecar и AddYourItemDonkey) для каждой из тем. Или создайте файл ресурсов, такой как PageName.Racecar.da-DK.resx, с ресурсами для гоночной трассы в нем и так далее. Затем, на основе области кода, темы и текущей культуры, вы делаете следующее:

Dictionary<string, string> resourceDictionary = new Dictionary<string, string>(); 
private void fillDictionary(string path) 
{ 
    using (ResXResourceReader rxrr = new ResXResourceReader(path)) 
    { 
     foreach (DictionaryEntry entry in rxrr) 
     { 
      //Fill the fillDictionary 
     } 
    } 
} 

А затем получить доступ к строке в словаре конкатенацией то, что вы хотите со строкой, представляющей тему:

string theme = "Racecar"; 
Label testLabel = new Label(); 
testLabel.Text = resourceDictionary[AddYourItem + theme]; 

В качестве альтернативы вы можете иметь файл ресурсов pr. площадь, язык и темы, как: MainForm.Racecar.da-DK.resx, а затем построить путь, пройденный к fillDictionary так:

string languageCode = Thread.CurrentThread.CurrentCulture.Name; 
string path = "MainForm." + theme + "." + llanguageCode + ".resx"; 

И пройти путь к fillDictionary-метода.

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

Вы можете прочитать больше о ResXResourceReader здесь: Working with .resx Files Programmatically

+0

И это действительно проблема. И поэтому для каждого элемента есть определенные строки, так как «æsel» и «hest» получают каждый свой файл ресурсов, как на датском. На некоторых языках грамматика хуже, чем датская! – f2lollpll

+0

На самом деле, это еще не все! Вы заставили меня понять некоторые новые способы атаки на проблему! Пути невероятно близки к тому, что вы только что описали;) – f2lollpll

+0

Я рад слышать! Пожалуйста, не забудьте указать свое решение для других с той же проблемой. – ThoBa

Смежные вопросы