(32ba1d322) When editing an item label or a room name, the text is colored gray/green according to whether the text can be translated (= if a matching text tag is found in the language files). There's also now a "text picker menu" that can be used to pick the text from a list of translatable texts. TODO: use this in ItemComponent.Msg and CustomInterface button/tickbox labels.
This commit is contained in:
@@ -28,7 +28,7 @@ namespace Barotrauma.Items.Components
|
|||||||
}
|
}
|
||||||
|
|
||||||
private string text;
|
private string text;
|
||||||
[Serialize("", true), Editable(100)]
|
[Serialize("", true, translationTextTag: "Label."), Editable(100)]
|
||||||
public string Text
|
public string Text
|
||||||
{
|
{
|
||||||
get { return text; }
|
get { return text; }
|
||||||
@@ -40,13 +40,20 @@ namespace Barotrauma.Items.Components
|
|||||||
{
|
{
|
||||||
textBlock = null;
|
textBlock = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
text = value;
|
text = value;
|
||||||
TextBlock.Text = value;
|
DisplayText = TextManager.Get(text, returnNull: true) ?? value;
|
||||||
|
TextBlock.Text = DisplayText;
|
||||||
SetScrollingText();
|
SetScrollingText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string DisplayText
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
[Editable, Serialize("0.0,0.0,0.0,1.0", true)]
|
[Editable, Serialize("0.0,0.0,0.0,1.0", true)]
|
||||||
public Color TextColor
|
public Color TextColor
|
||||||
{
|
{
|
||||||
@@ -115,7 +122,7 @@ namespace Barotrauma.Items.Components
|
|||||||
{
|
{
|
||||||
if (!scrollable) return;
|
if (!scrollable) return;
|
||||||
|
|
||||||
float totalWidth = textBlock.Font.MeasureString(text).X;
|
float totalWidth = textBlock.Font.MeasureString(DisplayText).X;
|
||||||
float textAreaWidth = Math.Max(textBlock.Rect.Width - textBlock.Padding.X - textBlock.Padding.Z, 0);
|
float textAreaWidth = Math.Max(textBlock.Rect.Width - textBlock.Padding.X - textBlock.Padding.Z, 0);
|
||||||
if (totalWidth >= textAreaWidth)
|
if (totalWidth >= textAreaWidth)
|
||||||
{
|
{
|
||||||
@@ -123,13 +130,13 @@ namespace Barotrauma.Items.Components
|
|||||||
//(so the text can scroll entirely out of view before we reset it back to start)
|
//(so the text can scroll entirely out of view before we reset it back to start)
|
||||||
needsScrolling = true;
|
needsScrolling = true;
|
||||||
float spaceWidth = textBlock.Font.MeasureChar(' ').X;
|
float spaceWidth = textBlock.Font.MeasureChar(' ').X;
|
||||||
scrollingText = new string(' ', (int)Math.Ceiling(textAreaWidth / spaceWidth)) + text;
|
scrollingText = new string(' ', (int)Math.Ceiling(textAreaWidth / spaceWidth)) + DisplayText;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//whole text can fit in the textblock, no need to scroll
|
//whole text can fit in the textblock, no need to scroll
|
||||||
needsScrolling = false;
|
needsScrolling = false;
|
||||||
scrollingText = text;
|
scrollingText = DisplayText;
|
||||||
scrollAmount = 0.0f;
|
scrollAmount = 0.0f;
|
||||||
scrollIndex = 0;
|
scrollIndex = 0;
|
||||||
return;
|
return;
|
||||||
@@ -145,7 +152,7 @@ namespace Barotrauma.Items.Components
|
|||||||
charWidths[i] = charWidth;
|
charWidths[i] = charWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollIndex = MathHelper.Clamp(scrollIndex, 0, text.Length);
|
scrollIndex = MathHelper.Clamp(scrollIndex, 0, DisplayText.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Update(float deltaTime, Camera cam)
|
public override void Update(float deltaTime, Camera cam)
|
||||||
|
|||||||
@@ -493,12 +493,15 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private GUIComponent CreateStringField(ISerializableEntity entity, SerializableProperty property, string value, string displayName, string toolTip)
|
private GUIComponent CreateStringField(ISerializableEntity entity, SerializableProperty property, string value, string displayName, string toolTip)
|
||||||
{
|
{
|
||||||
var frame = new GUIFrame(new RectTransform(new Point(Rect.Width, elementHeight), layoutGroup.RectTransform), color: Color.Transparent);
|
var frame = new GUILayoutGroup(new RectTransform(new Point(Rect.Width, elementHeight), layoutGroup.RectTransform), isHorizontal: true)
|
||||||
|
{
|
||||||
|
Stretch = true
|
||||||
|
};
|
||||||
var label = new GUITextBlock(new RectTransform(new Vector2(0.4f, 1), frame.RectTransform), displayName, font: GUI.SmallFont, textAlignment: Alignment.Left)
|
var label = new GUITextBlock(new RectTransform(new Vector2(0.4f, 1), frame.RectTransform), displayName, font: GUI.SmallFont, textAlignment: Alignment.Left)
|
||||||
{
|
{
|
||||||
ToolTip = toolTip
|
ToolTip = toolTip
|
||||||
};
|
};
|
||||||
GUITextBox propertyBox = new GUITextBox(new RectTransform(new Vector2(0.6f, 1), frame.RectTransform, Anchor.TopRight))
|
GUITextBox propertyBox = new GUITextBox(new RectTransform(new Vector2(0.6f, 1), frame.RectTransform))
|
||||||
{
|
{
|
||||||
ToolTip = toolTip,
|
ToolTip = toolTip,
|
||||||
Font = GUI.SmallFont,
|
Font = GUI.SmallFont,
|
||||||
@@ -514,6 +517,31 @@ namespace Barotrauma
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
string translationTextTag = property.GetAttribute<Serialize>()?.translationTextTag;
|
||||||
|
if (translationTextTag != null)
|
||||||
|
{
|
||||||
|
new GUIButton(new RectTransform(new Vector2(0.1f, 1), frame.RectTransform, Anchor.TopRight), "...")
|
||||||
|
{
|
||||||
|
OnClicked = (bt, userData) => { CreateTextPicker(translationTextTag, entity, property, propertyBox); return true; }
|
||||||
|
};
|
||||||
|
propertyBox.OnTextChanged += (tb, text) =>
|
||||||
|
{
|
||||||
|
string translatedText = TextManager.Get(text, returnNull: true);
|
||||||
|
if (translatedText == null)
|
||||||
|
{
|
||||||
|
propertyBox.TextColor = Color.Gray;
|
||||||
|
propertyBox.ToolTip = TextManager.Get("StringPropertyCannotTranslate").Replace("[tag]", text ?? "");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
propertyBox.TextColor = Color.LightGreen;
|
||||||
|
propertyBox.ToolTip = TextManager.Get("StringPropertyTranslate").Replace("[translation]", translatedText);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
propertyBox.Text = value;
|
||||||
|
}
|
||||||
|
|
||||||
Fields.Add(property.Name, new GUIComponent[] { propertyBox });
|
Fields.Add(property.Name, new GUIComponent[] { propertyBox });
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
@@ -870,6 +898,40 @@ namespace Barotrauma
|
|||||||
Fields.Add(property.Name, fields);
|
Fields.Add(property.Name, fields);
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CreateTextPicker(string textTag, ISerializableEntity entity, SerializableProperty property, GUITextBox textBox)
|
||||||
|
{
|
||||||
|
var msgBox = new GUIMessageBox("", "", new string[] { TextManager.Get("Cancel") }, width: 300, height: 400);
|
||||||
|
msgBox.Buttons[0].OnClicked = msgBox.Close;
|
||||||
|
|
||||||
|
var textList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.8f), msgBox.Content.RectTransform, Anchor.TopCenter))
|
||||||
|
{
|
||||||
|
OnSelected = (component, userData) =>
|
||||||
|
{
|
||||||
|
string text = userData as string ?? "";
|
||||||
|
|
||||||
|
if (property.TrySetValue(entity, text))
|
||||||
|
{
|
||||||
|
TrySendNetworkUpdate(entity, property);
|
||||||
|
textBox.Text = (string)property.GetValue(entity);
|
||||||
|
textBox.Deselect();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
textTag = textTag.ToLowerInvariant();
|
||||||
|
var tagTextPairs = TextManager.GetAllTagTextPairs();
|
||||||
|
foreach (KeyValuePair<string, string> tagTextPair in tagTextPairs)
|
||||||
|
{
|
||||||
|
if (!tagTextPair.Key.StartsWith(textTag)) { continue; }
|
||||||
|
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), textList.Content.RectTransform) { MinSize = new Point(0, 20) },
|
||||||
|
ToolBox.LimitString(tagTextPair.Value, GUI.Font, textList.Content.Rect.Width))
|
||||||
|
{
|
||||||
|
UserData = tagTextPair.Key
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void TrySendNetworkUpdate(ISerializableEntity entity, SerializableProperty property)
|
private void TrySendNetworkUpdate(ISerializableEntity entity, SerializableProperty property)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -109,6 +109,25 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string DisplayName
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string roomName;
|
||||||
|
[Editable, Serialize("", true, translationTextTag: "RoomName.")]
|
||||||
|
public string RoomName
|
||||||
|
{
|
||||||
|
get { return roomName; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (roomName == value) { return; }
|
||||||
|
roomName = value;
|
||||||
|
DisplayName = TextManager.Get(roomName, returnNull: true) ?? roomName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override Rectangle Rect
|
public override Rectangle Rect
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|||||||
@@ -55,11 +55,20 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
public object defaultValue;
|
public object defaultValue;
|
||||||
public bool isSaveable;
|
public bool isSaveable;
|
||||||
|
public string translationTextTag;
|
||||||
|
|
||||||
public Serialize(object defaultValue, bool isSaveable)
|
/// <summary>
|
||||||
|
/// Makes the property serializable to/from XML
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="defaultValue">The property is set to this value during deserialization if the value is not defined in XML.</param>
|
||||||
|
/// <param name="isSaveable">Is the value saved to XML when serializing.</param>
|
||||||
|
/// <param name="translationTextTag">If set to anything else than null, SerializableEntityEditors will show what the text gets translated to or warn if the text is not found in the language files.
|
||||||
|
/// Setting the value to a non-empty string will let the user select the text from one whose tag starts with the given string (e.g. RoomName. would show all texts with a RoomName.* tag)</param>
|
||||||
|
public Serialize(object defaultValue, bool isSaveable, string translationTextTag = null)
|
||||||
{
|
{
|
||||||
this.defaultValue = defaultValue;
|
this.defaultValue = defaultValue;
|
||||||
this.isSaveable = isSaveable;
|
this.isSaveable = isSaveable;
|
||||||
|
this.translationTextTag = translationTextTag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -252,6 +252,28 @@ namespace Barotrauma
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<KeyValuePair<string, string>> GetAllTagTextPairs()
|
||||||
|
{
|
||||||
|
if (!textPacks.ContainsKey(Language))
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("No text packs available for the selected language (" + Language + ")! Switching to English...");
|
||||||
|
Language = "English";
|
||||||
|
if (!textPacks.ContainsKey(Language))
|
||||||
|
{
|
||||||
|
throw new Exception("No text packs available in English!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<KeyValuePair<string, string>> allText = new List<KeyValuePair<string, string>>();
|
||||||
|
|
||||||
|
foreach (TextPack textPack in textPacks[Language])
|
||||||
|
{
|
||||||
|
allText.AddRange(textPack.GetAllTagTextPairs());
|
||||||
|
}
|
||||||
|
|
||||||
|
return allText;
|
||||||
|
}
|
||||||
|
|
||||||
public static string ReplaceGenderPronouns(string text, Gender gender)
|
public static string ReplaceGenderPronouns(string text, Gender gender)
|
||||||
{
|
{
|
||||||
if (gender == Gender.Male)
|
if (gender == Gender.Male)
|
||||||
|
|||||||
@@ -62,6 +62,20 @@ namespace Barotrauma
|
|||||||
return textList;
|
return textList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<KeyValuePair<string, string>> GetAllTagTextPairs()
|
||||||
|
{
|
||||||
|
var pairs = new List<KeyValuePair<string, string>>();
|
||||||
|
foreach (KeyValuePair<string, List<string>> kvp in texts)
|
||||||
|
{
|
||||||
|
foreach (string line in kvp.Value)
|
||||||
|
{
|
||||||
|
pairs.Add(new KeyValuePair<string, string>(kvp.Key, line));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pairs;
|
||||||
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
public void CheckForDuplicates(int index)
|
public void CheckForDuplicates(int index)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user