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:
Nemanja
2023-06-04 16:45:02 -04:00
committed by GitHub
parent 1e6dbd0b67
commit b9fb66f005
72 changed files with 1411 additions and 12 deletions

View File

@@ -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);