2011-12-10 11 views
5

W zlokalizowanym programie zawierającym neutralny pod względem kultury plik XAML, niektóre neutralne ikony kultury i zlokalizowane ciągi, w jaki sposób można organizować te różne typy zasobów, aby mogły wszystkie można znaleźć? Niezależnie od tego, jaką próbę spróbuję, okazuje się, że jeden z moich typów zasobów jest niedostępny.Problemy z montażem głównym a problemami związanymi z montażem satelitów podczas pobierania zasobów XAML i RESX w języku C# .Net

Problem, który mam jest:

  • Plik MainWindow.xaml zawsze buduje w zespole satelitarną en-US. Jeśli UltimateResourceFallbackLocation jest ustawiony na MainAssembly, to nigdy nie odnajdzie BAML okna i otrzymam wyjątek w wywołaniu InitializeComponent(). Dlatego czuję się zmuszony ustawić UltimateResourceFallbackLocation na "Satellite".

  • Zasoby ikon neutralnych pod względem kultury zawarte w pliku Resources.resx zawsze są wbudowywane w główny zbiór EXE i nie można ich znaleźć, jeśli właściwość UltimateResourceFallbackLocation jest ustawiona na wartość Satelita. Wydaje się, że jest to całkowicie niezgodne z wymaganiami pliku MainWindow.xaml.

  • Po całkowitym usunięciu UICulture i NeutralResourcesLanguage - które wymuszają dane XAML i RESX na obu komponentach MainAssembly, moje ciągi specyficzne dla kultury nie działają.

Pytanie brzmi: co robię źle? Jak mam zbudować projekt, aby te trzy rodzaje zasobów były dostępne.

Edit (rozwiązanie działa, ale wydaje się źle):

udało mi się dostać moja kultura neutralny plik RESX, resources.resx, aby zbudować do zespołu Satellite przez powielenie go w całości, zmiana nazwy duplikaty Zasoby .en-US.resx i ustawienie Resources.resx na Build Action: None (w ten sposób Resources.resx służy tylko do generowania pliku Resources.Designer.cs, ale nie wstawia już danych do głównego zbioru EXE).

Program działa teraz we wszystkich trzech przypadkach (zlokalizowane ciągi, niepolecane dane z resx i niezamknięte dane z XAML), ponieważ wszystkie moje neutralne zasoby kultury znajdują się teraz w zespole en-US - ale duplikowanie zasobów Plik .resx do osiągnięcia tego wydaje się dość głupi.

Czy to głupie? Czy jest to mądrzejszy sposób na zrobienie tego?

Odpowiedz

2

Uważam, że arbitralnie "mądrzejszą" alternatywą jest użycie Assembly Linker (Al.exe) do kompilowania plików .resources w zespoły satelitarne, jak opisano w tym article.

** Aktualizuj **

Przykłady użyte w tym artykule:

Montaż Ten łącznik (Al.exe) polecenie tworzy zespół satelitarną dla MojaApl aplikację z strings.de.resources plików .

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll 

Polecenie Assembly Linker (Al.exe) tworzy zespół satelitarną dla MojaApl aplikację z strings.de.resources plików. Opcja /template powoduje, że zespół satelity dziedziczy metadane zespołu z zespołu nadrzędnego MyApp.dll.

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll 
/template:MyApp.dll 
+1

Twoja odpowiedź była pomocna w znalezieniu rozwiązania podobnego problemu: http://www.mathewweaver.com/2013/11/internalgetsatelliteassembly-finding.html – mweaver

+0

Cieszę się, że pomogłem :) – chridam

2

Lokalizacja z WPF jest bardzo kłopotliwa ze względu na złą dokumentację. Spędziłem kilka godzin, aby uzyskać pewne spostrzeżenia.

Plik MainWindow.xaml zawsze jest wbudowywany w zespół satelity en-US. Jeśli UltimateResourceFallbackLocation jest ustawiony na MainAssembly, to nigdy nie odnajdzie BAML okna i otrzymam wyjątek w wywołaniu InitializeComponent(). Dlatego czuję się zmuszony ustawić UltimateResourceFallbackLocation na "Satellite".

Wynika to z faktu, że plik project.vcproj prawdopodobnie zawiera <UICulture>en-US</UICulture>. To zasadniczo nakazuje VS generowanie stellitów (widzisz folder en-US jest tworzony z odpowiednim satelitą w nim).

UltimateResourceFallbackLocation.MainAssembly teraz informuje .net, aby przyspieszyć wyszukiwanie informacji o lokalizacji za pomocą wbudowanego, zamiast jednego w odpowiednim katalogu. Jeśli twoja kultura systemowa jest en-US, to doskonale to wytłumaczysz.

quoting Kim Hamilton:

... wtedy ResourceManager szuka zasobów "en-us" bezpośrednio w głównym zespole, zamiast szukać najpierw w folderze „en-US”. Ponieważ sondy zasobów mogą być drogie, ten atrybut może pomóc w poprawie perf.

Ponieważ znalazłem rozwiązanie dla drugiego punktor jest tylko jedna:

Jeśli usunąć UIculture i NeutralResourcesLanguage całkowicie - co zmusza dane XAML i RESX zarówno wbudować w MainAssembly, wtedy moje łańcuchy specyficzne dla kultury nie działają.

Właściwie WPF wciąż robi lokalizację: Jeśli nie masz takiego wpisu <UICulture>en-US</UICulture> w pliku .vcproj WPF wciąż próbuje znaleźć satelitę w katalogu o nazwie pasujący do System.Threading.Thread.CurrentThread.CurrentUICulture. Okazuje się, że jest używany. Z wyjątkiem oczywiście, jeśli twój neutralny język jest ustawiony na język twojego systemu i używasz strategii awaryjnej głównego zespołu. Aby przetestować lokalizację w systemie en-US, wybierz inną kulturę, np. ja-JP jako neutralny język. Następnie podaj folder en-US z odpowiednim satelitą.

Więc co używam do lokalizacji i zalecane jest:

  1. nie masz <UICulture>en-US</UICulture> w pliku .vcproj
  2. użytku [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
  3. dostarczyć wszystkie katalogi target-kultury z pasującymi satelitów.
Powiązane problemy