Myślę, że można w dużym stopniu polegać na strukturze zasobów dostarczanej przez .NET za pomocą kilku modyfikacji, aby było bardziej odpowiednie dla dużych projektów, a mianowicie do budowania i utrzymywania zasobów niezależnie od aplikacji i do eliminowania generowanych właściwości, które odnoszą się do każdy zasób według nazwy. Jeśli istnieją inne cele odpowiednie dla lokalizacji dużego projektu, których nie omówiono poniżej, opisz je, aby je również rozważyć.
- Utwórz samodzielny projekt do reprezentowania zasobów, które można załadować jako oddzielną bibliotekę DLL.
- Dodaj plik "Zasoby" do projektu, wybierając łącze na karcie Zasoby we właściwościach projektu: "Ten projekt nie zawiera domyślnego pliku zasobów. Kliknij tutaj, aby go utworzyć."
- Dodaj inny zasób o tej samej nazwie głównej, aby reprezentować inny język, na przykład "Resource.de.resx" dla języka niemieckiego. (Visual Studio najwyraźniej używa nazwy pliku do określenia języka, który reprezentuje plik zasobów). Przenieś go do tego samego katalogu/folderu, co domyślny plik zasobów. (Powtórz dla każdego języka.)
- We właściwościach pliku Resources.resx usuń "ResXFileCodeGenerator" z właściwości Custom Tool, aby zapobiec domyślnemu generowaniu kodu w przestrzeni nazw "Właściwości" aplikacji. (Powtórz tę czynność dla każdego języka).
Jawnie/ręcznie zadeklarować własnego menedżera zasobów, który ładuje nowo utworzonych zasobów z linii takich jak:
statycznych System.Resources.ResourceManager resourceMan = nowych System.Resources. ResourceManager ( "LocalizeDemo.Properties.Resources", typeof (Resources) .Assembly);
Wdrożenie pliku, który może zostać wygenerowany, które zawiera listę wszystkich zasobów można odnieść się do (patrz rysunek 1)
Wdrożenie funkcji do pobierania i ciągi formatu (patrz rysunek 2).
Teraz masz dość, że możesz odnieść się do przetłumaczonych ciągów z dowolnej liczby aplikacji (patrz rysunek 3).
Skorzystaj z System.Resources.ResXResourceWriter (z System.Windows.Forms.dll) lub System.Resources.ResourceWriter (System.dll), aby wygenerować zasoby, zamiast mieć pliki Resx jako główne źródło. W naszym projekcie mamy bazę danych SQL, która definiuje wszystkie nasze ciągi w każdym języku, a część naszego procesu budowania generuje wszystkie pliki Resx przed zbudowaniem projektu zasobów.
Teraz, gdy możesz generować pliki Resx z dowolnego formatu, możesz użyć dowolnego żądanego formatu (w naszym przypadku bazy danych SQL, którą eksportujemy i importować z arkuszy kalkulacyjnych Excel), aby dostarczyć pliki do wysłania do tłumaczy .
Zauważ, że przetłumaczone zasoby budowane są jako pliki DLL z satelitami. Można stworzyć dowolny język niezależnie za pomocą odpowiednich narzędzi wiersza poleceń. Jeśli to część twojego pytania (jak to zrobić) daj mi znać. Ale na razie zakładam, że o tym wiesz, ponieważ wspomniałeś już o niestandardowych krokach kompilacji.
Rysunek 1 - enum identyfikacji wszystkich dostępnych zasobów:
namespace MyResources
{
public enum StrId
{
Street
....
}
}
Rysunek 2 - kod do załadowania i wrócić sformatowanych ciągi zasobów:
namespace MyResources
{
public class Resources
{
static System.Resources.ResourceManager resourceMan =
new System.Resources.ResourceManager("MyResources.Properties.Resources",
typeof(Resources).Assembly);
public static string GetString(StrId name,
System.Globalization.CultureInfo culture = null, params string[] substitutions)
{
if (culture == null) culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
string format = resourceMan.GetString(name.ToString(), culture);
if (format != null)
{
return string.Format(format, substitutions);
}
return name.ToString();
}
}
}
Rysunek 3 - dostęp do zasobów:
using MyResources;
namespace LocalizationDemo
{
class Program
{
static void Main(string[] args)
{
System.Threading.Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("de-DE");
Console.WriteLine(Resources.GetString(StrId.Street));
}
}
}
@Kon To nie jest duplikat, b bo widziałem każde pytanie związane z lokalizacją 'C# '. A ludzie mówią o korzystaniu z niestandardowych kroków konstrukcyjnych i zadawalających działaniach, dzięki którym lokalizacja jest wygodniejsza. Jednak tylko o nich wspominają i chciałbym zobaczyć kompletną odpowiedź. –
Jasne, to, czego potrzebujesz, to w rzeczywistości internacjonalizacja (musisz najpierw przygotować swoją aplikację). Jak możesz sobie wyobrazić, to było [wcześniej udzielono odpowiedzi] (http://stackoverflow.com/questions/5253614/effective-strategies-for-localization-in-net/5524981#55249810) ... –
Przepraszam, muszę źle zrozumieć coś ... Proszę zignorować mój poprzedni komentarz. –