SharePoint: Resource-Strings sicher auslesen

Resource-Files sind eine feine Sache. Sie erlauben bekanntermaßen die Lokalisierung eines Projektes, indem sie Satzfetzen in sprachabhängige XML-Dateien (.resx) auslagern und unter einem gemeinsamen Key zugreifbar machen.

Um Strings per C# (serverseitig) aus Resources/MeinSchnuckeligesResourceFile.resx auszulesen, könnte man z.b. eine einfache Methode schreiben:

public static string GetResString(string key)
   {
      // Return the value of a language resource
      // in the current language.
      string str = "$Resources:"+key;
      return SPUtility.GetLocalizedString(str,
                "MeinSchnuckeligesResourceFile",
                (uint) CultureInfo.CurrentUICulture.LCID).Trim();
    }

So weit so gut.
Manchmal kommt es vor dass Kunden oder andere unbedarfte Personen selbst Hand an die Resource-Files legen dürfen, und es kommt auch vor dass Strings Platzhalter der Form {0}, {1}… enthalten, die später mit Werten ersetzt werden. Wenn ein Platzhalter im String referenziert wird, der nicht übergeben wurde fliegt eine Exception. Es wäre also sinnvoll auf das vorhandensein von solchen nicht abgedeckten Platzhaltern zu testen, dafür dient nachfolgende Methode, die im Prinzip wie String.Format() funktioniert, nur dass sie anstatt des strings den Resource-Key übergeben bekommt:

/// <summary>
/// Retuns a formated string. Unse this when the resource string 
/// contains a {0} placeholder. 
/// Returns the unformatted string if a placeholder refers to 
/// a non existent parameter to avoid an exception
/// </summary>
/// <param name="key">the key in resource file</param>
/// <param name="param">params like in string.format</param>
/// <returns>formatted string. in case of an error, unformatted string.</returns>

public static string GetFormatedResString(string key, params object[] arguments)
{
   string result = String.Empty;
   string fmt = GetResString(key);

   // check if format string does not refer to a non-given argument
   // Because we don't want exceptions just because of wrong resource strings
   var matches = from Match match in Regex.Matches(fmt, @"\{([0-9]+)\}")
   select match.Groups[1].Value;

   bool dirty = false;
   foreach (string mat in matches)
   {
      // if {} placeholder refers to an argument which is not there -> dirty
      if (int.Parse(mat) > arguments.Count() - 1)
      {
         dirty = true;
      }
   }

   if (!dirty)
   {
      // return formatted string
      result = String.Format(fmt, arguments);
   }
   else
   {
      // return unformatted string
      result = fmt;
   }
   return result;
}

Keine Rocket-Science, aber manchmal ganz hilfreich.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s