Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Extensions / Globalization / ClientCultureInfo.cs / 1407647 / ClientCultureInfo.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Globalization {
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.Text;
using System.Web.Util;
using System.Web.Script.Serialization;
internal class ClientCultureInfo {
private static Hashtable cultureScriptBlockCache = Hashtable.Synchronized(new Hashtable());
private static readonly CultureInfo enUS = CultureInfo.GetCultureInfo(0x409);
private static int eraNumber = 0;
private static int eraName = 1;
private static int eraStart = 2;
private static int eraYearOffset = 3;
public string name;
public NumberFormatInfo numberFormat;
public DateTimeFormatInfo dateTimeFormat;
public object[] eras;
private string _convertScript;
private int _adjustment;
private ClientCultureInfo(CultureInfo cultureInfo) {
name = cultureInfo.Name;
numberFormat = cultureInfo.NumberFormat;
dateTimeFormat = cultureInfo.DateTimeFormat;
var calendar = dateTimeFormat == null ? null : dateTimeFormat.Calendar;
if (calendar != null) {
// Dev10 425049: Support Eras for gregorian based calendars
// with a simple year offset, and non-gregorian calendars.
// Era data is stored in binary resource "culture.nlp" in mscorlib,
// hard coded here for simplicity.
// era array has the following structure:
// [eraNumber1, eraName1, eraStartInTicks1, eraGregorianYearOffset1, eraNumber2, ...]
eras = new object[calendar.Eras.Length * 4];
int i = 0;
foreach (int era in calendar.Eras) {
// era number
eras[i + eraNumber] = era;
// era name
eras[i + eraName] = dateTimeFormat.GetEraName(era);
// calendars with only one era will have a null tick count
// signifying that the era starts from the lowest datetime
// era begining in ticks (null = the oldest era)
// eras[i + eraStart] = null;
// era year offset from normal gregorian year
// some calendars dont have an offset, just a different name
// for the A.D. era (B.C. is not supported by normal calendar,
// so most calendars only have 1 era)
eras[i + eraYearOffset] = 0;
i += 4;
}
var calendarType = calendar.GetType();
if (calendarType != typeof(GregorianCalendar)) {
if (calendarType == typeof(TaiwanCalendar)) {
// Only the current era is supported, so no tick count is needed
//eras[eraStart] = -1830384000000;
eras[eraYearOffset] = 1911;
}
else if (calendarType == typeof(KoreanCalendar)) {
// only one era to speak of, so no tick count is needed
//eras[eraStart] = -62135596800000;
eras[eraYearOffset] = -2333;
}
else if (calendarType == typeof(ThaiBuddhistCalendar)) {
// only one era to speak of, so no tick count is needed
//eras[eraStart] = -62135596800000;
eras[eraYearOffset] = -543;
}
else if (calendarType == typeof(JapaneseCalendar)) {
// there are multiple eras
eras[0 + eraStart] = 60022080000;
eras[0 + eraYearOffset] = 1988;
eras[4 + eraStart] = -1357603200000;
eras[4 + eraYearOffset] = 1925;
eras[8 + eraStart] = -1812153600000;
eras[8 + eraYearOffset] = 1911;
// oldest era is technically from this offset, but for simplicity
// it is counted from the lowest date time, so no tick count needed.
//eras[12 + eraStart] = -3218832000000;
eras[12 + eraYearOffset] = 1867;
}
else if (calendarType == typeof(HijriCalendar)) {
_convertScript = "Date.HijriCalendar.js";
_adjustment = ((HijriCalendar)calendar).HijriAdjustment;
}
else if (calendarType == typeof(UmAlQuraCalendar)) {
_convertScript = "Date.UmAlQuraCalendar.js";
}
// else { other calendars arent supported or have no era offsets just different names for A.D.
}
}
}
internal Pair GetClientCultureScriptBlock() {
return GetClientCultureScriptBlock(CultureInfo.CurrentCulture);
}
internal static Pair GetClientCultureScriptBlock(CultureInfo cultureInfo) {
if (cultureInfo == null) {
return null;
}
// note: DateTimeFormat could be null since it is a virtual property, but DateTimeFormat.Calendar cannot be
Type calendarType = cultureInfo.DateTimeFormat == null ? null : cultureInfo.DateTimeFormat.Calendar.GetType();
if (cultureInfo.Equals(enUS) && (calendarType == typeof(GregorianCalendar))) {
return null;
}
var key = new Pair(cultureInfo, calendarType);
Pair cached = cultureScriptBlockCache[key] as Pair;
if (cached == null) {
ClientCultureInfo clientCultureInfo = new ClientCultureInfo(cultureInfo);
string json = JavaScriptSerializer.SerializeInternal(BuildSerializeableCultureInfo(clientCultureInfo));
if (json.Length > 0) {
string script = "var __cultureInfo = " + json + ";";
if (clientCultureInfo._adjustment != 0) {
script += "\r\n__cultureInfo.dateTimeFormat.Calendar._adjustment = " + clientCultureInfo._adjustment.ToString(CultureInfo.InvariantCulture) + ";";
}
cached = new Pair(script, clientCultureInfo._convertScript);
}
cultureScriptBlockCache[key] = cached;
}
return cached;
}
private static OrderedDictionary BuildSerializeableCultureInfo(ClientCultureInfo clientCultureInfo) {
// It's safe to serialize the values set in the dictionary
// name is a string
// numberFormat is NumberFormatInfo which is a public type
// dateTimeFormat is a DateFormatInfo which is a public type
// eras is an object[] array that only contains strings or numbers
var dictionary = new OrderedDictionary();
dictionary["name"] = clientCultureInfo.name;
dictionary["numberFormat"] = clientCultureInfo.numberFormat;
dictionary["dateTimeFormat"] = clientCultureInfo.dateTimeFormat;
dictionary["eras"] = clientCultureInfo.eras;
return dictionary;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ControlBindingsCollection.cs
- TypedReference.cs
- ApplicationManager.cs
- VirtualizedContainerService.cs
- ProgressiveCrcCalculatingStream.cs
- DataGridViewAdvancedBorderStyle.cs
- CompositeActivityValidator.cs
- MonthCalendarDesigner.cs
- PopupRoot.cs
- JsonWriterDelegator.cs
- RoleGroupCollection.cs
- GroupByQueryOperator.cs
- MetadataArtifactLoader.cs
- XmlnsDictionary.cs
- LocalizableAttribute.cs
- InstancePersistenceEvent.cs
- CallbackDebugElement.cs
- EntityViewGenerator.cs
- InlinedAggregationOperator.cs
- TryExpression.cs
- GeneralTransform3DGroup.cs
- DiscardableAttribute.cs
- XhtmlBasicLinkAdapter.cs
- ScrollItemPatternIdentifiers.cs
- XmlSchemaImport.cs
- DataGridViewCellStyleBuilderDialog.cs
- OletxCommittableTransaction.cs
- TreeSet.cs
- SamlConstants.cs
- EnumDataContract.cs
- TimersDescriptionAttribute.cs
- XNameTypeConverter.cs
- ContainerControl.cs
- DragDrop.cs
- SqlSelectStatement.cs
- RecognizedWordUnit.cs
- Configuration.cs
- SqlDuplicator.cs
- RSAPKCS1KeyExchangeFormatter.cs
- Object.cs
- MetaDataInfo.cs
- HybridCollection.cs
- OuterGlowBitmapEffect.cs
- EncryptedXml.cs
- VisualTreeHelper.cs
- DataObjectFieldAttribute.cs
- HttpModulesSection.cs
- EventDrivenDesigner.cs
- HScrollBar.cs
- TextBlock.cs
- CompoundFileStreamReference.cs
- TableColumnCollection.cs
- DelegateHelpers.cs
- SkinBuilder.cs
- ExecutionEngineException.cs
- NavigationHelper.cs
- TextCompositionManager.cs
- DESCryptoServiceProvider.cs
- ErrorFormatter.cs
- BitmapEffectInput.cs
- SystemIPInterfaceProperties.cs
- ProcessHostConfigUtils.cs
- ObjectDataSourceStatusEventArgs.cs
- ProfileSettings.cs
- WsatEtwTraceListener.cs
- ContractSearchPattern.cs
- SqlClientPermission.cs
- XmlSchemaGroupRef.cs
- BridgeDataReader.cs
- DesignerOptionService.cs
- BindingEntityInfo.cs
- ChainOfDependencies.cs
- PersonalizationProviderHelper.cs
- SiteMapDataSourceDesigner.cs
- ManagementInstaller.cs
- LinkArea.cs
- SimpleWebHandlerParser.cs
- FileFormatException.cs
- FacetEnabledSchemaElement.cs
- MasterPageParser.cs
- BaseProcessor.cs
- TypeListConverter.cs
- RelationshipSet.cs
- PackageFilter.cs
- Hash.cs
- CompiledRegexRunnerFactory.cs
- SafeNativeMethods.cs
- TextSpanModifier.cs
- EventLogEntryCollection.cs
- CssTextWriter.cs
- MDIWindowDialog.cs
- GlyphTypeface.cs
- PenThreadPool.cs
- arabicshape.cs
- XamlRtfConverter.cs
- GZipUtils.cs
- ScrollPatternIdentifiers.cs
- StringToken.cs
- Visual.cs
- FacetValueContainer.cs