Skip to main content

Internationalization and Globalization Support within .Net

Assignment Manager

http://www.eweek.com/article2/0,1759,1372407,00.asp
http://msdn.microsoft.com/academic/techdown/sharedsource/ssassignmentmgr/getstartassignmgr/default.aspx
http://msdn.microsoft.com/academic/techdown/sharedsource/ssassignmentmgr/default.aspx

Assignment Manager is a student computer science project submittal and tracking software product written in C# Microsoft ships with the Academic SKU of Visual Studio. My firm was contracted by Microsoft to build the original Assignment Manager in early 2000-before .Net was even released. It was intended to serve as an example of how best to compile a solution of this nature. The product has since become shared source and has changed somewhat.
From the official description:

The Assignment Manager enables faculty to manage courses, track assignments, notify students of grades as well as student modules. And the Visual Studio .Net Academic Tools Source Licensing Program gives academic users access to source code for the Assignment Manager Server, Assignment Manager Faculty Client and Assignment Manager Student Client.

Assignment Manager was architected up front to support internationalization (or globalization) and unlimited localizations (languages). We began by utilizing dynamic label controls within user interfaces instead of hard-coding English strings.

All string output dynamically pulled from a satellite assembly. A satellite assembly houses translated strings referenced by a code (e.g. LOGIN_INPUT_LABEL = "click here to login"). An assembly exists to house strings for each supported language. In the previous example, the string supports United States English (en-US). To support Spain Spanish (es-ES), the string might resemble "chasque aquí a la conexión". This string would have the same identifier (LOGIN_INPUT_LABEL) as en-US but reside in a separate satellite assembly and obviously have a different value. .Net provides a facility called a ResourceManager to interrogate the target culture / language and retrieve the appropriate string from the associated satellite assembly.

(Note: because Assignment Manager is a product targeted to a single university setting, the language preference is chosen during installation. In contrast, a public web site providing multiple language support would want to expose this as a choice to the browsing user. )

Next, we utilized internationalization-aware formatting for all numeric, currency, and date output. Using the culture / language preference chosen by the end user, the solution leveraged facilities within .Net to output using the correct format. For example, a date of "2/17/2006" within the United States should appear as "17/2/2006" within the UK because they prefer the month appear before the day.

Next, we configured our ASP.Net pages to support Unicode setting their encoding to UTF-8. This enables the browser to support non-ASCII characters such as a Spanish upside down question mark. Or a letter with a tilde mark.

For maintaining dynamic content, we supplied an administrative interface which supported the input and output of Unicode characters. Therefore, regardless of the language or characters input, our ASP.Net facilities and SQL Server backend stored and retrieved content in it's original format. For content such as a new assignment, a professor could enter text using any language / character set and this would be saved into the database. When it came time for a student to retrieve content, that content was simply retrieved from the database and rendered in the browser without modification. If Spanish were input by the administrator, Spanish would output to the student.

To achieve the actual translated content, we utilized a 3rd party firm. This firm maintained resources adept at all the languages we needed to support. We simply shipped them the human-readable list of strings (the en-US satellite assembly) and they would return the list formatted exactly the same but with all strings translated. The strings were then compiled and available for use within the ASP.Net solution.

Finally, once the application was localized and internationalized, we again leveraged a 3rd party firm to review each and every page for each language / culture to ensure content appeared correctly for that language / culture. Because our team possessed at most command of two languages, we would not have known if a particular language / culture was not appearing correctly.

Comments

Popular posts from this blog

Rollback a Ooops in TFS with TFPT Rollback

Rhut roe, Raggie. You just checked in a merge operation affecting 100's of files in TFS against the wrong branch. Ooops. Well, you can simply roll it back, right? Select the folder in Source Control Explorer and...hey, where's the Rollback? Rollback isn't supported in TFS natively. However, it is supported within the Power Tools leveraging the command-line TFPT.exe utility. It's fairly straightforward to revert back to a previous version--with one caveot. First, download and install the Team Foundation Power Tools 2008 on your workstation. Before proceeding, let's create a workspace dedicated to the rollback. To "true up" the workspace, the rollback operation will peform a Get Latest for every file in your current workspace. This can consume hours (and many GB) with a broad workspace mapping. To work around this, I create a temporary workspace targeted at just the area of source I need to roll back. So let's drill down on our scenario... I'm worki...

TFS Reports Out of Date

You may have noticed it takes a while for Team Foundation Server (TFS) reports to reflect changes you've made to work items or builds. Let me guess...about an hour, right? Out of the box, TFS is set to refresh the data warehouse from its transactional store every 60 minutes. How do I change the frequency of the data warehouse refresh? Browse to the TFS Controller Web Service on your TFS application tier server within IE at: http://localhost:8080/Warehouse/v1.0/warehousecontroller.asmx Select the ChangeSetting option Enter RunIntervalSeconds for the settingId and the desired number of seconds for newValue (300 for 5 minutes...5*60) Select Invoke How do I force a data warehouse refresh? Two methods here: either via the above web service or using SQL Server Management Studio. Via the web service: Browse to the TFS Controller Web Service within IE at: http://localhost:8080/Warehouse/v1.0/warehousecontroller.asmx Select the Run option Click Invo...

VSTS 2008 Data-Driven Web Test

During a client demo this afternoon, I mind-blanked on creating a data-driven web test. Sure enough, I stepped out of the client offices and figured it out. Super. But, I think it's counterintuitive enough to outline in a blog post (...trying to make myself feel better ;-). Somewhat in my defense, I was thinking about data-driven unit tests. These, IMO, are easy to implement. Data-driven web tests are a bit more effort and challenging. Create a web test: Right-mouse on your test project selecting Add >> Web Test. Use the browser recorder to capture your web test scenario. Let's assume you're submitting an age and credit rating to an insurance rate calculator...similar to the screen capture below: Create a table or CSV file (comma-delimited...just use Excel and save as CSV) with relevant headings for your inputs and expected values: From Solution Explorer, double-click on your web test. In the main window, right-mouse on your web test selecting Add Data Sou...