Na chwilę obecną SportsTacticsBoard używa plików .resx
aby przechowywać zasoby w celu internacjonalizacji. Celem jest zapewnienie właściwego tłumaczenia aplikacji użytkownikom. Jednak moim zdaniem używanie tłumaczeń w plikach .resx jest trochę niepraktyczne.
Po pierwsze, głównym powodem na posiadanie oddzielnych plików na tłumaczenie jest to, aby tłumacz nie musiał wiedzieć nic o programowaniu. Jednak pliki .resx są w formacie XML, który jest mało czytelny dla niewprawionego człowieka i bez odpowiedniego programu, który przedstawi plik .resx w postaci tabeli, będzie on miał trudności w jego edycji. Dlatego ja postawiłem na YAML (YAML Ain’t Markup Language).
//XML
<data name="SaveImageDialogTitle" xml:space="preserve">
<value>Save As Image File</value>
</data>
//YAML
SaveImageDialogTitle: Save As Image File
Kolejny problem, który widzę to fakt, że zasoby są kompilowane do biblioteki DLL. O ile plusem takiego rozwiązania jest to, że bez dekompilacji nikt tłumaczenia naszego programu nie popsuje, to utrudnia testowanie zmian tłumaczowi, który nie koniecznie będzie w stanie taką bibliotekę DLL wyprodukować. O wiele łatwiej będzie gdy pliki tłumaczeń są dynamicznie ładowane z edytowalnego pliku tekstowego. Aby nie zachęcać ludzi do otwierania plików tłumaczeń bez potrzeby, dostaną one nazwę w stylu localization.en-US.res
.
Wprowadziwszy zmiany do pliku .res, będą one od razu widoczne po ponownym uruchomieniu programu.
Więc w jaki sposób odwołuję się do tych danych w programie? Utworzyłem klasę ResourceManager
, która ładuje odpowiednie pliki do pamięci i udostępnia dane przez klasy *Resource
. Np. LocalizationResource
, który zawiera takie własności jak nazwy pól w pliku localization.*.res
public string SaveImageDialogTitle { get; set; }