Globalization Improvements in Microsoft .NET Framework v2.0

Download Report

Transcript Globalization Improvements in Microsoft .NET Framework v2.0

Creating Multi-lingual
Applications and
Websites with
Microsoft Visual
Studio 2005
Achim Ruopp
International Program Manager
Microsoft Corporation
Agenda
 Resource Improvements
 Strongly Typed Resources
 Fallback to Satellite Assembly
 Editing Resources
 ASP.NET Localization





Detecting the Browser Language
Declarative Localization Model with designer support
Extensibility
Deployment
Bidirectional Web Pages
 Smart Client Applications
 Windows Forms
 Table Layout/Grid Layout Controls
 Bidirectional Languages
 Performance Improvements
 ClickOnce Deployment
Visual Studio and .NET Framework
Versions
Visual Studio .NET
.NET Framework v1.0
Visual Studio .NET 2003
.NET Framework v1.1
Visual Studio 2005
(code name: Whidbey)
.NET Framework v2.0
(code name: Whidbey)
Strongly Typed Resources
 Resources have types





Strings
Boolean
Images
Audio Files
…
 Strongly Typed Resources
 What are they?
 Provide ability to creates classes containing read-only
properties for resources
 Benefits:




Eliminates mismatches between code and resource identifiers
Provides Intellisense on resource identifiers
ResourceManager is created for you
No need to cast objects to other types
Resources Then and Now
.NET Framework v1.0/v1.1
private ResourceManager rm;
rm = new ResourceManager("MyImages", this.GetType().Assembly);
PictureBox.Image =
(System.Drawing.Image)rm.GetObject("MyImage");
.NET Framework v2.0
PictureBox.Image = ResourceFilename.MyImage;
Fallback To Satellite Assembly
 Fallback
 Best fit UI language for user (CurrentUICulture)
 Example: fr-CA → fr → fallback (e.g. de)
 Additional fallback resource location
 v 1.0/1.1 – ResourceManager only loaded fallback
resources from the main assembly
 v 2.0 – Adds ability to build fallback resources in a
satellite assembly
 [assembly:
NeutralResourcesLanguageAttribute("de" ,
UltimateResourceFallbackLocation.Satellite)]
 Clean separation of code and user interface
 Useful for servicing
 Can potentially reduce download size for updates
Editing Resources
 New Resource Editor
 Integrated in Visual Studio 2005
 For .resx format
 Uses link syntax for complex type resources
(images, sounds, …)
 XML editors and localization tools can still be
used
 More on Windows Forms and ASP.NET
resource editing later
Creating and Using
Resources
ASP.NET Localization
 v. 1.0/1.1
 .NET resource model can be used
 No design time assistance
 v. 2.0
 Uses .NET resource model
 Provides a simple declarative model for
localization
 Automatic generation of resources in designer
 Editing of resources using the resource editor
 Server side compilation of .resx files
 Auto-detection of browser culture
Detecting the Browser Language
 HTTP Accept-Language header
 v 1.0/1.1
 Write code to detect browser language
 Specify preferred culture in web.config, page or code
 2.0
 Use “auto” for automatically detecting browser
language
 Can override in InitializeCulture()
 It is still possible to specify preferred culture in
web.config, page or code
<%@ Page Culture=“auto:fr” UICulture=“auto:fr-FR” .. %>
ASP.NET Resources
 Local Resources
 Use for page resources
 Stored in \App_LocalResources folder
 Generated through the designer
 Tools/Generate Local Resources command used in design
view of the page
 Global Application Resources
 Use for global strings or binary types
 Stored in \App_GlobalResources folder
 Strongly-typed, available to all pages through
Resources member
 Default Resource format
 Author .resx in the resource or XML editor
 Other formats possible through extensibility
Retrieving Resources
 Declaratively
 Explicit or implicit expressions
 Programmatic
 GetLocalResourceObject()/GetGlobalResourceObject()
 System.Web.UI.TemplateControl Class
 System.Web.HttpContext Class
foo.aspx
\App_LocalResources
foo.aspx.resx
foo.aspx.fr.resx
Declaratively:
<asp:label runat="server" text="<%$ Resources:foo %>" />
<asp:label runat="server"
meta:ResourceKey="LabelResource1" %>
Programmatically:
foo.Text = (string)GetLocalResourceObject(“foo");
Expressions
 Declarative syntax
 Access local or global resources
 Interpreted at parse time
 Explicit and implicit forms
 Can be mixed, but should not collide
 Designer creates implicit expression syntax
 Explicit expressions can be edited in Expressions
property of controls
Explicit form: <%$ Resources:[classKey,]resourceKey %>
<asp:label runat=“server” text=“<%$ Resources:MainTitle %>” />
<asp:button runat=“server” text=“<%$ Resources:MyStrings,OK_Key %>”/>
Implicit form: meta:ResourceKey=“keyprefix”
<asp:label runat=“server” meta:resourcekey=“LabelResource1” />
Extensibility
 Other resource formats
 Databases
 Existing XML formats
…
 Option 1: Localization expressions can be extended
 Subclass ResourceProviderFactory
 Allows design-time support for custom resource formats
 Option 2: Create expression builder for new
resource format
 Subclass System.Web.Compilation.ExpressionBuilder
 Design-time support only through ExpressionEditor
 Deployment of e.g. a database is more difficult
Deployment
 ASP.NET v2.0 has 3 compilation models
 Uncompiled
 Source files including .resx files are copied to server
 Resources are compiled on server
 Compiled resources are cached on first use
 Precompiled excluding markup
 Deploy .resx/.aspx files like in uncompiled case
 Page design changeable
 Global resource satellite assemblies precompiled
 Precompiled including markup
 Page design cannot be changed
 Everything precompiled into assemblies
 Additional languages can be added in all 3 models
 Application domain needs to be restarted
Bidirectional Web Pages
 Direction property on <asp:panel>
 Can be explicitly defined
 Can be loaded using a resource expression
 Useful for mixed left-to-right/right-to-left pages
 Full right-to-left pages
 Set DIR attribute on HTML tag using an explicit
resource expression
<asp:panel runat=“server” meta:resourcekey=“MainTitle” />
<data name=“MainTitle.Direction”>
<value>RightToLeft</value>
</data>
ASP .NET Localization
Windows Forms Localization
v1.0/v1.1
 Each form has a Localizable property
 Creates single .resx file for default resources
 Each form has Language property
 Creates one additional .resx file per selected language
 Edit source/localized .resx files in
 Visual Studio Windows Forms designer
 XML editor
 WinRes tool (.NET Framework SDK tool)




Images serialized into .resx file
Pulled each localizable property from the .resx file
Built satellite assemblies directly in VS
Setup projects available in 9 languages
Windows Forms Localization v2.0
 Localizable/Language properties remain the same
 One .resx file per form per language
 Edit source/localized .resx files in




Visual Studio Windows Forms designer
WinRes tool (.NET Framework SDK tool)
Visual Studio Resource Editor
XML editor
 Images
 Linked into .resx files rather than serialized
 Default to application-wide .resx file
 New code generation using the
ComponentResourceManager improves performance
 New layout functionality reduces resizing during localization
 Deploy Click Once projects in any language
Localize Without Resizing
 v1.0/v1.1
 Use docking and anchoring properties
 new layout controls in v2.0
 Use TableLayoutPanel for
 Resizing a group of controls proportionally
 Dynamically generating UI with customizable fields
 Creating a fixed size UI while still allowing
localization
 Use FlowLayoutPanel for
 Creating a series of horizontal controls which may
wrap vertically but aren’t proportional to each other
 Mechanism for “bumping” controls relative to other
controls
RightToLeft Languages
 RightToLeft property (v 1.0/v 1.1/v 2.0)
 Determines reading order for text
 Affects layout for some controls
 RightToLeftLayout (v 2.0)
 Determines layout of controls
 Form, TabControl, TreeView, ListView, TrackBar,
ProgressBar, MonthCalendar and DateTimePicker
 Does not inherit down control hierarchy
 Controls support full “mirroring”
 Set both RightToLeft and RightToLeftLayout
 Determining text direction for culture
 CultureInfo.TextInfo.IsRightToLeft
Click Once
 New deployment mechanism




versioning
update service
installation over the web
…
 Deploy multiple languages from a single project
 Language property determines
 language satellite assemblies
 language external dependencies
 ClickOnce language resources (.xml files)
 Can extend ClickOnce resource languages by
localizing setup.xml
Layout Controls and
ClickOnce
References
 Visual Studio 2005/.NET Framework v2.0
 http://lab.msdn.microsoft.com/vs2005/
 Microsoft Globaldev website
 http://www.microsoft.com/globaldev/
 Newsgroup
 news:microsoft.public.dotnet.internationalization
 Blogs




http://blogs.msdn.com/michkap
http://blogs.msdn.com/AchimR
http://www.dasblonde.net/
http://blogs.msdn.com/BCLTeam
Appendix
ASP.NET Localization Expressions
Implicit Expressions
 Used to partially or fully localize an ‘object’
with minimal syntax
 Controls, sub-objects, page directive
 Only used to access local resources
 Generated by the designer
Implicit Expressions
 Runtime
 Default .resx interrogated for keyprefix and properties
set
 Key: filter, keyprefix, control property, sub-property
 Design-time
 Control properties marked [Localizable(true)] are
‘pushed’ to .resx
<asp:label runat=“server” meta:resourcekey=“MainTitle” />
<data name=“MainTitle.Text”>
<value xml:space=“preserve”>Welcome to the site</value>
</data>
<data name=“MainTitle.Font.Bold”>
<value>true</value>
</data>
Explicit Expressions
 Used on any control or object property
 Fine-grained handling for properties which are
not localizable by default
 Can be used for HTML attributes
 Access global or local resources
 Runtime
 Used to obtain resource value and perform property
assignment
 Design-time
 Developer can create expressions against control
properties in “Expressions…” dialog