diff options
author | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-10-14 11:44:02 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-10-14 11:44:02 -0400 |
commit | 79118316065a01322d8ea12a14589ec016794c32 (patch) | |
tree | 7a26668a66ea0630a2b9367ac820fe7a6d99ac77 /src/StardewModdingAPI/Translation.cs | |
parent | af1a2bde8219c5d4b8660b13702725626a4a5647 (diff) | |
parent | 8aec1eff99858716afe7b8604b512181f78c214f (diff) | |
download | SMAPI-79118316065a01322d8ea12a14589ec016794c32.tar.gz SMAPI-79118316065a01322d8ea12a14589ec016794c32.tar.bz2 SMAPI-79118316065a01322d8ea12a14589ec016794c32.zip |
Merge branch 'develop' into stable
Diffstat (limited to 'src/StardewModdingAPI/Translation.cs')
-rw-r--r-- | src/StardewModdingAPI/Translation.cs | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/src/StardewModdingAPI/Translation.cs b/src/StardewModdingAPI/Translation.cs deleted file mode 100644 index ce344f81..00000000 --- a/src/StardewModdingAPI/Translation.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Text.RegularExpressions; - -namespace StardewModdingAPI -{ - /// <summary>A translation string with a fluent API to customise it.</summary> - public class Translation - { - /********* - ** Properties - *********/ - /// <summary>The placeholder text when the translation is <c>null</c> or empty, where <c>{0}</c> is the translation key.</summary> - internal const string PlaceholderText = "(no translation:{0})"; - - /// <summary>The name of the relevant mod for error messages.</summary> - private readonly string ModName; - - /// <summary>The locale for which the translation was fetched.</summary> - private readonly string Locale; - - /// <summary>The underlying translation text.</summary> - private readonly string Text; - - /// <summary>The value to return if the translations is undefined.</summary> - private readonly string Placeholder; - - - /********* - ** Accessors - *********/ - /// <summary>The original translation key.</summary> - public string Key { get; } - - - /********* - ** Public methods - *********/ - /// <summary>Construct an isntance.</summary> - /// <param name="modName">The name of the relevant mod for error messages.</param> - /// <param name="locale">The locale for which the translation was fetched.</param> - /// <param name="key">The translation key.</param> - /// <param name="text">The underlying translation text.</param> - internal Translation(string modName, string locale, string key, string text) - : this(modName, locale, key, text, string.Format(Translation.PlaceholderText, key)) { } - - /// <summary>Construct an isntance.</summary> - /// <param name="modName">The name of the relevant mod for error messages.</param> - /// <param name="locale">The locale for which the translation was fetched.</param> - /// <param name="key">The translation key.</param> - /// <param name="text">The underlying translation text.</param> - /// <param name="placeholder">The value to return if the translations is undefined.</param> - internal Translation(string modName, string locale, string key, string text, string placeholder) - { - this.ModName = modName; - this.Locale = locale; - this.Key = key; - this.Text = text; - this.Placeholder = placeholder; - } - - /// <summary>Throw an exception if the translation text is <c>null</c> or empty.</summary> - /// <exception cref="KeyNotFoundException">There's no available translation matching the requested key and locale.</exception> - public Translation Assert() - { - if (!this.HasValue()) - throw new KeyNotFoundException($"The '{this.ModName}' mod doesn't have a translation with key '{this.Key}' for the '{this.Locale}' locale or its fallbacks."); - return this; - } - - /// <summary>Replace the text if it's <c>null</c> or empty. If you set a <c>null</c> or empty value, the translation will show the fallback "no translation" placeholder (see <see cref="UsePlaceholder"/> if you want to disable that). Returns a new instance if changed.</summary> - /// <param name="default">The default value.</param> - public Translation Default(string @default) - { - return this.HasValue() - ? this - : new Translation(this.ModName, this.Locale, this.Key, @default); - } - - /// <summary>Whether to return a "no translation" placeholder if the translation is <c>null</c> or empty. Returns a new instance.</summary> - /// <param name="use">Whether to return a placeholder.</param> - public Translation UsePlaceholder(bool use) - { - return new Translation(this.ModName, this.Locale, this.Key, this.Text, use ? string.Format(Translation.PlaceholderText, this.Key) : null); - } - - /// <summary>Replace tokens in the text like <c>{{value}}</c> with the given values. Returns a new instance.</summary> - /// <param name="tokens">An object containing token key/value pairs. This can be an anonymous object (like <c>new { value = 42, name = "Cranberries" }</c>), a dictionary, or a class instance.</param> - /// <exception cref="ArgumentNullException">The <paramref name="tokens"/> argument is <c>null</c>.</exception> - public Translation Tokens(object tokens) - { - if (string.IsNullOrWhiteSpace(this.Text) || tokens == null) - return this; - - // get dictionary of tokens - IDictionary<string, string> tokenLookup = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); - { - // from dictionary - if (tokens is IDictionary inputLookup) - { - foreach (DictionaryEntry entry in inputLookup) - { - string key = entry.Key?.ToString().Trim(); - if (key != null) - tokenLookup[key] = entry.Value?.ToString(); - } - } - - // from object properties - else - { - Type type = tokens.GetType(); - foreach (PropertyInfo prop in type.GetProperties()) - tokenLookup[prop.Name] = prop.GetValue(tokens)?.ToString(); - foreach (FieldInfo field in type.GetFields()) - tokenLookup[field.Name] = field.GetValue(tokens)?.ToString(); - } - } - - // format translation - string text = Regex.Replace(this.Text, @"{{([ \w\.\-]+)}}", match => - { - string key = match.Groups[1].Value.Trim(); - return tokenLookup.TryGetValue(key, out string value) - ? value - : match.Value; - }); - return new Translation(this.ModName, this.Locale, this.Key, text); - } - - /// <summary>Get whether the translation has a defined value.</summary> - public bool HasValue() - { - return !string.IsNullOrEmpty(this.Text); - } - - /// <summary>Get the translation text. Calling this method isn't strictly necessary, since you can assign a <see cref="Translation"/> value directly to a string.</summary> - public override string ToString() - { - return this.Placeholder != null && !this.HasValue() - ? this.Placeholder - : this.Text; - } - - /// <summary>Get a string representation of the given translation.</summary> - /// <param name="translation">The translation key.</param> - public static implicit operator string(Translation translation) - { - return translation?.ToString(); - } - } -} |