Processing resources in ASP.NET
- 1. What a resource at all. Binary and source presentation of Resources. Resource manager.
- 2. Way to show resource as source in Visual Studio.
- 3. How to use resource in Classic ASP.NET, ASP.NET MVC and in code behind.
- 4. Javascript resources in ASP.NET
- 5. Difficulties to working with resources.>
- 6. Store resource in database, resource provider Middleware (Module).
1. What a resource at all. Binary and source presentation of Resources. Resource manager.
Usually multilanguages Web sites store literals for different languages in special Resource file. This is example of one resource file.
1: <?xml version="1.0" encoding="utf-8"?>
2: <root>
3: <!--
4: Microsoft ResX Schema
5:
6: Version 2.0
7:
8: The primary goals of this format is to allow a simple XML format
9: that is mostly human readable. The generation and parsing of the
10: various data types are done through the TypeConverter classes
11: associated with the data types.
12:
13: Example:
14:
15: ... ado.net/XML headers & schema ...
16: <resheader name="resmimetype">text/microsoft-resx</resheader>
17: <resheader name="version">2.0</resheader>
18: <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19: <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20: <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21: <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22: <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23: <value>[base64 mime encoded serialized .NET Framework object]</value>
24: </data>
25: <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26: <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27: <comment>This is a comment</comment>
28: </data>
29:
30: There are any number of "resheader" rows that contain simple
31: name/value pairs.
32:
33: Each data row contains a name, and value. The row also contains a
34: type or mimetype. Type corresponds to a .NET class that support
35: text/value conversion through the TypeConverter architecture.
36: Classes that don't support this are serialized and stored with the
37: mimetype set.
38:
39: The mimetype is used for serialized objects, and tells the
40: ResXResourceReader how to depersist the object. This is currently not
41: extensible. For a given mimetype the value must be set accordingly:
42:
43: Note - application/x-microsoft.net.object.binary.base64 is the format
44: that the ResXResourceWriter will generate, however the reader can
45: read any of the formats listed below.
46:
47: mimetype: application/x-microsoft.net.object.binary.base64
48: value : The object must be serialized with
49: : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
50: : and then encoded with base64 encoding.
51:
52: mimetype: application/x-microsoft.net.object.soap.base64
53: value : The object must be serialized with
54: : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55: : and then encoded with base64 encoding.
56:
57: mimetype: application/x-microsoft.net.object.bytearray.base64
58: value : The object must be serialized into a byte array
59: : using a System.ComponentModel.TypeConverter
60: : and then encoded with base64 encoding.
61: -->
62: <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63: <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
64: <xsd:element name="root" msdata:IsDataSet="true">
65: <xsd:complexType>
66: <xsd:choice maxOccurs="unbounded">
67: <xsd:element name="metadata">
68: <xsd:complexType>
69: <xsd:sequence>
70: <xsd:element name="value" type="xsd:string" minOccurs="0" />
71: </xsd:sequence>
72: <xsd:attribute name="name" use="required" type="xsd:string" />
73: <xsd:attribute name="type" type="xsd:string" />
74: <xsd:attribute name="mimetype" type="xsd:string" />
75: <xsd:attribute ref="xml:space" />
76: </xsd:complexType>
77: </xsd:element>
78: <xsd:element name="assembly">
79: <xsd:complexType>
80: <xsd:attribute name="alias" type="xsd:string" />
81: <xsd:attribute name="name" type="xsd:string" />
82: </xsd:complexType>
83: </xsd:element>
84: <xsd:element name="data">
85: <xsd:complexType>
86: <xsd:sequence>
87: <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
88: <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
89: </xsd:sequence>
90: <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
91: <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
92: <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
93: <xsd:attribute ref="xml:space" />
94: </xsd:complexType>
95: </xsd:element>
96: <xsd:element name="resheader">
97: <xsd:complexType>
98: <xsd:sequence>
99: <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
100: </xsd:sequence>
101: <xsd:attribute name="name" type="xsd:string" use="required" />
102: </xsd:complexType>
103: </xsd:element>
104: </xsd:choice>
105: </xsd:complexType>
106: </xsd:element>
107: </xsd:schema>
108: <resheader name="resmimetype">
109: <value>text/microsoft-resx</value>
110: </resheader>
111: <resheader name="version">
112: <value>2.0</value>
113: </resheader>
114: <resheader name="reader">
115: <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116: </resheader>
117: <resheader name="writer">
118: <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119: </resheader>
120: <data name="Registration" xml:space="preserve">
121: <value>Registration</value>
122: </data>
123: <data name="UserName" xml:space="preserve">
124: <value>UserName</value>
125: </data>
126: <data name="Pass" xml:space="preserve">
127: <value>Password</value>
128: </data>
129: <data name="Enter" xml:space="preserve">
130: <value>Enter</value>
131: </data>
132: </root>
Visual Studio show all resources file in special node and allow to you way to use resource during compilation and perform program. Usual way is embed resources inside execution DLL.
Best benefits of this way to wrap literals as resource is the ASP.NET environment (as any other) allow to automatically switch languages for languages supported by browser. Of course, you can avoid automatically switch languages and avoid use resources at all, please use this my page ?????????????????? ???????? ?????? ??????????. - in this solution I have only analyze what languages support browser and if languages more than one I allow user to select languages. But simplest and spread way is more simple solution, and use System.Globalization to switch culture of site.
This is resource manager, embedded in ASP.NET, it switch culture and replace string stored in standard resources files stores as source file in XML above.
1: Imports Microsoft.VisualBasic
2: Imports Microsoft.VisualBasic.CompilerServices
3: Imports System
4: Imports System.CodeDom.Compiler
5: Imports System.ComponentModel
6: Imports System.Diagnostics
7: Imports System.Globalization
8: Imports System.Resources
9: Imports System.Runtime.CompilerServices
10:
11: Namespace Web.My.Resources
12: ''' <summary>
13: ''' A strongly-typed resource class, for looking up localized strings, etc.
14: ''' </summary>
15: <CompilerGenerated>
16: <DebuggerNonUserCode>
17: <GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")>
18: <HideModuleName>
19: Friend Module Resources
20: Private resourceMan As ResourceManager
21:
22: Private resourceCulture As CultureInfo
23:
24: ''' <summary>
25: ''' Overrides the current thread's CurrentUICulture property for all
26: ''' resource lookups using this strongly typed resource class.
27: ''' </summary>
28: <EditorBrowsable(EditorBrowsableState.Advanced)>
29: Friend Property Culture As CultureInfo
30: Get
31: Return Resources.resourceCulture
32: End Get
33: Set(ByVal value As CultureInfo)
34: Resources.resourceCulture = value
35: End Set
36: End Property
37:
38: ''' <summary>
39: ''' Returns the cached ResourceManager instance used by this class.
40: ''' </summary>
41: <EditorBrowsable(EditorBrowsableState.Advanced)>
42: Friend ReadOnly Property ResourceManager As ResourceManager
43: Get
44: If (Object.ReferenceEquals(Resources.resourceMan, Nothing)) Then
45: Resources.resourceMan = New System.Resources.ResourceManager("Web.Resources", GetType(Resources).Assembly)
46: End If
47: Return Resources.resourceMan
48: End Get
49: End Property
50: End Module
51: End Namespace
And this is string, stored as special section embedded inside binary DLL files.
2. Way to show resource as source in Visual Studio.
- First way is show resources as XML file above.
- Second way is show resource in project property.
- And third cool way to show text resource is ResX manager.
Resource usually has suffix, as you can see above in first site I have resource to English and Ukrainian languages, in second site I have resource for English and Hebrew languages.
This is a cool way to see the same literals and all languages you project support.
3. How to use resource in Classic ASP.NET, ASP.NET MVC and in code behind.
- This is a way to use resource in Classic ASP.NET Text="<%$ Resources:AdminLink.ascx,AdminLink_PurposeModerators %>"
- This is a way to use resource in RAZOR page:
- In source code resource usually imported in My namespace of Resources namespace.
4. Javascript resources in ASP.NET
Unfortunately directly Javascript resources in style resource://gre/modules/Services.jsm is not supported in ASP.NET. There are a lot of different solution to support Javascript resources, for example
- Walkthrough: Embedding a JavaScript File as a Resource in an Assembly
- A Localization Handler to serve ASP.NET Resources to JavaScript
5. Difficulties to working with resources.
Additionally to Javascript personally I'm faced with a couple huge difficulties with resources.- Firstly Visual Studio is not working correctly with hebrew-arab languages and Englist in the same time. Even search and replace all hebrew and arab literals is difficult. Therefore I use FindAndReplace tool with the same search pattern [\u05BE-\u05F4]+.
- But this approach with manually text replacing is possible if you have only s dozens of a hundreds literal. If you have (as usually) thousands text literals, manually replaced project text to refrence to resource is impossible. For this purpose I have various text replacement project what search literal in Cyrillic language and replace it to reference to resource (with creation resource file and automatically translated).
- And third difficulties if source project has non-english file name, need at least change locale of development system and reboot system for new locale. This is example of my communication for client about my project with Japan file name ???????????????????? ???????????????? ?????? ????????????.
6. Store resource in database, resource provider Middleware (Module).
Use Database to store all project resources. Use Middleware (Module) to handle request to resource.
|