Click here to Skip to main content
15,885,244 members
Articles / Web Development / ASP.NET

Creating Multilingual Websites - Part 3

Rate me:
Please Sign up or sign in to vote.
4.76/5 (24 votes)
1 Nov 200513 min read 219.4K   3K   173  
Extend the existing globalization capabilities of .NET to create flexible and powerful multilgual web sites. This third part won't focus on the fundamental but rather enhancements to what we've already covered.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Resources]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Resources]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ResourcesLocale]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ResourcesLocale]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Images]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Images]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ImagesLocale]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ImagesLocale]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Culture]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Culture]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LoadResources]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[LoadResources]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LoadImages]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[LoadImages]
GO

CREATE TABLE Resources
(
  [Id] INT NOT NULL PRIMARY KEY IDENTITY (1,1),
  [Name] VARCHAR(64) NOT NULL
)

CREATE TABLE ResourcesLocale
(
   [LocaleId] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
   [ResourceId] INT NOT NULL,
   [CultureId] INT NOT NULL,
   [Value] VARCHAR(1024) NOT NULL
)
CREATE TABLE ImagesLocale
(
   [LocaleId] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
   [ResourceId] INT NOT NULL,
   [CultureId] INT NOT NULL,
   [Width] INT NOT NULL,
   [Height] INT NOT NULL,
   [Alt] VARCHAR(1024) NOT NULL
)
CREATE TABLE Images
(
  [Id] INT NOT NULL PRIMARY KEY IDENTITY (1,1),
  [Name] VARCHAR(64) NOT NULL
)
CREATE TABLE Culture
(
  [CultureId] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  [Culture] CHAR(5) NOT NULL,
  [DisplayName] VARCHAR(64) NOT NULL
)

GO
CREATE PROCEDURE LoadResources
(
  @DefaultCulture CHAR(5),
  @CurrentCulture CHAR(5)
)
AS
SET NOCOUNT ON

  SELECT R.[Name], RL.[Value]
   FROM Resources R 
      INNER JOIN ResourcesLocale RL ON R.Id = RL.ResourceId
      INNER JOIN Culture C ON RL.CultureId = C.CultureId
   WHERE C.Culture = @CurrentCulture
   
   UNION ALL

  SELECT R.[Name], RL.[Value]
   FROM Resources R 
      INNER JOIN ResourcesLocale RL ON R.Id = RL.ResourceId
      INNER JOIN Culture C ON RL.CultureId = C.CultureId
   WHERE C.Culture = @DefaultCulture
    AND R.[Name] NOT IN (
        SELECT [Name] FROM Resources R2 
          INNER JOIN ResourcesLocale RL2 ON R2.Id = RL2.ResourceId
          INNER JOIN Culture C2 ON RL2.CultureId = C2.CultureId
       WHERE C2.Culture = @CurrentCulture
    )
SET NOCOUNT OFF

GO

CREATE PROCEDURE LoadImages
(
  @DefaultCulture CHAR(5),
  @CurrentCulture CHAR(5)
)
AS
SET NOCOUNT ON

  SELECT I.[Name], IL.[Width], IL.[Height], IL.[Alt]
   FROM Images I
      INNER JOIN ImagesLocale IL ON I.Id = IL.ResourceId
      INNER JOIN Culture C ON IL.CultureId = C.CultureId
   WHERE C.Culture = @CurrentCulture
   
   UNION ALL

  SELECT I.[Name], IL.[Width], IL.[Height], IL.[Alt]
   FROM Images I
      INNER JOIN ImagesLocale IL ON I.Id = IL.ResourceId
      INNER JOIN Culture C ON IL.CultureId = C.CultureId
   WHERE C.Culture = @DefaultCulture
    AND I.[Name] NOT IN (
        SELECT [Name] FROM Images I2 
          INNER JOIN ImagesLocale IL2 ON I2.Id = IL2.ResourceId
          INNER JOIN Culture C2 ON IL2.CultureId = C2.CultureId
       WHERE C2.Culture = @CurrentCulture
    )
SET NOCOUNT OFF


GO

--SAMPLE DATA 
  DECLARE @EnglishCultureId INT,
          @FrenchCultureId INT,
          @ResourceId INT
          
  INSERT INTO Culture (Culture, DisplayName) VALUES ('en-CA', 'English')
  SET @EnglishCultureId = SCOPE_IDENTITY()
  INSERT INTO Culture (Culture, DisplayName) VALUES ('fr-CA', 'Fran�ais')
  SET @FrenchCultureId = SCOPE_IDENTITY()
  
  
  INSERT INTO Resources ([Name]) VALUES ('colon')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, ':')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, ' :')

  INSERT INTO Resources ([Name]) VALUES ('username')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Username')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Nom d''utilisateur')
   
  INSERT INTO Resources ([Name]) VALUES ('password')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Password')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Mots de passe')
  
  INSERT INTO Resources ([Name]) VALUES ('login')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Login')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Soumettre')
  
  INSERT INTO Resources ([Name]) VALUES ('rememberMe')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Remember Me?')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Soumettre')
  
  INSERT INTO Resources ([Name]) VALUES ('usernameRequired')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Username required')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Nom d''utilisateur requis')
  
  INSERT INTO Resources ([Name]) VALUES ('passwordRequired')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Password required')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Mots de passe requis')
  
  INSERT INTO Resources ([Name]) VALUES ('invalidLoginInformation')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Your username/password could not be found')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Nom d''utilisateur/mot de passe invalide')
  
  INSERT INTO Resources ([Name]) VALUES ('forgottenPassword')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Forgotten Password?')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Oubliez votre mots de passe?')

  INSERT INTO Resources ([Name]) VALUES ('email')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Email')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Courriel')
  
  INSERT INTO Resources ([Name]) VALUES ('send')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Send')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Envoyer')
  
  INSERT INTO Resources ([Name]) VALUES ('emailRequired')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Please enter your email')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Courriel requis')
  
  INSERT INTO Resources ([Name]) VALUES ('ClickToSeeBinding')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, '<a href="{URL}">Click here</a> to see a binding/placeholder example')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, '<a href="{URL}">Clicker i�i</a> pour voir une example de placeholder') 
  
  INSERT INTO Resources ([Name]) VALUES ('Welcome')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'Welcome to {SITENAME}')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Bienvenue a notre site {SITENAME}')
 
  
  INSERT INTO Resources ([Name]) VALUES ('LoginAudit')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, '{USERNAME}, also known as {NAME} last logged in on {DATE}')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'La derni�re date d''ouverture pour {USERNAME}, aussi connue par {NAME}, � �t� le {DATE}')
  
  INSERT INTO Resources ([Name]) VALUES ('EnteredUsername')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'You have entered "{0}" as the username')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Le nom d''utilisateur est "{0}"')
  
  INSERT INTO Resources ([Name]) VALUES ('EnteredPassword')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @EnglishCultureId, 'You have entered "{0}" as the password.')
  INSERT INTO ResourcesLocale (ResourceId, CultureId, [Value]) VALUES (@ResourceId, @FrenchCultureId, 'Le mots de pass est "{0}"')
 
   
  INSERT INTO Images ([Name]) VALUES ('Title')
  SET @ResourceId = SCOPE_IDENTITY()
  INSERT INTO ImagesLocale (ResourceId, CultureId, [Width], [Height], [Alt]) 
    VALUES (@ResourceId, @EnglishCultureId, 252, 30, 'Multilingual Sample' )
      
  INSERT INTO ImagesLocale (ResourceId, CultureId, [Width], [Height], [Alt]) 
    VALUES (@ResourceId, @FrenchCultureId, 258, 31, 'Exemple Multilingue' )   

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Canada Canada
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions