SportsTacticsBoard - Resources

5 Lipca 2016

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; }