2010-04-22 6 views

Antwort

17

Sie können Add existing item eine .resx Datei zu einem F # -Projekt, es sollte automatisch eine BuildAction von EmbeddedResource bekommen und arbeiten. Die VS-Werkzeuge sind hier noch nicht so gut wie die anderen Sprachen, aber MSBuild erledigt die ganze Arbeit, also ist es nur eine Frage des richtigen XML-Snippets in die .fsproj-Datei.

10

Ich verwende ein. Resx in einem F # 2.0-Projekt. Fühlen Sie sich frei, einen Blick darauf zu werfen, und ich hoffe, dass es Ihnen hilft. Keine großen Erschütterungen, aber hier ist es, was es wert ist.

http://github.com/OnorioCatenacci/ExtendedSearch

EDIT: Für das, was es wert ist, hier ist der relevante Teil der fsproj Datei

<ItemGroup> 
    <Compile Include="assemblyinfo.ExtendedSearch.exe.fs" /> 
    <Compile Include="ExtendedSearch.fs" /> 
    <EmbeddedResource Include="ExtendedSearch.resx" /> 
    </ItemGroup> 

Und hier ist ExtendedSearch.resx:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <resheader name="resmimetype"> 
    <value>text/microsoft-resx</value> 
    </resheader> 
    <resheader name="version"> 
    <value>2.0</value> 
    </resheader> 
    <resheader name="reader"> 
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, ...</value> 
    </resheader> 
    <resheader name="writer"> 
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, ...</value> 
    </resheader> 
    <!-- 
    Microsoft ResX Schema 

    Version 2.0 

    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types. 

    Example: 

    ... ado.net/XML headers & schema ... 
    <resheader name="resmimetype">text/microsoft-resx</resheader> 
    <resheader name="version">2.0</resheader> 
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> 
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> 
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> 
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> 
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> 
     <value>[base64 mime encoded serialized .NET Framework object]</value> 
    </data> 
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> 
     <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> 
     <comment>This is a comment</comment> 
    </data> 

    There are any number of "resheader" rows that contain simple 
    name/value pairs. 

    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set. 

    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly: 

    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below. 

    mimetype: application/x-microsoft.net.object.binary.base64 
    value : The object must be serialized with 
      : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
      : and then encoded with base64 encoding. 

    mimetype: application/x-microsoft.net.object.soap.base64 
    value : The object must be serialized with 
      : System.Runtime.Serialization.Formatters.Soap.SoapFormatter 
      : and then encoded with base64 encoding. 

    mimetype: application/x-microsoft.net.object.bytearray.base64 
    value : The object must be serialized into a byte array 
      : using a System.ComponentModel.TypeConverter 
      : and then encoded with base64 encoding. 
    --> 
    <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> 
    <xsd:element name="root" msdata:IsDataSet="true"> 
     <xsd:complexType> 
     <xsd:choice maxOccurs="unbounded"> 
      <xsd:element name="metadata"> 
      <xsd:complexType> 
       <xsd:sequence> 
       <xsd:element name="value" type="xsd:string" minOccurs="0" /> 
       </xsd:sequence> 
       <xsd:attribute name="name" use="required" type="xsd:string" /> 
       <xsd:attribute name="type" type="xsd:string" /> 
       <xsd:attribute name="mimetype" type="xsd:string" /> 
       <xsd:attribute ref="xml:space" /> 
      </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="assembly"> 
      <xsd:complexType> 
       <xsd:attribute name="alias" type="xsd:string" /> 
       <xsd:attribute name="name" type="xsd:string" /> 
      </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="data"> 
      <xsd:complexType> 
       <xsd:sequence> 
       <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> 
       <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> 
       </xsd:sequence> 
       <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> 
       <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> 
       <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> 
       <xsd:attribute ref="xml:space" /> 
      </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="resheader"> 
      <xsd:complexType> 
       <xsd:sequence> 
       <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> 
       </xsd:sequence> 
       <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
      </xsd:element> 
     </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:schema> 
    <data name = "AppDisplayName"> 
    <value>Extended Search</value> 
    </data> 
    <data name="FilePathSpecLabel"> 
    <value>Base File Path:</value> 
    </data> 
    <data name="FilePathSpecDefault"> 
    <value>C:\</value> 
    </data> 
    <data name ="SelectDirButtonLabel"> 
    <value>. . .</value> 
    </data> 
    <data name="FileNameSpecLabel"> 
    <value>File Name Spec:</value> 
    </data> 
    <data name="FileNameSpecDefault"> 
    <value>*.dll</value> 
    </data> 
    <data name="RecurseIntoSubdirsLabel"> 
    <value>Recurse Into Subdirectories</value> 
    </data> 
    <data name ="MajorVerDefault"> 
    <value>1</value> 
    </data> 
    <data name="MinorVerDefault"> 
    <value>0</value> 
    </data> 
    <data name="RevisionVerDefault"> 
    <value>0</value> 
    </data> 
    <data name="BuildVerDefault"> 
    <value>0</value> 
    </data> 
    <data name="VersionLabel"> 
    <value>File &amp;Version:</value> 
    </data> 
    <data name="SearchButtonCaption"> 
    <value>&amp;Search</value> 
    </data> 
    <data name="CancelButtonCaption"> 
    <value>&amp;Cancel</value> 
    </data> 
</root> 

Ich hoffe, entfernt diese eine Zukunft Probleme mit Leuten, die das nicht auf GitHub finden können.

+0

Danke, ich habe einen ähnlichen Weg gegangen unten, Hand, die einen Ressourcenmanager-Wrapper-Codierung. Ich frage mich jetzt, ob es funktioniert wird ... –

+0

Ich wäre interessiert zu hören, ob die Lokalisierung funktioniert. Ich habe hauptsächlich die .resx-Ursache verwendet, weil ich mein Gedächtnis auffrischen wollte - meine .Net-Programmierkenntnisse sind ein wenig eingerostet. –

+0

Ich habe einen 404 Fehler nach dem Link zu Github :( – Joh

6

Hier ist ein anderer Weg. Obwohl ich weiß, dass es für die ursprüngliche Frage zu spät ist, hoffe ich, dass es anderen hilft.

  1. Erstellen Sie eine saubere Textdatei mit einem Format Name = Wert, ein Schlüssel/Wert-Paar pro Zeile. In einer Datei mit dem Namen „strings.txt“, schreiben

    name1=hello 
    name2=world 
    
  2. eine Ressourcendatei erstellen Resgen.exe auf Ihrer Textdatei handeln von Schritt 1. Sie über ResGen bei http://msdn.microsoft.com/en-us/library/ccec7sz1%28v=vs.80%29.aspx lernen können. ResGen erstellt eine CLR-Binärdatei namens "strings.resources". Legen Sie diese Ressourcendatei dort ab, wo Ihr Compiler sie finden kann.

  3. Fügen Sie "--resource: strings.resources" als Compileroption hinzu. Ich habe dies aus dem Textfeld "Andere Flags" in den Build-Eigenschaften getan. Sie können weitere Informationen bei http://msdn.microsoft.com/en-us/library/dd233171.aspx

  4. schreiben Sie folgendes in F # -Projekt

    open System.Resources 
    let res = ResourceManager("strings", System.Reflection.Assembly.GetExecutingAssembly()) 
    res.GetString("name1") + res.GetString("name2") |> printfn "%s" 
    
4

Um eine Ressource zu einem vorhandenen F # -Projekt, pro @ "Onorio Catenacci" GitHub Linke oben hinzufügen finden ...

  1. Erstellen Sie eine Textdatei und füllen Sie sie mit dem Inhalt unten, dann speichern und schließen Sie es.
  2. Benennen Sie diese Textdatei Erweiterung .resx (XML-Ressource-Datei)
  3. Aktualisieren der Build Action-EmbeddedResource
  4. Die Datei nun korrekt in der VS-Ressource-Editor öffnen, sollten Sie seinen Inhalt zu bearbeiten, ermöglicht.

.resx Dateivorlage:

<root> 
     <resheader name="resmimetype"><value>text/microsoft-resx</value></resheader> 
     <resheader name="version"><value>2.0</value></resheader> 
     <resheader name="reader"><value>System.Resources.ResXResourceReader, System.Windows.Forms, ...</value></resheader> 
     <resheader name="writer"><value>System.Resources.ResXResourceWriter, System.Windows.Forms, ...</value></resheader> 
     <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
     <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> 
     <xsd:element name="root" msdata:IsDataSet="true"> 
      <xsd:complexType> 
      <xsd:choice maxOccurs="unbounded"> 
       <xsd:element name="metadata"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element name="value" type="xsd:string" minOccurs="0" /> 
        </xsd:sequence> 
        <xsd:attribute name="name" use="required" type="xsd:string" /> 
        <xsd:attribute name="type" type="xsd:string" /> 
        <xsd:attribute name="mimetype" type="xsd:string" /> 
        <xsd:attribute ref="xml:space" /> 
       </xsd:complexType> 
       </xsd:element> 
       <xsd:element name="assembly"> 
       <xsd:complexType> 
        <xsd:attribute name="alias" type="xsd:string" /> 
        <xsd:attribute name="name" type="xsd:string" /> 
       </xsd:complexType> 
       </xsd:element> 
       <xsd:element name="data"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> 
        <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> 
        </xsd:sequence> 
        <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> 
        <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> 
        <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> 
        <xsd:attribute ref="xml:space" /> 
       </xsd:complexType> 
       </xsd:element> 
       <xsd:element name="resheader"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> 
        </xsd:sequence> 
        <xsd:attribute name="name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:choice> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:schema> 
    </root> 
Verwandte Themen