Download - Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Transcript
Page 1: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Mark FrederiksenABLE Innovations

i18n

(Internationalization)

in ASP.NET 2.0

Page 2: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Objectives: • Describe the Internationalization

issues related to ASP.NET 2.0 applications

• Define technical approaches

• Suggest strategies for Internationalizing ASP.NET 2.0 applications (and WinForms, too)

Page 3: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Assumptions: Environment

• ASP.NET 2.0 development environment

– Using Visual Studio 2005 C#

• Microsoft SQL Server 2005

– Typically, single or clustered server environment supporting multiple languages simultaneously:

• Unicode – as default code set

• Likely: Using ASP.NET 2.0 Membership/Profile capabilities

Page 4: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Assumptions: Users

• Using browsers:

– Internet Explorer 6.0+ (Windows and Mac??)

– Firefox 1.5+ (Windows and Mac)

– Safari 1.3.2 (Mac)

• Languages initially supported:

• Unicode – as default code set

– English (default)

– Western European languages

– Asian: Japanese, Korean, Chinese (simplified (PRC), traditional (Taiwan, other areas)

• Discussion will NOT include: bi-directional language

• Only Gregorian calendar system will be considered

• Most Users are not on local LAN - not dependant upon AD

Page 5: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Primary Steps: • Enable International options (SQL

Server)

• Establish the user’s preferred culture

• Respond to the user’s culture •Resources and Formatting

• Resource translation

• Test and Maintain system

Page 6: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server Issues: • Enable Unicode

• Establish the Collate options

Page 7: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server 2005 – Default Internationalization Settings

Default internationalization behavior is determined by:

• SQL Installation

•Install asks for default Character set and Collation- Affects System database

Choosing Unicode would double system databases

- Hard to change after SQL Server is installed

•Suggest using DEFAULTS: Windows Latin-1 char. Set Latin1_General collation

•Defining a new database

•Defaults to model database

• - which defaults to SQL Installation Char set/Collation – unless model database has been altered

•Suggest using DEFAULTS:

Page 8: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server 2005 – Data Columns

• Use Unicode datatypes in: Table columns, CONVERT() and CAST()

operations• nchar

• nvarchar

• nvarchar(max)

• ntext

• Catalog view sys.types reports length in bytes, not characters

•Substitute: ASCII() and CHAR() with: UNICODE() and NCHAR()

• Define variables and parameters of Stored Procedure and triggers in Unicode

•Prefix Unicode string constants with the letter “N”

•Important even if the column name being references is Unicode: e.g. EXECUTE Product_Info @name = N’Chain’

Page 9: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server 2005 – Unicode

• SQL Server 2005 uses UCS-2

•Some characters not included: Additional Chinese characters

•SQL Server stores these as: “supplementary characters” - stored as two unified Unicode character

•Supplementary characters sorted in “90” series collations:

• Japnese_90

•Korean_90

•Chinese_PRC_90 Chinese_PRC_Stroke_90

•Chinese_Taiwan_Bopomofo_90 Chinese_Taiwan_Stroke_90

•Chinese_Hong_Kong_Stroke_90_CI_AS

Page 10: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server 2005 – Collation

• SQL Server 2005 uses two collation Types

•Windows Collation

•Defined to support Windows locales

•Uses the same code pages, sorting, comparisons as an application on a Windows system

•Recommended if you mix Unicode and non-Unicode columns in the database – applies Unicode based sorting rules to both Unicode and non-Unicode data (internally converts non-Unicode data to Unicode for comparison operations), unlike SQL Collations

•Default setting – Latin1_General supports 33 locales

•SQL Collations – Legacy for prior SQL versions

•Sorts Unicode fields as Unicode, and non-Unicode as non-Unicode

Page 11: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server 2005 – Sorting Order

•Sort order concepts

•Three sort values

•Primary value – basic character – ignoring case and accents

•Secondary value – A = a

•Tertiary value - typically accents

•Options:• Case Sensitive

• Accent Sensitive

• Kana sensitive – distinguish between Japanese Kana and Hiragana

• Width sensitive - distinguish between half-width and full-width chars.

• Binary Binary Code

Page 12: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

SQL Server 2005 – SQL statements

•Specifying Collation in SQL

•Collate clause:

•Example:

SELECT name FROM customer ORDER BY name COLLATE Japanese_Unicode

•Append options:

•_CS _CI Case sensitive Case insensitive

•_AS _AI Accent sensitive Accent inensitive

•_KS Kana sensitive, if omitted, Kana insensitive

•_WS Width sensitive, if omitted, width insensitive

•Examples: Latin1_General_CI_AS

Page 13: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Establish the User’s

preferred “culture”

Page 14: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Culture

• Description of a language, and OPTIONALLY a region– System.Globalization.CultureInfo class

– Culture string representation based on RFC 1766: languagecode2[-country/regioncode2[-script]]

– Examples: en represents “neutral English”

en-GB represents UK English

• CultureInfo object– Invariant: “” absence of culture

(may be English)

– Neutral “en” Language – NOT specific to a particular region

– Specific “en-GB” Language in a specific region, and region info, e.g., formatting

Page 15: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Default International behavior

Default internationalization behavior is determined by:

- CurrentCulture and CurrentUICulture

Determined from either:

CultureInfo class, or the current thread

Assigned only from the current thread

CurrentCulture – must be a SPECIFIC culture:default culture for System.Globalization – affects culture specific formatting (date/time, number,currency, … AND display of Calendar control)

CurrentUICulture – Can be neutral or specific culture:default culture used by ResourceManager

Page 16: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Setting the Culture

•Web.config <globalization enableClientBasedCulture=“true”

culture=“en-GB” uiculture=“en” />

Or, <%@ Page … Culture=“auto:en-GB” UICulture=“auto:en” …. %>

•Page•Automatic (browser’s first requested culture)

with default: <%@ Page … Culture=“auto:en-GB” UICulture=“auto:en” …. %>

•Programmatically:

• Analyze complete list of browsers culture requests

• Based upon setting in the User’s Profile

Page 17: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Setting the Culture – Collation

•SQL Server 2005 Collations

•Two types:

–Windows Collations – recommended

Based upon Windows locales – attempt to match SQL Server 2005 and Windows localesDefault – Latin1_General

–SQL Collations -- Legacy with prior version of SQL Server

•Called very early in the page life cycle: - before ALL page events - during the FrameworkInitialize method before controls are created

•Can set culture based upon LCIDinstead of Culture Name - useful for alternative Sort Orders

Page 18: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Set Culture – reviewing all culture requests from the

browserMatching browser’s culture requests:

• Automatic method: <%@ Page … Culture=“auto” ….only uses browser’s FIRST request

• Iterate through the browser’s requested cultures

•Browsers cultures are listed in Priority order (there are actually weight information)

•Strategies:

•Find the first valid culture

•Find the first culture that is supported by resource code

•Differentiate between Culture and UICulture

Page 19: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Set Culture – reviewing all browser requests – CODE

Sample• Iterate through the browser’s requested cultures – Part 1 of 2 (Sample taken from .NET Internationalization book, pp 148-9)

protected override void InitializeCulture(){

if (Request.UserLanguages != null && Request.UserLanguages.GetLength(0) > 0){

foreach (string userLanguage in Request.UserLanguages){

CultureInfo cultureInfo = GetCultureInfo(userLanguage, true);

if (cultureInfo != null){

Thread.CurrentThread.CurrentUICulture = cultureInfo;Thread.CurrentThread.CurrentCulture =

CultureInfo.CreateSpecificCulture(cultureInfo.Name);break;

}}

}}

Page 20: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Set Culture – reviewing all browser requests – CODE

Sample• Iterate through the browser’s requested cultures -- Part 2 of 2 (Sample taken from .NET Internationalization book, pp 148-9)

protected virtual CultureInfo GetCultureInfo(string userLanguage, bool useUserOverride)

{int semiColonIndex = userLanguage.IndexOf(";");if (semiColonIndex != -1)

userLanguage = userLanguage.Substring(0, semiColonIndex);

try{

return new CultureInfo(userLanguage, useUserOverride);}

catch (ArgumentException){

return null;}

}

Page 21: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Set Culture – Using Culture Information from User Profile

User Profile :

• Store user’s preferred culture information in the ASP.NET 2.0 Membership/Profile system

• For each page, or using a new base class – for all pages (Except the Logon-on pages)

See: Core Internet Application Development with ASP.NET 2.0 page 971

Page 22: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

•Resource Code

•Formatting

Respond to the User’s preferred “culture”

Page 23: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Resource Code

Page 24: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Setting the Culture - Page

•InitializeCulture method for a page

•Method is new to ASP.NET 2.0

•Called very early in the page life cycle: - before ALL page events - during the FrameworkInitialize method before controls are created

•Can set culture based upon LCIDinstead of Culture Name

- useful for alternative Sort Orders

Page 25: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Resource code Managers

•ASP.NET – Built-in: System.Resources.ResourceManager• Uses standard .resx format

– Easily handled by localization firms

• Directly supported in VS 2005• Built-in tool to generate .resx files

from non-localized ASP.NET project

• Cached – good performance

•Custom resource managers• Directly use SQL Server• Slower performance

Page 26: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Creating Resource Files – VS 2005 Tool

Visual Studio 2005 tool: Generate Local Resources

•Generates resource file for a particular page -- from Design view – Tools > Generate Local Resoruces

•Automatically creates .resx file that includes all properties marked: Localizable(true)•By default, most Webcontrols’: Text, Title, ToolTip

•NOT HTLM controls, except: HtmlAnchor, HtmlImage HtmlInputImage, HtmlTitle

•Automatically modifies the page source

•Does NOT work with raw HTLM, e.g.: <p>text</p> can substitute Localize control

Page 27: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Resource File Hierarchy

The Generate Local Resource tool only creates the default page resource files.

You must copy the default resource files and rename then to create the language resource hierarchy.

Page 28: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Generate Local Resources

Generate Local Resources – Example code – BEFORE using tool: <%@ Page Language="C#" AutoEventWireup="true“ CodeFile="Default.aspx.cs" Inherits="_Default" %>

<table>

<tr>

<td style="width: 100px">

<asp:Label ID="Label1" runat="server"

Text="User name"></asp:Label></td><td style="width: 100px">

<asp:TextBox ID="TextBox1" runat="server">

</asp:TextBox></td>

</tr>

</table>

Page 29: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Generate Local Resources

Generate Local Resources – Page SourceExample code, before using tool:

<%@ Page Language="C#" AutoEventWireup="true“ CodeFile="Default.aspx.cs" Inherits="_Default" %>

after using tool:

<%@ Page Language="C#" AutoEventWireup="true"

CodeFile="Default.aspx.cs" Inherits="_Default"

Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>

Page 30: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Generate Local Resources

Generate Local Resources – Example code, after using

tool: <table> <tr>

<td style="width: 100px">

<asp:Label ID="Label1" runat="server"

Text="User Name"

meta:resourcekey="Label1Resource1">

</asp:Label></td>

<td style="width: 100px">

<asp:TextBox ID="TextBox1" runat="server"

meta:resourcekey="TextBox1Resource1">

</asp:TextBox></td>

</tr> </table>

Page 31: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Resource Code Generation

Demo

Page 32: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Generate Local Resources

Generate Local Resources – Example Resource file:

Page 33: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Generate Local Resources

Generate Local Resources –

• Original TEXT attribute is retained• Not used at Runtime

• Shown at design time

• Property Windows - shown with pink icon:

Page 34: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Preventing localization

When using the Generate Local Resources tool

•Can prevent a control from being included in Generate Local Resources:

<asp:Label ID="Label1" runat="server"

Meta:localize=“false” Text="User name">

</asp:Label>

Page 35: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Localize control

Generate Local Resource tool Does NOT work with static text, e.g.: <p>This is an example.</p>

•Can substitute Localize control (derived from Literal), but must contain ONLY static text (no ASP.NET controls) <p> <asp:Localize ID=“locEx” runat=“Server”> This is an example. </asp:Localize> </p>Generate Local Resources will transform this to: <p> <asp:Localize ID=“locEx” runat=“Server”> meta:resourcekey=“locEx” Text=“This is an example.”> </asp:Localize> </p>

Page 36: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Explicit Expressions

Generate Local Resource tool– generates IMPLICIT expressions for controls with properties marked internally as “Localizable(true)”

Explicit Expressions – useful for binding resources to ANY property … such as color, or ImageURL of ImageControl

- use in HTML Attributes

• Steps:Create string resource entry: e.g.: WarningColor

•Using Control’s Expressions select …. Select the control, Expression Type – choose: Resources Select the resource entry, property, resource

Page 37: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Explicit Expressions – cont’d

Explicit Expressions

•Syntax: <%$ Resources: resource-file, resource-key %>"• If resource-file is not specified,

then looks for resource-key in local resource

•Cannot combine: Explicit resource expression for a local resource and Implicit resource expression within same control

•Can combine: Explicit resource expression for a GLOBAL resource and Implicit resource expression within same control

Page 38: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Global Resources

Global Resources

•Reduces duplicationAll pages may share access to the same set of resources

•Necessary for Explicit resources where in control that also uses Implicit resources

•Compiled into a strongly typed class

•MUST be in folder: App_GlobalResources

•MUST use explicit resource references

Page 39: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Programmatic Resource Access

Global Resources

•Can use compiled classname

labMessage.Text = Resources.GlobalColors.WarningColor;

Local Resources

•User the GetLocalResourceObject

labMessage.Text = (string)GetLocalResourceObject( “PageResources1.title”);

Page 40: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Formatting

Page 41: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Formatting - Overview

Formatting

•Default setting dictated by: CurrentCultureOr, you may specify a particular culutre

•Culture senstitive Requires an SPECIFIC Culture•E.g., en-GBNOT en

•Always use the Globalization class

•Consider Invariant “” for data exchange

Page 42: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Formatting – Overview – cont’d

Formatting

•Implications for:•Text: Comparison, case conversion, string

length Sorting

•Numbers/Currency

•Date/Time

•Issues: is the method sensitive to: CultureInfo.CurrentCulture

Page 43: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Text comparison

String comparison

•Culture Insensitive/Case Insensitive:

== (equality operator)String.Equals(String,String)

•Culture Sensitive

String.Equals(String,String,StringComparison)

String.CompareTo(String)String.Compare(String,String)String.Compare(String,String,Boolean)

–case-T/F String.Compare(String,String,StringComparison)

Page 44: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

StringComparison

StringComparison - Enumeration•CurrentCulure

•CurrentCultureIgnoreCase

•InvariantCulture

•InvariantCultureIgnoreCase

•Ordinal

•OrdinalIgnoreCase

Ordinal – comparison based upon numerical values of the Char objects in each string

Page 45: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Case conversion

Case Conversion

•Many language scripts do not have have a concept of “case” e.g., Japanese, Chinese

•Culture Sensitive String.ToUpper()

String.ToUpper(CultureInfo)String.Lower()

String.ToLower(CultureInfo) Char.ToUpper() Char.ToUpper(CultureInfo)

Char.ToLower()Char.ToLower(CultureInfo)

•Culture Insensitive -- Use CultureInfo overload and

specify:

CultureInfo.InvariantCulture

Page 46: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Domain Name Processing

International Domain names

•Originally – only 7-bit ASCII characters•2003 – IETF specifies interim solution until full use of

Unicode

•Encoding system – Unicode to ASCII domain names

•.NET 2.0 – idnMapping class idnMapping.GetAscii

idnMapping.GetUnicode

•Strategy:•Display (and accept) URLs and e-mail

addresses in Unicode

•Store and utilize URLs and e-mail addresses in Ascii Encoded form

Page 47: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Sorting – Collation in .NET

Sorting Issues

•Distinction: (CompareOptions enumeration)•Word sort – “weights” on characters

e.g., “coop” sorts close to “co-op”

•String sort – all non-alphanumeric sort before alphanumeric

•Ordinal sort – based on the numeric value each Char object

•Some Unicode characters can have multiple binary representations: composite characters“dual-width”• Unicode has four different normalization algorithms to normalize a

string

•Precise way of sorting/comparison in .NET:•Normalize strings: System.String.Normalize

- used Unicode normalization to map to standard

•Use Ordinal option on Compare to compare strings

Page 48: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Sorting/Collation - LCID

Sorting Issues – cont’d

•Most cultures have multiple sort orders e.g.: Spanish – Modern/International - Traditional

the culture: “es-ES” – uses the default – Modern/Int’l sort

•.NET 2.0 – allows creation for alternative sorting:•CultureInfo cultureInfo = new CultureInfo(“es-ES_tradnl”);

•.NET 1.1 and 2.0 allow using Local ID (LCID)•CultureInfo cultureInfo = new CultureInfo(0x0000040A);

Page 49: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Numbers/Currency

Numberic .ToString

• Culture formatted using NumberFormatInfo class

•Can be created for Specific or Invariant culture, but NOT created for a neutral culture

•Default set by CurrentCulture’s NumberFormat Property

• Standard number format Specifiers

•Uses NumberFormatInfo class:c, C Currency f, F Fixed Pointn, N Number p, P Percent

•Does NOT use NumberFormatInfo class:d, D Decimal e, E Exponential x, X Hexadecimal g, G General r, R Round-trip

• Can specify a particular culture Val.ToString(“N”, new CultureInfo(“fr-FR”))

Page 50: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Numbers/Currency – Parsing Input

Numeric .Parse method

•Uses the CurrentCulture by default•Can specify a particular culture

•NOTE: Formatting characters throw an exception UNLESS specify NumberStyles enumeration•Any – all styles except for Hex

•Currency - all styles except for Exponent and Hex

•None - all styles except for Exponent and Hex

•Number, Integer

•Example CultureInfo MyCultureInfo – new CultureInfo(“en-US”);

String MyString = “123,456”;

Int MyInt = int.Parse(MyString, All, MyCultureInfo);

Page 51: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

DateTime - Output

DateTime .ToString method

• Culture formatted using DateTimeFormatInfo class

•Can be created for Specific or Invariant culture, but NOT created for a neutral culture

•Default set by CurrentCulture’s DateTimeFormat Property

• Uses CurrentCulture by default:ToString() ToShortDateString() ToLongDateString()

ToShortTimeString()ToLongTimeString()

• Specify particular culture:ToString(string)

ToString(string, IFormatProvider)

Page 52: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

ASP.NET Calendar Control

ASP.NET Calendar control

•Automatically localized•Defaults to the CurrentCulture

•NOTE: Not CurrentUICulture

•Issue: If CurrentCulture and CurrentUICulture are different,then the Calendar control will appear in the LANGUAGE of the CurrentCulture

Page 53: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

DateTime – Parsing Input

DateTime.Parse related methods•.Net Framework 1.1, 2.0: Parse ParseExact

•.Net Framework 2.0: TryParseTryParseExact

•Example: CultureInfo MyCultureInfo – new CultureInfo(“de-DE”);

String MyString = “12 Juni 2002”;

DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);

Page 54: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Suggested References

Books• Inside Microsoft SQL Server 2005: The Storage Engine –

pp 11-14 by: Kalen Delaney ISBN: 0735621055

• .NET Internationalization -- by Guy Smith Ferrier ISBN: 0321341384

• Core Internet Application Development with ASP.NET 2.0 by: Randy Connolly ISBN: 0321419502

Page 55: Mark Frederiksen ABLE Innovations i18n (Internationalization) in ASP.NET 2.0.

Contact Information:

Mark Frederiksen

Consultant, ABLE Innovations

Phone: (301) 948-8895

Email: [email protected]

“...because localization doesn't HAVE to be ugly!”