2
0

ResourceFallbackManager.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. /*============================================================
  5. **
  6. **
  7. **
  8. **
  9. **
  10. ** Purpose: Encapsulates CultureInfo fallback for resource
  11. ** lookup
  12. **
  13. **
  14. ===========================================================*/
  15. using System.Collections;
  16. using System.Collections.Generic;
  17. using System.Globalization;
  18. namespace System.Resources
  19. {
  20. internal class ResourceFallbackManager : IEnumerable<CultureInfo>
  21. {
  22. private readonly CultureInfo m_startingCulture;
  23. private readonly CultureInfo? m_neutralResourcesCulture;
  24. private readonly bool m_useParents;
  25. internal ResourceFallbackManager(CultureInfo? startingCulture, CultureInfo? neutralResourcesCulture, bool useParents)
  26. {
  27. if (startingCulture != null)
  28. {
  29. m_startingCulture = startingCulture;
  30. }
  31. else
  32. {
  33. m_startingCulture = CultureInfo.CurrentUICulture;
  34. }
  35. m_neutralResourcesCulture = neutralResourcesCulture;
  36. m_useParents = useParents;
  37. }
  38. IEnumerator IEnumerable.GetEnumerator()
  39. {
  40. return GetEnumerator();
  41. }
  42. // WARING: This function must be kept in sync with ResourceManager.GetFirstResourceSet()
  43. public IEnumerator<CultureInfo> GetEnumerator()
  44. {
  45. bool reachedNeutralResourcesCulture = false;
  46. // 1. starting culture chain, up to neutral
  47. CultureInfo currentCulture = m_startingCulture;
  48. do
  49. {
  50. if (m_neutralResourcesCulture != null && currentCulture.Name == m_neutralResourcesCulture.Name)
  51. {
  52. // Return the invariant culture all the time, even if the UltimateResourceFallbackLocation
  53. // is a satellite assembly. This is fixed up later in ManifestBasedResourceGroveler::UltimateFallbackFixup.
  54. yield return CultureInfo.InvariantCulture;
  55. reachedNeutralResourcesCulture = true;
  56. break;
  57. }
  58. yield return currentCulture;
  59. currentCulture = currentCulture.Parent;
  60. } while (m_useParents && !currentCulture.HasInvariantCultureName);
  61. if (!m_useParents || m_startingCulture.HasInvariantCultureName)
  62. {
  63. yield break;
  64. }
  65. // 2. invariant
  66. // Don't return invariant twice though.
  67. if (reachedNeutralResourcesCulture)
  68. yield break;
  69. yield return CultureInfo.InvariantCulture;
  70. }
  71. }
  72. }