{"id":54,"date":"2012-01-21T11:32:00","date_gmt":"2012-01-21T11:32:00","guid":{"rendered":"http:\/\/tpodolak.com.hostingasp.pl\/blog\/2012\/01\/21\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/"},"modified":"2016-01-31T00:22:13","modified_gmt":"2016-01-31T00:22:13","slug":"lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library","status":"publish","type":"post","link":"https:\/\/tpodolak.com\/blog\/2012\/01\/21\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/","title":{"rendered":"Lokalizowanie aplikacji Silverlight i Windows Phone z wykorzystaniem Portable Shared Library"},"content":{"rendered":"<p>Witam<br \/>\nW dzisiejszym wpisie postaram si\u0119 przedstawi\u0107 w jaki spos\u00f3b lokalizowa\u0107 tre\u015bci aplikacji typu Silverlight oraz WindowsPhone. Za\u0142o\u017cenie jest takie, \u017ce chcemy zbudowa\u0107 multiplatformow\u0105 aplikacj\u0119, kt\u00f3ra b\u0119dzie obs\u0142ugiwa\u0142a platform\u0119 Silverlight oraz Windows Phone. Rozs\u0105dnym zatem podej\u015bciem jest trzymanie wszystkich t\u0142umacze\u0144 w jednym miejscu &#8211; najlepiej aby mechanizm t\u0142umaczenia by\u0142 obs\u0142ugiwany zar\u00f3wno przez Windows Phona jak i Silverlighta.<br \/>\nW pierwszym kroku musimy doinstalowa\u0107 do \u015brodowiska Visual Studio projekt typu Portable Class Library. Referencje do tego typu projekt\u00f3w mo\u017cemy dodawa\u0107 zar\u00f3wno do projekt\u00f3w Silverlightowych, WindowsPhonowych &#8211; zatem idealnie nadaje si\u0119 na przetrzymywanie w nim mechanizmu t\u0142umaczenia aplikacji. W celu zainstalowania wy\u017cej wspomnianego typu projektu musimy odwiedzi\u0107 nast\u0119puj\u0105c\u0105 stron\u0119<br \/>\nhttp:\/\/visualstudiogallery.msdn.microsoft.com\/b0e0b5e9-e138-410b-ad10-00cb3caf4981, a nast\u0119pnie zassa\u0107 plik instalacyjny. Maj\u0105c ju\u017c przygotowane \u015brodowisko, stw\u00f3rzmy now\u0105 solucj\u0119 i dodajmy do niej projekt typu Portable Class Library &#8211; nazwijmy go SharedPortableClasses.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Create.jpg\" rel=\"attachment wp-att-442\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Create.jpg\" alt=\"Create\" width=\"700\" class=\"aligncenter size-full wp-image-442\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Create.jpg 952w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Create-150x104.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Create-300x209.jpg 300w\" sizes=\"(max-width: 952px) 100vw, 952px\" \/><\/a><br \/>\nNast\u0119pnie dodajmy do tego projektu nowy folder &#8220;Localization&#8221;, w kt\u00f3rym to umie\u015bcimy pliki typu *.resx. Pierwszy plik nazywamy po prostu Localization.resx natomiast nast\u0119pne nazywamy wed\u0142ug wzorca Localization.<culture>.resx, gdzie:<br \/>\n&lt;culture&gt; &#8211; oznacza kultur\u0119\/j\u0119zyk komunikat\u00f3w jaki dany plik b\u0119dzie przechowywa\u0107<br \/>\nDla przyk\u0142adu aby mechanizm t\u0142umacz\u0105cy obs\u0142ugiwa\u0142 j\u0119zyk polski oraz angielski, powinni\u015bmy stworzy\u0107 nast\u0119puj\u0105c\u0105 struktur\u0119 plik\u00f3w<\/p>\n<p>Localization.resx<br \/>\nLocalization.pl-PL.resx<br \/>\nLocalization.en-US.resx<\/p>\n<p>W kolejnym kroku musimy zmieni\u0107 modyfikator dost\u0119pu do naszych plik\u00f3w zasob\u00f3w na publiczny. W tym celu klikamy podw\u00f3jnie na ka\u017cdy plik *.resx i z comboboxa wybieramy public<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Public.jpg\" rel=\"attachment wp-att-445\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Public.jpg\" alt=\"Public\" width=\"700\" class=\"aligncenter size-full wp-image-445\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Public.jpg 1344w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Public-150x26.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Public-300x51.jpg 300w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/Public-1024x174.jpg 1024w\" sizes=\"(max-width: 1344px) 100vw, 1344px\" \/><\/a><br \/>\nMaj\u0105c przygotowane pliki zasob\u00f3w, mo\u017cemy teraz umieszcza\u0107 w nich t\u0142umaczone elementy interfejs\u00f3w oraz komunikat\u00f3w. Robimy to w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li>W pliku Localization.resx wype\u0142niamy pole w kolumnie &#8220;Name&#8221; jak\u0105\u015b warto\u015bci\u0105(kluczem), kt\u00f3ra identyfikuje nasz tekst (w moim przypadku b\u0119dzie to &#8220;Title&#8221;)\n<\/li>\n<li>\nW plikach Localization.pl-PL.resx oraz Localization.en-US powtarzamy t\u0119 czynno\u015b\u0107 (uzupe\u0142niamy pola w kolumnie &#8220;Name&#8221; tymi samymi warto\u015bciami co w pliku Localization.resx) oraz wype\u0142niamy pole w kolumnie &#8220;Value&#8221; tekstem w odpowiednim j\u0119zyku.\n<\/li>\n<\/ul>\n<p>Maj\u0105c ju\u017c prawie gotowy mechanizm t\u0142umacz\u0105cy stw\u00f3rzmy teraz projekt typu &#8220;Silverlight Application&#8221; oraz dodajmy mu referencj\u0119 do projektu SharedPortableClasses. Dodajmy teraz do zasob\u00f3w naszej aplikacji obiekt typu Localization<\/p>\n<pre lang=\"xml\">\r\n<Application.Resources>\r\n        <Localization:Localization x:Key=\"LocalizationProxy\" \/>\r\n<\/Application.Resources>\r\n<\/pre>\n<p>Niestety z powodu tego, \u017ce klasa Localization nie posiada publicznego konstruktora bezparametrowego, nie uda nam si\u0119 odpali\u0107 naszej aplikacji. Resharper od razu wyrzuci ostrze\u017cenie nast\u0119puj\u0105cej tre\u015bci<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/ConstructorWarning.jpg\" rel=\"attachment wp-att-441\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/ConstructorWarning.jpg\" alt=\"ConstructorWarning\" width=\"700\" class=\"aligncenter size-full wp-image-441\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/ConstructorWarning.jpg 747w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/ConstructorWarning-150x69.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/ConstructorWarning-300x139.jpg 300w\" sizes=\"(max-width: 747px) 100vw, 747px\" \/><\/a><br \/>\nZatem w jaki spos\u00f3b wykorzysta\u0107 nasz mechanizm t\u0142umacz\u0105cy ? Rozwi\u0105zania s\u0105 dwa<\/p>\n<ul>\n<li>\nZmodyfikowa\u0107 plik Localization.Designer.cs i ustawi\u0107 konstruktor domy\u015blny na publiczny. Takie rozwi\u0105zanie jednak nie jest eleganckie, gdy\u017c za ka\u017cdym razem gdy dodamy nowy wpis do pliku Localization.resx kod w pliku Localization.Designer.cs zostanie przegenerowany.\n<\/li>\n<li>\nDrugim sposobem jest stworzenie klasy po\u015brednicz\u0105cej, kt\u00f3ra b\u0119dzie w sobie trzyma\u0142a instancj\u0119 obiektu Localization, oraz dodanie obiektu tej klasy po\u015brednicz\u0105cej do zasob\u00f3w aplikacji\n<\/li>\n<\/ul>\n<p>Jako, \u017ce podej\u015bcie drugi jest wg mnie du\u017co lepsze to postaram si\u0119 je teraz przedstawi\u0107. Do projektu SharedPortableClasses dodajmy klas\u0119 LocalizationProxy.cs.<\/p>\n<pre lang=\"csharp\">\r\npublic class LocalizationProxy : INotifyPropertyChanged\r\n{\r\n    public Localization LocalizationManager { get; private set; }\r\n\r\n    public LocalizationProxy()\r\n    {\r\n        LocalizationManager = new Localization();\r\n    }\r\n\r\n    public void ResetResources()\r\n    {\r\n        OnPropertyChanged(\"LocalizationManager\");\r\n    }\r\n\r\n    #region INotifyPropertyChanged region\r\n    public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n    public void OnPropertyChanged(string propertyName)\r\n    {\r\n        if (PropertyChanged != null)\r\n        {\r\n            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));\r\n        }\r\n    }\r\n    #endregion\r\n}\r\n<\/pre>\n<p>Teraz stw\u00f3rzmy instancj\u0119 tej klasy w zasobach aplikacji <\/p>\n<pre lang=\"xml\">\r\n<Application xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\r\n             xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\r\n             xmlns:Localization=\"clr-namespace:SharedPortableLibrary.Localization;assembly=SharedPortableLibrary\"\r\n             x:Class=\"LocalizationSolution.App\">\r\n    <Application.Resources>\r\n        <Localization:LocalizationProxy x:Key=\"LocalizationProxy\" \/>\r\n    <\/Application.Resources>\r\n<\/Application>\r\n<\/pre>\n<p>Zanim przyst\u0105pimy do t\u0142umaczenia samego interfejsu musimy jeszcze zmodyfikowa\u0107 plik projekty *.csproj. Otwieramy nasz plik projektu w dowolnym edytorze tekstowym, a nast\u0119pnie w sekcji SupportedCultures dorzucamy kultury w jakich<br \/>\nnasza aplikacja ma pracowa\u0107. W moim przypadku b\u0119dzie to wygl\u0105da\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/CSProjCultures.jpg\" rel=\"attachment wp-att-443\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/CSProjCultures.jpg\" alt=\"CSProjCultures\" width=\"700\" class=\"aligncenter size-full wp-image-443\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/CSProjCultures.jpg 1293w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/CSProjCultures-150x40.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/CSProjCultures-300x80.jpg 300w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/CSProjCultures-1024x272.jpg 1024w\" sizes=\"(max-width: 1293px) 100vw, 1293px\" \/><\/a><br \/>\nJak wida\u0107 moja aplikacja b\u0119dzie wspiera\u0142a j\u0119zyk angielski oraz j\u0119zyk polski. Maj\u0105c ju\u017c wszystko gotowe przyst\u0105pmy do tworzenia interfejsu. Zmodyfikujmy plik MainPage.xaml tak aby wygl\u0105da\u0142 w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"xml\">\r\n<UserControl x:Class=\"LocalizationSolution.MainPage\"\r\n    xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\r\n    xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\r\n    xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\r\n    xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\"\r\n    mc:Ignorable=\"d\"\r\n    d:DesignHeight=\"300\" d:DesignWidth=\"400\">\r\n\r\n    <Grid x:Name=\"LayoutRoot\" Background=\"White\">\r\n        <!--TitlePanel contains the name of the application and page title-->\r\n        <StackPanel x:Name=\"TitlePanel\" Grid.Row=\"0\" Margin=\"12,17,0,28\">\r\n            <TextBlock TextWrapping=\"Wrap\" x:Name=\"PageTitle\" Text=\"{Binding Source={StaticResource LocalizationProxy},Path=LocalizationManager.Title,Mode=TwoWay}\" Margin=\"9,-7,0,0\" \/>\r\n            <Button Content=\"Polski\" Command=\"{Binding PolisLanguageCommand}\"  Height=\"72\" HorizontalAlignment=\"Left\"   VerticalAlignment=\"Top\" Width=\"160\"   \/>\r\n            <Button Content=\"English\" Command=\"{Binding EnglishLanguageCommand}\" Height=\"72\" HorizontalAlignment=\"Left\"  VerticalAlignment=\"Top\" Width=\"160\"  \/>\r\n        <\/StackPanel>\r\n    <\/Grid>\r\n<\/UserControl>\r\n<\/pre>\n<p>Widok ten jest bardzo prosty. Posada on dwa przyciski s\u0142u\u017c\u0105ce do zmiany aktualnego j\u0119zyka oraz labelk\u0119, na kt\u00f3rej dany tekst b\u0119dzie si\u0119 pojawia\u0107. Najciekawsz\u0105 rzecz\u0105 w tym kodzie jest spos\u00f3b wy\u015bwietlania t\u0142umaczonego tekstu. Jak wida\u0107 do w\u0142a\u015bciwo\u015bci Text elementu typu TextBlok nie jest przypisywana warto\u015b\u0107 sta\u0142a, ale u\u017cywany jest binding <\/p>\n<pre lang=\"csharp\">\r\nText=\"{Binding Source={StaticResource LocalizationProxy},Path=LocalizationManager.Title,Mode=TwoWay}\"\r\n<\/pre>\n<p>To co wy\u015bwietli si\u0119 w danym TextBloku zale\u017cne jest od tego co zwr\u00f3ci nam nasz mechanizm t\u0142umacz\u0105cy. Odnosimy si\u0119 do niego poprzez wskazanie zasobu, kt\u00f3ry nazwali\u015bmy LocalizationProxy (taki klucz nadali\u015bmy mu w zasobach aplikacji). Nast\u0119pnie do konkretnego tekstu odnosimy si\u0119 podaj\u0105c odpowiedni\u0105 \u015bcie\u017ck\u0119 &#8211; w tym przypadku jest to LocalizationManager.Title. LocalizationManager jest to w\u0142a\u015bciwo\u015b\u0107, kt\u00f3r\u0105 stworzyli\u015bmy w klasie LocalizationProxy, natoamist Title jest to klucz jaki wpisali\u015bmy w pliku zasob\u00f3w Localization.resx. Przegl\u0105daj\u0105c plik Localization.Designer.cs mo\u017cna zauwa\u017cy\u0107, \u017ce zosta\u0142a tam wygenerowana w\u0142a\u015bciwo\u015b\u0107 Title. <\/p>\n<pre lang=\"csharp\">\r\npublic static string Title \r\n{\r\n    get { return ResourceManager.GetString(\"Title\", resourceCulture); }\r\n}\r\n<\/pre>\n<p>W\u0142a\u015bciwo\u015b\u0107 tak zwraca nam tekst w odpowiednim j\u0119zyku. Sam mechanizm zwracania tekstu dla wybranego przez nas j\u0119zyka jest ju\u017c dostarczony z Frameworkiem. Tekst wy\u015bwietlany w aplikacji b\u0119dzie w takim j\u0119zyku\/kulturze jaka zostania przypisana do w\u0142a\u015bciwo\u015bci Thread.CurrentThread.CurrentUICulture. Mo\u017cemy to w \u0142atwy spos\u00f3b sprawdzi\u0107 zmieniaj\u0105c dynamicznie kulture w\u0105tku.<br \/>\nStw\u00f3rzmy now\u0105 klas\u0119 i nazwijmy j\u0105 MainPageViewModel. Wygl\u0105da ona w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\npublic class MainPageViewModel\r\n{\r\n    public DelegateCommand PolisLanguageCommand { get; set; }\r\n    public DelegateCommand EnglishLanguageCommand { get; set; }\r\n    public MainPageViewModel()\r\n    {\r\n        PolisLanguageCommand = new DelegateCommand(() =>\r\n        {\r\n            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(\"pl-PL\");\r\n            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(\"pl-PL\");\r\n            ResetResources();\r\n\r\n        });\r\n\r\n        EnglishLanguageCommand = new DelegateCommand(() =>\r\n        {\r\n            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(\"en-US\");\r\n            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(\"en-US\");\r\n            ResetResources();\r\n        });\r\n    }\r\n\r\n    private void ResetResources()\r\n    {\r\n        ((LocalizationProxy)Application.Current.Resources[\"LocalizationProxy\"]).ResetResources();\r\n    }\r\n}\r\n<\/pre>\n<p>Nast\u0119pnie stw\u00f3rzmy obiekt tej klasy i przypiszmy go do DataContext-u okna MainPage.<\/p>\n<pre lang=\"csharp\">\r\npublic partial class MainPage : UserControl\r\n{\r\n    public MainPage()\r\n    {\r\n        InitializeComponent();\r\n        DataContext = new MainPageViewModel();\r\n    }         \r\n}\r\n<\/pre>\n<p>Dzi\u0119ki wykorzystaniu komend po naci\u015bni\u0119ciu przycisku &#8220;Polski&#8221; zostanie odpalana komenda PolishLangugeCommand, kt\u00f3ra z kolei odpali anonimow\u0105 funkcj\u0119 do niej przypisan\u0105. W funkcji tej zmienimy kultur\u0119 w\u0105tku na &#8220;pl-PL&#8221;. Wa\u017cnym elementem jest tutaj funkcja ResetResources(), kt\u00f3ra znajduje si\u0119 w klasie LocalizationProxy. Funkcja ta informuje widok (poprzez zdarzenie NotifyPropertyChanged), \u017ce nale\u017cy od\u015bwie\u017cy\u0107 wszystkie elementy, kt\u00f3re zosta\u0142y zbindowane do w\u0142a\u015bciwo\u015bci LocalizationManager.<\/p>\n<p>Post\u0119puj\u0105c w analogiczny spos\u00f3b mo\u017cemy stworzy\u0107 aplikacj\u0119 WindowsPhone, kt\u00f3ra b\u0119dzie wykorzystywa\u0142\u0105 nasz mechanizm t\u0142umacz\u0105cy. Co wi\u0119cej dzi\u0119ki temu, \u017ce dwie aplikacje b\u0119d\u0105 korzysta\u0142y z tego samego mechanizmu oraz z tych samych resourc\u00f3w, nie musimy podw\u00f3jnie wpisywa\u0107 t\u0142umaczonych tekst\u00f3w.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/PhoneResults.jpg\" rel=\"attachment wp-att-444\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/PhoneResults.jpg\" alt=\"Lokalizowanie\" width=\"700\" class=\"aligncenter size-full wp-image-444\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/PhoneResults.jpg 764w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/PhoneResults-150x139.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/01\/lokalizowanie-aplikacji-silverlight-i-windows-phone-z-wykorzystaniem-portable-shared-library\/PhoneResults-300x279.jpg 300w\" sizes=\"(max-width: 764px) 100vw, 764px\" \/><\/a><br \/>\nProjekt mo\u017cna znale\u017a\u0107 pod tym linkiem<br \/>\nhttp:\/\/www.4shared.com\/rar\/i9cd3EGD\/LocalizationSolution.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Witam W dzisiejszym wpisie postaram si\u0119 przedstawi\u0107 w jaki spos\u00f3b lokalizowa\u0107 tre\u015bci aplikacji typu Silverlight oraz WindowsPhone. Za\u0142o\u017cenie jest takie, \u017ce chcemy zbudowa\u0107 multiplatformow\u0105 aplikacj\u0119, kt\u00f3ra b\u0119dzie obs\u0142ugiwa\u0142a platform\u0119 Silverlight oraz Windows Phone. Rozs\u0105dnym zatem podej\u015bciem jest trzymanie wszystkich t\u0142umacze\u0144 w jednym miejscu &#8211; najlepiej aby mechanizm t\u0142umaczenia by\u0142 obs\u0142ugiwany zar\u00f3wno przez Windows Phona jak [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[51,44,30],"tags":[197,190,240],"class_list":["post-54","post","type-post","status-publish","format-standard","hentry","category-localization","category-silverlight","category-windows-phone","tag-localization","tag-silverlight","tag-windows-phone"],"_links":{"self":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/54","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/comments?post=54"}],"version-history":[{"count":14,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/54\/revisions"}],"predecessor-version":[{"id":559,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/54\/revisions\/559"}],"wp:attachment":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/media?parent=54"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/categories?post=54"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/tags?post=54"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}