Chem guidebook (#17123)
* im good at atomizing. welcome to half-finished chem guides. * wagh * e * save work * aa * woweee UI * finishing the last of it * don't actually update the engine :( --------- Co-authored-by: moonheart08 <moonheart08@users.noreply.github.com>
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Shared.Localizations
|
||||
{
|
||||
@@ -31,13 +34,96 @@ namespace Content.Shared.Localizations
|
||||
_loc.AddFunction(culture, "UNITS", FormatUnits);
|
||||
_loc.AddFunction(culture, "TOSTRING", args => FormatToString(culture, args));
|
||||
_loc.AddFunction(culture, "LOC", FormatLoc);
|
||||
_loc.AddFunction(culture, "NATURALFIXED", FormatNaturalFixed);
|
||||
_loc.AddFunction(culture, "NATURALPERCENT", FormatNaturalPercent);
|
||||
|
||||
|
||||
/*
|
||||
* The following language functions are specific to the english localization. When working on your own
|
||||
* localization you should NOT modify these, instead add new functions specific to your language/culture.
|
||||
* This ensures the english translations continue to work as expected when fallbacks are needed.
|
||||
*/
|
||||
var cultureEn = new CultureInfo("en-US");
|
||||
|
||||
_loc.AddFunction(cultureEn, "MAKEPLURAL", FormatMakePlural);
|
||||
_loc.AddFunction(cultureEn, "MANY", FormatMany);
|
||||
}
|
||||
|
||||
private ILocValue FormatMany(LocArgs args)
|
||||
{
|
||||
var count = ((LocValueNumber) args.Args[1]).Value;
|
||||
|
||||
if (Math.Abs(count - 1) < 0.0001f)
|
||||
{
|
||||
return (LocValueString) args.Args[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
return (LocValueString) FormatMakePlural(args);
|
||||
}
|
||||
}
|
||||
|
||||
private ILocValue FormatNaturalPercent(LocArgs args)
|
||||
{
|
||||
var number = ((LocValueNumber) args.Args[0]).Value * 100;
|
||||
var maxDecimals = (int)Math.Floor(((LocValueNumber) args.Args[1]).Value);
|
||||
var formatter = (NumberFormatInfo)NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo(Culture)).Clone();
|
||||
formatter.NumberDecimalDigits = maxDecimals;
|
||||
return new LocValueString(string.Format(formatter, "{0:N}", number).TrimEnd('0').TrimEnd('.') + "%");
|
||||
}
|
||||
|
||||
private ILocValue FormatNaturalFixed(LocArgs args)
|
||||
{
|
||||
var number = ((LocValueNumber) args.Args[0]).Value;
|
||||
var maxDecimals = (int)Math.Floor(((LocValueNumber) args.Args[1]).Value);
|
||||
var formatter = (NumberFormatInfo)NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo(Culture)).Clone();
|
||||
formatter.NumberDecimalDigits = maxDecimals;
|
||||
return new LocValueString(string.Format(formatter, "{0:N}", number).TrimEnd('0').TrimEnd('.'));
|
||||
}
|
||||
|
||||
private static readonly Regex PluralEsRule = new("^.*(s|sh|ch|x|z)$");
|
||||
|
||||
private ILocValue FormatMakePlural(LocArgs args)
|
||||
{
|
||||
var text = ((LocValueString) args.Args[0]).Value;
|
||||
var split = text.Split(" ", 1);
|
||||
var firstWord = split[0];
|
||||
if (PluralEsRule.IsMatch(firstWord))
|
||||
{
|
||||
if (split.Length == 1)
|
||||
return new LocValueString($"{firstWord}es");
|
||||
else
|
||||
return new LocValueString($"{firstWord}es {split[1]}");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (split.Length == 1)
|
||||
return new LocValueString($"{firstWord}s");
|
||||
else
|
||||
return new LocValueString($"{firstWord}s {split[1]}");
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: allow fluent to take in lists of strings so this can be a format function like it should be.
|
||||
/// <summary>
|
||||
/// Formats a list as per english grammar rules.
|
||||
/// </summary>
|
||||
public static string FormatList(List<string> list)
|
||||
{
|
||||
return list.Count switch
|
||||
{
|
||||
<= 0 => string.Empty,
|
||||
1 => list[0],
|
||||
2 => $"{list[0]} and {list[1]}",
|
||||
> 2 => $"{string.Join(", ", list.GetRange(0, list.Count - 2))}, and {list[^1]}"
|
||||
};
|
||||
}
|
||||
|
||||
private static ILocValue FormatLoc(LocArgs args)
|
||||
{
|
||||
var id = ((LocValueString)args.Args[0]).Value;
|
||||
var id = ((LocValueString) args.Args[0]).Value;
|
||||
|
||||
return new LocValueString(Loc.GetString(id));
|
||||
return new LocValueString(Loc.GetString(id, args.Options.Select(x => (x.Key, x.Value.Value!)).ToArray()));
|
||||
}
|
||||
|
||||
private static ILocValue FormatToString(CultureInfo culture, LocArgs args)
|
||||
@@ -115,8 +201,8 @@ namespace Content.Shared.Localizations
|
||||
//
|
||||
// Note that the closing brace isn't replaced so that format specifiers can be applied.
|
||||
var res = String.Format(
|
||||
fmtstr.Replace("{UNIT", "{" + $"{fargs.Length - 1}"),
|
||||
fargs
|
||||
fmtstr.Replace("{UNIT", "{" + $"{fargs.Length - 1}"),
|
||||
fargs
|
||||
);
|
||||
|
||||
return new LocValueString(res);
|
||||
|
||||
Reference in New Issue
Block a user