Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / MS / Internal / TextFormatting / CultureMapper.cs / 1 / CultureMapper.cs
//------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Description: The CultureMapper class implements static methods for mapping
// CultureInfo objects from WPF clients to CultureInfo objects
// that can be used internally by text formatting code.
//
// History:
// 1-30-2006 : niklasb - Created
//
//-----------------------------------------------------------------------
using System;
using System.Globalization;
using System.Diagnostics;
using MS.Internal.PresentationCore;
namespace MS.Internal.TextFormatting
{
///
/// Implements static methods for mapping CultureInfo objects.
///
internal static class CultureMapper
{
///
/// Returns a specific culture given an arbitrary CultureInfo, which may be null, the invariant
/// culture, or a neutral culture.
///
public static CultureInfo GetSpecificCulture(CultureInfo runCulture)
{
// Assume default culture unless we can do better.
CultureInfo specificCulture = DefaultTextCulture;
if (runCulture != null)
{
// Assign _cachedCultureMap to a local variable for thread safety. The reference assignment
// is atomic and the CachedCultureMap class is immutable.
CachedCultureMap cachedCultureMap = _cachedCultureMap;
if (cachedCultureMap != null && object.ReferenceEquals(cachedCultureMap.OriginalCulture, runCulture))
return cachedCultureMap.SpecificCulture;
// Unfortunately we cannot use reference comparison here because, for example, new CultureInfo("")
// creates an invariant culture which (being a new object) is obviously not the same instance as
// CultureInfo.InvariantCulture.
if (runCulture != CultureInfo.InvariantCulture)
{
if (!runCulture.IsNeutralCulture)
{
// It's already a specific culture (neither neutral nor InvariantCulture)
specificCulture = runCulture;
}
else
{
// Get the culture name. Note that the string expected by CreateSpecificCulture corresponds
// to the Name property, not IetfLanguageTag, so that's what we use.
string cultureName = runCulture.Name;
if (!string.IsNullOrEmpty(cultureName))
{
try
{
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
specificCulture = SafeSecurityHelper.GetCultureInfoByIetfLanguageTag(culture.IetfLanguageTag);
}
catch (ArgumentException)
{
// This exception occurs if the culture name is invalid or has no corresponding specific
// culture. we can safely ignore the exception and fall back to DefaultTextCulture.
specificCulture = DefaultTextCulture;
}
}
}
}
// Save the mapping so the next call will be fast if we're given the same runCulture.
// Again, the reference assignment is atomic so this is thread safe.
_cachedCultureMap = new CachedCultureMap(runCulture, specificCulture);
}
return specificCulture;
}
private class CachedCultureMap
{
public CachedCultureMap(CultureInfo originalCulture, CultureInfo specificCulture)
{
_originalCulture = originalCulture;
_specificCulture = specificCulture;
}
///
/// Original CultureInfo object from text formatting client; could be the invariant culture,
/// a neutral culture, or a specific culture.
///
public CultureInfo OriginalCulture
{
get { return _originalCulture; }
}
///
/// CultureInfo object to use for text formatting. This is guaranteed to be a specific (i.e.,
/// neither neutral nor invariant) culture. It may be the same object as OriginalCulture if
/// the latter is already a specific culture.
///
public CultureInfo SpecificCulture
{
get { return _specificCulture; }
}
private CultureInfo _originalCulture;
private CultureInfo _specificCulture;
}
private static readonly CultureInfo DefaultTextCulture = CultureInfo.GetCultureInfoByIetfLanguageTag("en-US");
private static CachedCultureMap _cachedCultureMap = null;
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Description: The CultureMapper class implements static methods for mapping
// CultureInfo objects from WPF clients to CultureInfo objects
// that can be used internally by text formatting code.
//
// History:
// 1-30-2006 : niklasb - Created
//
//-----------------------------------------------------------------------
using System;
using System.Globalization;
using System.Diagnostics;
using MS.Internal.PresentationCore;
namespace MS.Internal.TextFormatting
{
///
/// Implements static methods for mapping CultureInfo objects.
///
internal static class CultureMapper
{
///
/// Returns a specific culture given an arbitrary CultureInfo, which may be null, the invariant
/// culture, or a neutral culture.
///
public static CultureInfo GetSpecificCulture(CultureInfo runCulture)
{
// Assume default culture unless we can do better.
CultureInfo specificCulture = DefaultTextCulture;
if (runCulture != null)
{
// Assign _cachedCultureMap to a local variable for thread safety. The reference assignment
// is atomic and the CachedCultureMap class is immutable.
CachedCultureMap cachedCultureMap = _cachedCultureMap;
if (cachedCultureMap != null && object.ReferenceEquals(cachedCultureMap.OriginalCulture, runCulture))
return cachedCultureMap.SpecificCulture;
// Unfortunately we cannot use reference comparison here because, for example, new CultureInfo("")
// creates an invariant culture which (being a new object) is obviously not the same instance as
// CultureInfo.InvariantCulture.
if (runCulture != CultureInfo.InvariantCulture)
{
if (!runCulture.IsNeutralCulture)
{
// It's already a specific culture (neither neutral nor InvariantCulture)
specificCulture = runCulture;
}
else
{
// Get the culture name. Note that the string expected by CreateSpecificCulture corresponds
// to the Name property, not IetfLanguageTag, so that's what we use.
string cultureName = runCulture.Name;
if (!string.IsNullOrEmpty(cultureName))
{
try
{
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
specificCulture = SafeSecurityHelper.GetCultureInfoByIetfLanguageTag(culture.IetfLanguageTag);
}
catch (ArgumentException)
{
// This exception occurs if the culture name is invalid or has no corresponding specific
// culture. we can safely ignore the exception and fall back to DefaultTextCulture.
specificCulture = DefaultTextCulture;
}
}
}
}
// Save the mapping so the next call will be fast if we're given the same runCulture.
// Again, the reference assignment is atomic so this is thread safe.
_cachedCultureMap = new CachedCultureMap(runCulture, specificCulture);
}
return specificCulture;
}
private class CachedCultureMap
{
public CachedCultureMap(CultureInfo originalCulture, CultureInfo specificCulture)
{
_originalCulture = originalCulture;
_specificCulture = specificCulture;
}
///
/// Original CultureInfo object from text formatting client; could be the invariant culture,
/// a neutral culture, or a specific culture.
///
public CultureInfo OriginalCulture
{
get { return _originalCulture; }
}
///
/// CultureInfo object to use for text formatting. This is guaranteed to be a specific (i.e.,
/// neither neutral nor invariant) culture. It may be the same object as OriginalCulture if
/// the latter is already a specific culture.
///
public CultureInfo SpecificCulture
{
get { return _specificCulture; }
}
private CultureInfo _originalCulture;
private CultureInfo _specificCulture;
}
private static readonly CultureInfo DefaultTextCulture = CultureInfo.GetCultureInfoByIetfLanguageTag("en-US");
private static CachedCultureMap _cachedCultureMap = null;
}
}
// 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
- DesignerVerbCollection.cs
- FixedHighlight.cs
- QueryStringParameter.cs
- CultureInfoConverter.cs
- TextServicesCompartmentEventSink.cs
- EventArgs.cs
- EmptyEnumerator.cs
- DrawingContext.cs
- EllipticalNodeOperations.cs
- ImageAttributes.cs
- SimpleBitVector32.cs
- EncodingTable.cs
- ZipIOExtraFieldZip64Element.cs
- ExpressionWriter.cs
- CommonDialog.cs
- ProfilePropertySettings.cs
- HashAlgorithm.cs
- CuspData.cs
- FontUnitConverter.cs
- arabicshape.cs
- TextBoxBase.cs
- ToolboxItemLoader.cs
- OnOperation.cs
- ReaderWriterLock.cs
- CodeTypeReferenceExpression.cs
- MatrixTransform.cs
- CodeParameterDeclarationExpression.cs
- ExtendedProperty.cs
- ValidationSummary.cs
- XmlMemberMapping.cs
- SymLanguageVendor.cs
- ValidationResult.cs
- GeneralTransform3DTo2D.cs
- DataGridViewRowsRemovedEventArgs.cs
- PrivilegeNotHeldException.cs
- SqlMetaData.cs
- RenderCapability.cs
- InputLangChangeEvent.cs
- SymbolEqualComparer.cs
- DBCSCodePageEncoding.cs
- ColorTransformHelper.cs
- VectorConverter.cs
- HttpCachePolicy.cs
- CommonGetThemePartSize.cs
- PenLineJoinValidation.cs
- ConfigurationElement.cs
- SmtpAuthenticationManager.cs
- SystemTcpConnection.cs
- TextProviderWrapper.cs
- DocumentPageView.cs
- ContainerUtilities.cs
- ToolStripItemRenderEventArgs.cs
- ResourceProviderFactory.cs
- ArgIterator.cs
- _LocalDataStoreMgr.cs
- XmlExtensionFunction.cs
- DispatcherHookEventArgs.cs
- StringWriter.cs
- Errors.cs
- XmlIgnoreAttribute.cs
- assertwrapper.cs
- StackSpiller.Generated.cs
- XmlSerializerNamespaces.cs
- StatusBarAutomationPeer.cs
- SqlConnectionPoolGroupProviderInfo.cs
- SrgsElement.cs
- Math.cs
- Columns.cs
- HttpEncoderUtility.cs
- __Filters.cs
- MarginCollapsingState.cs
- InstanceLockQueryResult.cs
- TimeSpanParse.cs
- Events.cs
- ListViewGroupItemCollection.cs
- PresentationSource.cs
- RenameRuleObjectDialog.cs
- RemoteWebConfigurationHostStream.cs
- ActivityWithResultValueSerializer.cs
- UIElementCollection.cs
- CalendarSelectionChangedEventArgs.cs
- ContainerUIElement3D.cs
- DataGridViewAutoSizeModeEventArgs.cs
- ExpressionVisitor.cs
- NamespaceEmitter.cs
- NonClientArea.cs
- NamedPipeProcessProtocolHandler.cs
- DefinitionBase.cs
- UIElement3D.cs
- SendActivityEventArgs.cs
- TableLayoutStyle.cs
- TextBoxBaseDesigner.cs
- TimeSpanValidator.cs
- ClusterUtils.cs
- CompositeDataBoundControl.cs
- FacetValueContainer.cs
- SimpleLine.cs
- ResXBuildProvider.cs
- ObjectDataSourceStatusEventArgs.cs
- Window.cs