Question

Je juste ne peux pas obtenir la localisation de travailler.

J'ai une bibliothèque de classes. Maintenant, je veux créer resx fichiers là-dedans, et le retour des valeurs basées sur la culture de fil.

Comment puis-je faire?

Était-ce utile?

La solution

  • Ajout d'un fichier de ressources à votre projet (vous pouvez l'appeler « Strings.resx ») en procédant comme suit:
    Faites un clic droit Propriétés dans le projet, sélectionnez Ajouter - > Nouvel élément ... dans le menu contextuel, puis dans la liste des les produits Visual C # choisissez "fichier de ressources" et nommez-strings.resx.
  • Ajouter une resouce chaîne dans le fichier resx et lui donner un nom (exemple: nommez-le « Bonjour » avec et lui donner la valeur « Bonjour »)
  • Enregistrez le fichier de ressources ( Note: ce sera la valeur par défaut fichier de ressources, car il ne dispose pas d'un code de langue à deux lettres)
  • Ajoutez les références à votre programme: System.Threading et System.Globalization

Exécuter ce code:

Console.WriteLine(Properties.strings.Hello);

Il faut imprimer "Bonjour".

Maintenant, ajoutez un nouveau fichier de ressources, nommé « strings.fr.resx » (note la partie « fr », celui-ci contiendra des ressources en français). Ajoutez une ressource de chaîne avec le même nom que dans Strings.resx, mais avec la valeur en français (Name = « Bonjour », Value = « Salut »). Maintenant, si vous exécutez le code suivant, il doit imprimer Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

Qu'est-ce qui se passe est que le système cherchera une ressource pour « fr-FR ». Il ne trouvera pas un (puisque nous avons spécifié « fr » dans votre dossier "). Il sera ensuite revenir à la vérification de « fr », qu'il trouve (et utilise).

Le code suivant, imprimera "Bonjour":

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);

C'est parce qu'il ne trouve pas « en-US » ressources, et pas non plus « en » ressources, il retombera à la valeur par défaut, qui est celui que nous avons ajouté dès le début.

Vous pouvez créer des fichiers avec des ressources plus spécifiques en cas de besoin (par exemple strings.fr-FR.resx et strings.fr-CA.resx pour le français en France et au Canada respectivement). Dans chaque fichier, vous devez ajouter les ressources pour les chaînes qui diffèrent de la ressource qu'il retomberait à. Donc, si un texte est le même en France et au Canada, vous pouvez le mettre dans strings.fr.resx, tandis que les chaînes qui sont différentes en français au Canada pourraient aller dans strings.fr-CA.resx.

Autres conseils

Il est assez simple, en fait. Créer un nouveau fichier de ressources, par exemple Strings.resx. Set Access Modifier à Public. Utilisez le modèle de fichier apprioriate, si Visual Studio génère automatiquement une classe accesseur (le nom sera Strings, dans ce cas). Ceci est votre langue par défaut.

Maintenant, quand vous voulez ajouter, par exemple, la localisation allemande, ajoutez un fichier resx localisé. Ce sera généralement Strings.de.resx dans ce cas. Si vous voulez ajouter la localisation supplémentaire pour, par exemple, l'Autriche, vous allez créer en plus un Strings.de-AT.resx.

Maintenant, allez créer une chaîne - disons une chaîne avec le nom HelloWorld. Dans votre Strings.resx, ajoutez cette chaîne avec la valeur « Bonjour, monde! ». En Strings.de.resx, ajouter "Hallo Welt!". Et Strings.de-AT.resx, ajouter "Servus, Welt!". C'est jusqu'à présent.

Maintenant, vous avez cette classe générée Strings, et il a une propriété avec un HelloWorld getter. Obtenir cette propriété charge « Servus, Welt! » lorsque votre locale est de-AT, « Hallo Welt! quand vos paramètres régionaux est tout autre de paramètres régionaux (y compris de-DE et de-CH), et "Bonjour, monde!" lorsque votre locale est quelque chose d'autre. Si une chaîne est manquant dans la version localisée, le gestionnaire de ressources marcheront automatiquement la chaîne, de la plus spécialisée à la ressource invariant.

Vous pouvez utiliser la classe ResourceManager pour plus de contrôle sur la façon dont vous chargez exactement les choses. La classe Strings généré utilise aussi bien.

Dans une grande réponse plus @Fredrik Mörk sur les chaînes, pour ajouter localisation à une forme procédez comme suit:

  • Définissez la forme propriété de "Localizable" à true
  • Changer la langue que vous voulez la propriété Language du formulaire (d'une belle déroulant tout avec eux)
  • Traduire les contrôles sous cette forme et les déplacer en cas de besoin (courge ces très longues phrases pleines françaises en!)

Edit: Cette article MSDN sur les formes de Windows activités locales n'est pas l'original ... mais je lié pourrait jeter plus de lumière si nécessaire. (L'ancien a été enlevé)

Grande réponse par F.Mörk. Mais si vous voulez mettre à jour la traduction, ou ajouter de nouvelles langues, une fois l'application est libéré, vous êtes coincé, parce que vous avez toujours recompiler pour générer le resources.dll.

Voici une solution pour compiler manuellement une DLL de ressource. Il utilise le resgen.exe et al.exe outils (installé avec le sdk).

Disons que vous avez un fichier de ressources Strings.fr.resx, vous pouvez compiler une dll de ressources avec le lot suivant:

resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources 
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause

Assurez-vous de garder l'espace de noms d'origine dans les noms de fichiers (ici « WpfRibbonApplication1 »)

Un correctif et l'élaboration de @Fredrik Mörk réponse.

  • Ajout d'un fichier de ressources strings.resx à votre projet (ou un autre nom)
  • Set Access Modifier à Public (dans l'onglet fichier strings.resx ouvert)
  • Ajouter une resouce chaîne dans le fichier resx: (exemple: nom Hello, valeur Hello)
  • Enregistrez le fichier de ressources

Visual Studio génère automatiquement une classe strings respective, qui est effectivement placé dans strings.Designer.cs. La classe est dans le même espace que vous attendez un fichier .cs nouvellement créé à placer dans.

Ce code imprime toujours Hello, parce que c'est la ressource par défaut et aucune ressource spécifique de langue sont disponibles:

Console.WriteLine(strings.Hello);

Maintenant, ajoutez une nouvelle ressource spécifique à la langue:

  • Ajouter strings.fr.resx (pour le français)
  • Ajouter une chaîne avec le même nom que précédemment, mais valeur différente: (nom Hello, valeur Salut)

Les impressions de code suivant Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);

Quelle ressource est utilisée dépend de Thread.CurrentThread.CurrentUICulture. Il est réglé en fonction du réglage de la langue interface utilisateur Windows, ou peut être réglée manuellement comme dans cet exemple. En savoir plus sur cette .

Vous pouvez ajouter des ressources propres à chaque pays comme strings.fr-FR.resx ou strings.fr-CA.resx.

La chaîne à utiliser est déterminée dans cet ordre de priorité:

  • De ressources du pays comme strings.fr-CA.resx
  • ressource spécifique à la langue comme strings.fr.resx
  • strings.resx par défaut

Notez que les ressources propres à la langue génèrent assemblys satellites .

En savoir également comment CurrentCulture diffère de CurrentUICulture .

En plus de @Eric Bole-Feysot réponse:

Merci aux assemblées de satellites, la localisation peuvent être créés sur la base des fichiers .dll / .exe . De cette façon:

  • code source (VS projet) pourrait être séparé du projet de langue,
  • l'ajout d'une nouvelle langue ne nécessite pas recompiler le projet,
  • traduction pourrait être même par l'utilisateur final.

Il est un outil peu connu appelé LSACreator (gratuit pour un usage non commercial ou acheter l'option ) qui vous permet de créer localisation basée sur les fichiers .dll / .exe. En fait, à l'intérieur (dans le répertoire de projet de langue), il crée / gère des versions localisées de resx et compile un ensemble dans la même manière que @Eric Bole-Feysot décrit.

Dans mon cas,

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

dans les AssemblyInfo.cs ont empêché des choses à travailler comme d'habitude.

ResourceManager et .resx sont peu en désordre.

Vous pouvez utiliser Lexical.Localization qui permet d'incorporer ¹ des valeurs spécifiques de valeur par défaut et la culture en le code, et être étendu dans les fichiers de localisation externes pour cultures futher (comme .json ou .resx).

public class MyClass
{
    /// <summary>
    /// Localization root for this class.
    /// </summary>
    static ILine localization = LineRoot.Global.Type<MyClass>();

    /// <summary>
    /// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
    /// </summary>
    static ILine ok = localization.Key("Success")
            .Text("Success")
            .fi("Onnistui")
            .sv("Det funkar");

    /// <summary>
    /// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
    /// </summary>
    static ILine error = localization.Key("Error")
            .Format("Error (Code=0x{0:X8})")
            .fi("Virhe (Koodi=0x{0:X8})")
            .sv("Sönder (Kod=0x{0:X8})");

    public void DoOk()
    {
        Console.WriteLine( ok );
    }

    public void DoError()
    {
        Console.WriteLine( error.Value(0x100) );
    }
}

¹ (je suis responsable de cette bibliothèque)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top