Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Silverlight 1.1 Hebrew and Arabic Language Support

0.00/5 (No votes)
31 Jan 2008 1  
An article presenting Silverlight 1.1 Hebrew and Arabic language support

Presenting - Silverlight 1.1 Hebrew and Arabic Language Support

Since I've started working on Silverlight projects in Israel, I've got one constant request from every customer - "We need Hebrew support!".

So, we developed a Silverlight component that enables just that - Hebrew & Arabic Right-to-left & Align-to-right support.

As we can all see - English text is aligned to the left and is written Left-to-Right (LTR).
But Hebrew and Arabic are written aligned to the right and are written Right-To-Left (RTL).

So let's look at the "Hello World!" samples In Blend:

image

(You can see that all texts are aligned-to-left and are formatted by the OS and not by Silverlight.)

However, when running the Silverlight 1.1 application in the browser, we get this:

image

What??? The texts are all jumbled!
Even if you don't know how to read Hebrew & Arabic - you can see that the two examples don't look the same.

Now let's see the Texts render properly using our new Silverlight 1.1 Hebrew & Arabic Language support:

image

We'll sum up the comparison we just did:

image

And without our Hebrew & Arabic support, we get this weird cross Hebrew and Arabic and English syntax:

image

Instructions and Feature Overview

  1. Setting up the RTL Extender
  2. RTL and auto align the whole page

Advanced Features

  1. RTL selected TextBlocks
  2. RTL TextBlocks on selected Canvases
  3. Excluding TextBlocks and Canvases from being RTLed
  4. Disabling the RTLExtender
  5. Auto align feature explained
  6. Forcing aligning to right on all TextBlocks
  7. Never animate an RTLed TextBlock � animate only the parent Canvas
  8. Never Rotate an RTLed TextBlock � rotate only the parent Canvas
  9. RTL a TextBlock by using C# code
  10. Programmatically use RTLed TextBlocks
  11. Changing the TextBlock TextWrapping property from the Default.

Setting Up the RTL Extender

  1. Download binaries from here and extract the DLL (JustinAngelNet.SilverlightRTL.DLL).

    image

  2. Create a new "Expression Blend Orcas" project in Expression Blend 2 September preview.

    clip_image001

    image

  3. Add a reference to JustinAngelNet.SilverlighRTL.dll. (from JustinAngelNet.SilverlightRTL.zip)

    image

  4. Open the Expression Blend Asset library and choose RTLExtender. (Asset Library -> Custom Controls -> RTLExtender).

    clip_image004

    clip_image005

    image

  5. Place it anywhere on the form (doesn't matter where or what size)

    clip_image007

    clip_image008

RTL the Whole Page

  1. Once the RTLExtender has been added to the form, all TextBlocks will be Right-to-left and aligned to the right.
  2. Simply add a TextBlock to the page, write some content in it.

    clip_image009

  3. Run the sample.

    clip_image010

RTL Specific TextBlock/s

  1. Add another TextBlock to our page with Hebrew/Arabic.

    clip_image011

  2. Give it a name.

    clip_image012

  3. Choose the RTLExtender properties.

    clip_image013

    clip_image014

  4. In TargetTextBlocksName write the ID of the TextBlock.

    clip_image015

  5. Tbx1 should be the only TextBlock this RTLExtender RTL's.

    clip_image016

  6. You can specify multiple specific TextBlocks like this:

    clip_image017

RTL only TextBlocks on a Specific Canvas

  1. Add one more TextBlock to the page (that's three by now), and group two of them to a Canvas.

    clip_image018

  2. Name the Canvas.

    clip_image019

    clip_image020

  3. Set TargetCanvasesName to our Canvas/es.

    clip_image021

  4. Only the TextBlocks nested somewhere on this Canvas/es will be RTLed.

    clip_image022

Excluding TextBlocks/Canvases from being RTLed

  1. Let's say we want to RTL the entire form besides some Canvas/es or TextBlock/s. We can exclude TextBlocks by using the ExcludedTextBlocksName:

    clip_image023

  2. And it will be the only one of the form not RTLed:

    clip_image024

  3. Same goes if we want to exclude specific Canvas/es.

    clip_image025

  4. And the two Textblocks on myCanvas won't be RTLed, but all others on the page will.

    clip_image026

Disabling the RTLExtender

  1. Well, this is pretty straight forward. Marking "Disabled" will cause the RTLExtender to not RTL anything.

    clip_image027

  2. And the result:

    clip_image028

Auto Aligning Feature

  1. Add a new TextBlock to the Page and write one sentence that starts in Hebrew/Arabic, press Enter and one sentence that starts in English.

    clip_image029

    clip_image030

  2. I'll add a rectangle on the TextBlock's borders just so you see this feature better.

    clip_image031

  3. Run the sample and you can see that all sentences starting with an RTLed language are aligned to the right and others are still aligned to the left.

    clip_image032

  4. Same feature with more text:

    clip_image033

    • First sentence � starts with Hebrew -> Aligned to right.
    • Second Sentence � starts with English -> Aligned to left.
    • Third sentence � Starts with Hebrew -> Aligned to right.
    • Fourth sentence � Starts with English -> Aligned to left.

    clip_image034

Force Align to Right on all Sentences (Not Based on First Character)

  1. Set the ForceAllParagraphsAsRTL to true.

    clip_image035

  2. Run the sample, and all paragraphs are aligned to right.

    clip_image036

Animating an RTLed TextBlock � Only on Parent Canvas

All animations on TextBlocks that will be RTLed must be on the Parent Canvas or RTLExtender will throw an exception.

  1. Create a new storyboard that starts when the page loads up.

    clip_image037

    clip_image038

  2. Select a TextBlock that will be RTLed, and animate it somehow (let's rotate it):

    clip_image039

  3. Run the sample � nothing happens.

    clip_image040

  4. Open the test project in Visual Studio and run it from there.

    clip_image041

  5. So we got an error message in Visual Studio 2008 Beta2, telling us that we can't place ANY animations directly on the TextBlock.
    We should group the TextBlock into a Canvas.

    clip_image042

  6. Change the animations to point to the Canvas instead of the actual Textblock.

    clip_image043

    Becomes:

    clip_image044

  7. Rerun the sample and it will RTL correctly.

    clip_image045

Transform Rotate RTLed TextBlock � Only on Parent Canvas

No RotateTransform is allowed on the TextBlock that will be RTLed or RTLExtender will throw an exception.

  1. Let's take a TextBlock and rotate it.

    clip_image046

  2. If we run the sample through Expression Blend we get non RTLed text:

    clip_image047

  3. If we run the sample through Visual Studio, we get the following exception:

    clip_image048

  4. Let's place the TextBlock inside a Parent Canvas and rotate it instead.

    clip_image049

    clip_image050

  5. And when we run the Sample we get RTLed code:

    clip_image050

Programmatic Access � RTL TextBlocks by Code

  1. We can use the RTLExtender to RTL specific TextBlocks programmatically. (let's say TextBlocks on included TargetTextBlocksName or those dynamically created at runtime).

    clip_image052

  2. And as we can see, it's not RTLed on the page:

    clip_image053

  3. We'll get a reference of the RTLExtender (or create a new one) and call the RTLTextBlock method.

    clip_image054

    clip_image055

  4. And when we run this code the text is RTLed:

    clip_image056

Programmatic Access � Using an RTLed TextBlock

  1. Let's run this code:

    clip_image057

    clip_image058

  2. After a TextBlock has been RTLed, it is no longer on the XAML page.

    clip_image059

    clip_image060

  3. That's because it's been split into many various TextBlocks and removed from the parent children collection.

    clip_image061

  4. We can get a collection of TextBlocks that replace our original TextBlocks like this:

    clip_image062

    clip_image063

  5. And when we run the sample:

    clip_image064

Wrapping a TextBlock

  1. Let's add a TextBlock to our page.

    clip_image065

    clip_image066

  2. Now let's change this snuggly fitting TextBlock to have less width and more height (no breaklines were added mind you).

    clip_image067

  3. The text will automatically be wrapped by the RTLExtender.

    clip_image068

  4. We can set the TextBlock to TextWrapping.NoWrap and it will be handled by the normal Silverlight NoWrap engine:

    clip_image069

    clip_image070

  5. We can set TextWrapping.WrapWithOverflow and it will extend slightly beyond the bounds of the TextBlock.

    clip_image071

    clip_image072

Questions, Follow-up and Suggestions

Bugs

You will find bugs in this project.
Seriously, I'm not that smart that I can rebuild both Hebrew & Arabic RTL and align-to-right support in 10 hours.

Please go to the project's Codeplex page here and SilverlightRTL Create a new Issue.
Write what error you received, add the appropriate minimal & relevant code.
If something isn't working as you expect it to, tell me what you expect and what actually happens.

Attach a print screen if possible.

image

Feature Requests

Additionally, you might want additional features (having the RTLExtender set its own fonts and download them from the server comes to mind).

Same goes, open a new issue and I'll do my best.

Check for Updates

This project will surely undergo constant changes in the first 30-60 days after publishing.
If you're using this project, please signup to our RSS feed so you get notices.
RSS feed can be found here.

Here are my personal details just in case you feel the Codeplex page isn't sufficient:
Email: J@JustinAngel.Net
Cell: +972 546 567789
Office: +972 3 9504364

I'm serious about this, don't hesitate to contact me.

Well, that's about it.

History

  • Published on The Code Project - January 31, 2008
  • Published on CodePlex - October 26, 2007

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