Need to Localize an XSLT

Here is our attempt at the XLST translator, main chunk of the work was by Darren, it’s a console application that applies an xsl (i.e. circle.xsl) to some xml (i.e. number.xml) and writes out the result to a console window.

private const String _filename = "number.xml";
private const String _stylesheet = "circle.xsl";
private const String _culturename = "en";
public Program()
{
    //Set the UI to the specified culture.
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(_culturename);

    //Create the XslTransform and load the stylesheet.
    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load(_stylesheet);

    //Load the XML data file.
    XPathDocument doc = new XPathDocument(_filename);

    //Create an XsltArgumentList.
   XsltArgumentList xslArg = new XsltArgumentList();

   //Add an object to get the resources for the specified language.
   ResourceTranslator resTran = new ResourceTranslator("Resources.Resource");
   xslArg.AddExtensionObject("urn:myResTran", resTran);

   //Add an object to calculate the circumference of the circle.
   Calculate obj = new Calculate();
   xslArg.AddExtensionObject("urn:myObj", obj);

   //Create an XmlTextWriter to output to the console.             
   XmlTextWriter writer = new XmlTextWriter(Console.Out);

   //Transform the file.
   xslt.Transform(doc, xslArg, writer, null);

   writer.Close();
}
//Calculates the circumference of a circle given the radius.
public class Calculate
{
    public static double Circumference(double radius)
    {
        return Math.PI * 2 * radius;
    }
}

The translation is based upon our database resource translator i.e. a class that creates a resource manager based on the default/neutral resource resx, and implements a Find method. This method takes a string that we want to find (specified in the default language i.e. in our case English) which is then effectively used as a key into the resource file(s). The text that is passed into the Find method is first converted into a valid identifier (e.g. spaces removed, slashes removed etc… etc…), before it can be used as a key. Then, if a key exists for the specified culture (French in the case of the test solution) then the appropriate language version of the original passed in text is returned. 

In order to use the resource translator in the xsl, an object of this type is first created and then passed into the xsl using extension objects. The Find method can then be called by referencing the correct extension object, and specifying the piece of text that we would like to be translated.
 
public string Find(string displayText)
{
    if (displayText == null) return null;

    var assem = System.Reflection.Assembly.Load("Resources");
    var rman = new ResourceManager(_baseName, assem);
    var s = rman.GetString(Regex.Replace(displayText, "[^\\w]", string.Empty, RegexOptions.CultureInvariant));
            
    return s jQuery15201710984220262617_1352536393022 displayText;
}

XslResourceTranslator.zip (90.45 kb)

Source can be found on GitHub https://github.com/BryanAvery/XslResourceTranslator

EntityFramework 4.0 and SQL 2000

If you are like me, some customer just can’t upgrade from SQL 2000, so how do you use the EntityFramework 4.0+ with SQL Server 2000?

Here is one solution that has worked for me:

Here are the steps to add a new Entity Framework 4.0+ entity context to a Visual Studio 2010 project:

  • Download the base entity data model for SQL Server 2000 file and save it to the project folder to which you wish to add the SQL 2000 entity context. Do NOT add it to your project yet.
  • Rename the EDMX file to the name of the data context.
  • Open the EDMX file in a text editor.
  • Find/replace all references to %DB_NAME% with your own value.
  • Add this new connection string section to your App or Web.config and find/replace with your own values:
<connectionStrings>
  <add name="%DB_NAME%Entities" connectionString="metadata=res://*/%DB_NAME%.csdl|res://*/%DB_NAME%.ssdl|res://*/%DB_NAME%.msl;provider=System.Data.SqlClient;provider connection string="Data Source=%DB_HOST_NAME%;Initial Catalog=%DB_NAME%;Persist Security Info=True;User ID=%DB_USER%;Password=%DB_USER_PWD%;MultipleActiveResultSets=False"" providerName="System.Data.EntityClient" />
</connectionStrings>

Please note: the connection string name MUST MATCH the EntityContainer section name you specified in the EDMX file.

  • Find/replace all references to %DB_NAME% in the App or Web.config file with your own value as above.
  • After the .edmx and web.config files configured, add them to the project and verify the new entity data source appears after refreshing the Data Source manager window.
  • If you can’t double click on your *.edmx file you’ll need to right click on it and select “Open with”, and choose “ADO.NET Entity Data Model Designer”
  • If the new entity data source appears, open the .edmx file in design view and refresh the design model.

Now you have your Entity XML file next you can generate your Code by using the T4 templete code generation.  To do this just right click in the EDMX model and select “Add Code Generation Item” this will give you the installed Generators (you can get more from NUGET, like dbcontext”

I’ve found this very useful and gives you a head start on old databases.