Compare commits
13
Commits
v2.0.1
..
7d0698de69
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d0698de69 | ||
|
|
c1d6ca3bbd | ||
|
|
4ab9202533 | ||
|
|
5e15d34eeb | ||
|
|
b9feb8650f | ||
|
|
0f9858a3d3 | ||
|
|
a3379818eb | ||
|
|
d5c7db9f43 | ||
|
|
6e24885241 | ||
|
|
16730d5ed9 | ||
|
|
39e2d91288 | ||
|
|
3309386fbe | ||
|
|
38c6707970 |
@@ -174,28 +174,43 @@ jobs:
|
|||||||
api="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}"
|
api="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}"
|
||||||
auth="Authorization: token ${GITEA_TOKEN}"
|
auth="Authorization: token ${GITEA_TOKEN}"
|
||||||
|
|
||||||
# Existing release for this tag, or create one.
|
# Responses land in a file before anything reads them, rather than
|
||||||
rel_id="$(curl -sf -H "$auth" "$api/releases/tags/${TAG_NAME}" \
|
# being piped straight into an interpreter. The interpreter is inline
|
||||||
| python3 -c 'import sys,json; print(json.load(sys.stdin).get("id",""))' 2>/dev/null || true)"
|
# either way and the server only ever supplies data, but a scanner
|
||||||
|
# cannot tell those apart from curl-pipe-shell -- and holding the
|
||||||
|
# response makes it inspectable when a call misbehaves.
|
||||||
|
get_release_id() {
|
||||||
|
if curl -sf -H "$auth" "$api/releases/tags/${TAG_NAME}" -o release.json; then
|
||||||
|
python3 -c 'import json; print(json.load(open("release.json")).get("id",""))'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
rel_id="$(get_release_id || true)"
|
||||||
|
|
||||||
if [ -z "$rel_id" ]; then
|
if [ -z "$rel_id" ]; then
|
||||||
payload="$(python3 -c '
|
python3 - <<'PYCREATE' > create.json
|
||||||
import json, os, sys
|
import json, os
|
||||||
body = open("release-body.md", encoding="utf-8").read()
|
body = open("release-body.md", encoding="utf-8").read()
|
||||||
json.dump({"tag_name": os.environ["TAG_NAME"], "name": os.environ["TAG_NAME"],
|
print(json.dumps({
|
||||||
"body": body, "draft": False, "prerelease": False}, sys.stdout)
|
"tag_name": os.environ["TAG_NAME"],
|
||||||
')"
|
"name": os.environ["TAG_NAME"],
|
||||||
rel_id="$(printf '%s' "$payload" \
|
"body": body,
|
||||||
| curl -sf -X POST -H "$auth" -H "Content-Type: application/json" -d @- "$api/releases" \
|
"draft": False,
|
||||||
| python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])')"
|
"prerelease": False,
|
||||||
|
}))
|
||||||
|
PYCREATE
|
||||||
|
curl -sf -X POST -H "$auth" -H "Content-Type: application/json" \
|
||||||
|
-d @create.json "$api/releases" -o created.json
|
||||||
|
rel_id="$(python3 -c 'import json; print(json.load(open("created.json"))["id"])')"
|
||||||
echo "Created release $rel_id for ${TAG_NAME}"
|
echo "Created release $rel_id for ${TAG_NAME}"
|
||||||
else
|
else
|
||||||
echo "Reusing release $rel_id for ${TAG_NAME}"
|
echo "Reusing release $rel_id for ${TAG_NAME}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Drop a same-named asset from an earlier attempt, or the upload 409s.
|
# A same-named asset from an earlier attempt has to go, or the upload
|
||||||
old_id="$(curl -sf -H "$auth" "$api/releases/${rel_id}/assets" \
|
# collides with it. This is the state a recovery run finds.
|
||||||
| python3 -c 'import sys,json; print(next((a["id"] for a in json.load(sys.stdin) if a["name"]=="latest.zip"), ""))' 2>/dev/null || true)"
|
curl -sf -H "$auth" "$api/releases/${rel_id}/assets" -o assets.json
|
||||||
|
old_id="$(python3 -c 'import json; print(next((a["id"] for a in json.load(open("assets.json")) if a["name"]=="latest.zip"), ""))')"
|
||||||
if [ -n "$old_id" ]; then
|
if [ -n "$old_id" ]; then
|
||||||
curl -sf -X DELETE -H "$auth" "$api/releases/${rel_id}/assets/${old_id}"
|
curl -sf -X DELETE -H "$auth" "$api/releases/${rel_id}/assets/${old_id}"
|
||||||
echo "Replaced existing latest.zip (asset $old_id)"
|
echo "Replaced existing latest.zip (asset $old_id)"
|
||||||
@@ -203,5 +218,5 @@ jobs:
|
|||||||
|
|
||||||
curl -sf -X POST -H "$auth" \
|
curl -sf -X POST -H "$auth" \
|
||||||
-F "attachment=@${ZIP_PATH};filename=latest.zip" \
|
-F "attachment=@${ZIP_PATH};filename=latest.zip" \
|
||||||
"$api/releases/${rel_id}/assets?name=latest.zip" \
|
"$api/releases/${rel_id}/assets?name=latest.zip" -o uploaded.json
|
||||||
| python3 -c 'import sys,json; a=json.load(sys.stdin); print("Attached", a["name"], a["size"], "bytes")'
|
python3 -c 'import json; a=json.load(open("uploaded.json")); print("Attached", a["name"], a["size"], "bytes")'
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
subtitle: "Emotes raus, Platzhalter gefixt"
|
||||||
|
versionsnatur: "Aufräum-Release"
|
||||||
|
---
|
||||||
|
- **BetterTTV-Emotes sind raus.** Der Endpunkt für geteilte Emotes liegt hinter einer Anmeldung, und von dort kam fast alles. Übrig blieben 54 überwiegend statische Bilder aus der Twitch-Frühzeit, davon genau eines animiert, und das wollte 492 Einzelbilder und 37 MB Grafikspeicher. Das Plugin macht jetzt **gar keine ausgehenden Netzwerkaufrufe** mehr. Gespeicherte Nachrichten mit Emotes bleiben lesbar und zeigen den getippten Code.
|
||||||
|
- **Fünf Beschreibungen im Fenster-Tab zeigten `{0}` statt des Plugin-Namens.** Betroffen waren alle 25 Sprachen, im Deutschen fiel es zuerst auf, weil der Platzhalter dort am Satzanfang steht. Ein Test prüft das jetzt dauerhaft.
|
||||||
|
- **Neue Vorschaubilder** im Plugin-Installer. Die alten waren vom 8. Mai und zeigten die Oberfläche vor dem Umbau.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
subtitle: "Kontextmenü in Pop-outs, Screenshot-Modus"
|
||||||
|
versionsnatur: "Fehlerbehebung"
|
||||||
|
---
|
||||||
|
- **Das Kontextmenü ging in Pop-out-Fenstern nicht auf.** Ein Rechtsklick auf einen Namen oder ein Item hat dort schlicht nichts gemacht. Alle Chat-Flächen teilen sich einen Popup-Zustand, und das zuerst gezeichnete Fenster hat das Menü verworfen, bevor das Pop-out überhaupt an der Reihe war. Das Menü bleibt jetzt bei dem Fenster, aus dem der Klick kam.
|
||||||
|
- **Der Screenshot-Modus ließ sich nicht ausschalten.** Er wird gespeichert, aber keiner der beiden Schalter hat die Änderung in die Konfiguration geschrieben. Einmal gespeichert kam er bei jedem Laden des Plugins wieder. Beide Schalter speichern jetzt. Wer ihn gerade festhängen hat, klickt ihn einmal aus.
|
||||||
|
- **Vom Spiel eingefärbter Text konnte unsichtbar werden.** Manche dieser Farben kommen ohne Alpha-Byte an und wurden beim Umsortieren vollständig transparent.
|
||||||
@@ -244,8 +244,6 @@ public class Configuration : IPluginConfiguration
|
|||||||
public bool NotifyPluginDisclosure = true;
|
public bool NotifyPluginDisclosure = true;
|
||||||
public bool KeepInputFocus = true;
|
public bool KeepInputFocus = true;
|
||||||
public bool Use24HourClock = true;
|
public bool Use24HourClock = true;
|
||||||
public bool ShowEmotes = true;
|
|
||||||
public HashSet<string> BlockedEmotes = [];
|
|
||||||
public bool FontsEnabled = true;
|
public bool FontsEnabled = true;
|
||||||
public ExtraGlyphRanges ExtraGlyphRanges = 0;
|
public ExtraGlyphRanges ExtraGlyphRanges = 0;
|
||||||
public float FontSizeV2 = 12.75f;
|
public float FontSizeV2 = 12.75f;
|
||||||
|
|||||||
@@ -1,445 +0,0 @@
|
|||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Numerics;
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
using Dalamud.Bindings.ImGui;
|
|
||||||
using Dalamud.Interface.Textures;
|
|
||||||
using Dalamud.Interface.Textures.TextureWraps;
|
|
||||||
using Dalamud.Utility;
|
|
||||||
using SixLabors.ImageSharp;
|
|
||||||
using SixLabors.ImageSharp.PixelFormats;
|
|
||||||
|
|
||||||
namespace HellionChat;
|
|
||||||
|
|
||||||
public static class EmoteCache
|
|
||||||
{
|
|
||||||
private static readonly string[] NotWorking =
|
|
||||||
[
|
|
||||||
":tf:",
|
|
||||||
"(ditto)",
|
|
||||||
"c!",
|
|
||||||
"h!",
|
|
||||||
"l!",
|
|
||||||
"M&Mjc",
|
|
||||||
"LUL3D",
|
|
||||||
"p!",
|
|
||||||
"POLICE2",
|
|
||||||
"r!",
|
|
||||||
"Pussy",
|
|
||||||
"s!",
|
|
||||||
"v!",
|
|
||||||
"w!",
|
|
||||||
"x0r6ztGiggle",
|
|
||||||
"z!",
|
|
||||||
"xar2EDM",
|
|
||||||
"iron95Pls",
|
|
||||||
"Clap2",
|
|
||||||
"AlienPls3",
|
|
||||||
"Life",
|
|
||||||
"peepoPogClimbingTreeHard4House",
|
|
||||||
"monkaGIGAftRobertDowneyJr",
|
|
||||||
"DogLookingSussyAndCold",
|
|
||||||
"DICKS",
|
|
||||||
];
|
|
||||||
|
|
||||||
private static readonly HttpClient Client = new();
|
|
||||||
|
|
||||||
private const string BetterTTV = "https://api.betterttv.net/3";
|
|
||||||
private const string GlobalEmotes = $"{BetterTTV}/cached/emotes/global";
|
|
||||||
private const string Top100Emotes = "{0}/emotes/shared/top?before={1}&limit=100";
|
|
||||||
private const string EmotePath = "https://cdn.betterttv.net/emote/{0}/3x";
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
private struct Top100()
|
|
||||||
{
|
|
||||||
[JsonPropertyName("emote")]
|
|
||||||
public Emote Emote { get; set; }
|
|
||||||
|
|
||||||
[JsonPropertyName("id")]
|
|
||||||
public required string Id { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public struct Emote()
|
|
||||||
{
|
|
||||||
[JsonPropertyName("id")]
|
|
||||||
public required string Id { get; set; }
|
|
||||||
|
|
||||||
[JsonPropertyName("code")]
|
|
||||||
public required string Code { get; set; }
|
|
||||||
|
|
||||||
[JsonPropertyName("imageType")]
|
|
||||||
public required string ImageType { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum LoadingState
|
|
||||||
{
|
|
||||||
Unloaded,
|
|
||||||
Loading,
|
|
||||||
Done,
|
|
||||||
}
|
|
||||||
|
|
||||||
// All fields below are uninitialised while State != Done.
|
|
||||||
public static LoadingState State = LoadingState.Unloaded;
|
|
||||||
|
|
||||||
private static readonly Dictionary<string, Emote> Cache = new();
|
|
||||||
private static readonly Dictionary<string, EmoteBase> EmoteImages = new();
|
|
||||||
|
|
||||||
public static string[] SortedCodeArray = [];
|
|
||||||
|
|
||||||
// Cancelled on Dispose to stop in-flight downloads; replaced on re-enable.
|
|
||||||
private static CancellationTokenSource Cts = new();
|
|
||||||
internal static CancellationToken Token => Cts.Token;
|
|
||||||
|
|
||||||
// Tracks in-flight loads so Dispose can drain them before teardown.
|
|
||||||
private static readonly ConcurrentBag<Task> PendingLoads = new();
|
|
||||||
|
|
||||||
internal static void TrackLoad(Task loadTask, string emoteCode)
|
|
||||||
{
|
|
||||||
PendingLoads.Add(
|
|
||||||
loadTask.ContinueWith(
|
|
||||||
t =>
|
|
||||||
{
|
|
||||||
if (t.IsFaulted)
|
|
||||||
Plugin.LogProxy.Error(
|
|
||||||
t.Exception!,
|
|
||||||
$"EmoteCache load failed for {emoteCode}"
|
|
||||||
);
|
|
||||||
},
|
|
||||||
TaskScheduler.Default
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task LoadData()
|
|
||||||
{
|
|
||||||
if (State is not LoadingState.Unloaded)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Reset CTS if Dispose was called and the plugin is being re-enabled.
|
|
||||||
if (Cts.IsCancellationRequested)
|
|
||||||
Cts = new CancellationTokenSource();
|
|
||||||
|
|
||||||
State = LoadingState.Loading;
|
|
||||||
var ct = Cts.Token;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var global = await Client.GetAsync(GlobalEmotes, ct);
|
|
||||||
if (!global.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
// Nothing usable at all -- let the catch below reset to Unloaded
|
|
||||||
// so a later trigger can retry.
|
|
||||||
throw new HttpRequestException(
|
|
||||||
$"BetterTTV global emotes returned {(int)global.StatusCode}."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
var globalList = await global.Content.ReadAsStringAsync(ct);
|
|
||||||
|
|
||||||
foreach (var emote in JsonSerializer.Deserialize<Emote[]>(globalList)!)
|
|
||||||
if (!string.IsNullOrEmpty(emote.Code) && !NotWorking.Contains(emote.Code))
|
|
||||||
Cache.TryAdd(emote.Code, emote);
|
|
||||||
|
|
||||||
var lastId = string.Empty;
|
|
||||||
for (var i = 0; i < 15; i++)
|
|
||||||
{
|
|
||||||
var top = await Client.GetAsync(Top100Emotes.Format(BetterTTV, lastId), ct);
|
|
||||||
|
|
||||||
// The shared-emote endpoint went behind authentication and now
|
|
||||||
// answers 403 with a JSON object. Deserializing that as a list
|
|
||||||
// threw on every single start, and took the global emotes -- which
|
|
||||||
// still work -- down with it. The global set is the useful half
|
|
||||||
// anyway, so a failure here stops paging instead of the load.
|
|
||||||
if (!top.IsSuccessStatusCode)
|
|
||||||
{
|
|
||||||
Plugin.LogProxy.Warning(
|
|
||||||
$"BetterTTV shared emotes unavailable ({(int)top.StatusCode}); "
|
|
||||||
+ "continuing with global emotes only."
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var topList = await top.Content.ReadAsStringAsync(ct);
|
|
||||||
|
|
||||||
var jsonList = JsonSerializer.Deserialize<List<Top100>>(topList);
|
|
||||||
if (jsonList is not { Count: > 0 })
|
|
||||||
break;
|
|
||||||
|
|
||||||
// BetterTTV occasionally returns entries with a null Code;
|
|
||||||
// skip them so a single bad row doesn't break the whole cache.
|
|
||||||
foreach (var emote in jsonList)
|
|
||||||
if (
|
|
||||||
!string.IsNullOrEmpty(emote.Emote.Code)
|
|
||||||
&& !NotWorking.Contains(emote.Emote.Code)
|
|
||||||
)
|
|
||||||
Cache.TryAdd(emote.Emote.Code, emote.Emote);
|
|
||||||
|
|
||||||
lastId = jsonList[^1].Id;
|
|
||||||
}
|
|
||||||
|
|
||||||
SortedCodeArray = Cache.Keys.Order().ToArray();
|
|
||||||
State = LoadingState.Done;
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// Plugin disposed mid-load; State stays on Loading so re-enable can retry.
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// Reset to Unloaded so a later trigger can retry without a plugin reload.
|
|
||||||
State = LoadingState.Unloaded;
|
|
||||||
Plugin.LogProxy.Error(ex, "BetterTTV cache wasn't initialized");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Dispose()
|
|
||||||
{
|
|
||||||
Cts.Cancel();
|
|
||||||
|
|
||||||
// 5s upper bound; anything still running gets abandoned.
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Task.WaitAll(PendingLoads.ToArray(), TimeSpan.FromSeconds(5));
|
|
||||||
}
|
|
||||||
catch (AggregateException)
|
|
||||||
{
|
|
||||||
// Faults already logged in TrackLoad.
|
|
||||||
}
|
|
||||||
|
|
||||||
while (PendingLoads.TryTake(out _)) { }
|
|
||||||
|
|
||||||
foreach (var emote in EmoteImages.Values)
|
|
||||||
emote.InnerDispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static bool Exists(string code)
|
|
||||||
{
|
|
||||||
return State is LoadingState.Done && SortedCodeArray.Contains(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static EmoteBase? GetEmote(string code)
|
|
||||||
{
|
|
||||||
if (State is not LoadingState.Done)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
if (!Cache.TryGetValue(code, out var emoteDetail))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
if (EmoteImages.TryGetValue(emoteDetail.Id, out var emote))
|
|
||||||
return emote;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (emoteDetail.ImageType == "gif")
|
|
||||||
{
|
|
||||||
var animatedEmote = new ImGuiGif().Prepare(emoteDetail);
|
|
||||||
EmoteImages.Add(emoteDetail.Id, animatedEmote);
|
|
||||||
return animatedEmote;
|
|
||||||
}
|
|
||||||
|
|
||||||
var staticEmote = new ImGuiEmote().Prepare(emoteDetail);
|
|
||||||
EmoteImages.Add(emoteDetail.Id, staticEmote);
|
|
||||||
|
|
||||||
return staticEmote;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Plugin.LogProxy.Error("Failed to convert");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class EmoteBase
|
|
||||||
{
|
|
||||||
public bool Failed;
|
|
||||||
public bool IsLoaded;
|
|
||||||
|
|
||||||
public byte[] RawData = [];
|
|
||||||
|
|
||||||
protected IDalamudTextureWrap? Texture;
|
|
||||||
|
|
||||||
public virtual void Draw(Vector2 size)
|
|
||||||
{
|
|
||||||
ImGui.Image(Texture!.Handle, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal async Task<byte[]> LoadAsync(Emote emote, CancellationToken ct)
|
|
||||||
{
|
|
||||||
// Path-traversal guard: resolve and verify the candidate path stays
|
|
||||||
// inside the cache directory before reading or writing.
|
|
||||||
var dir = Path.GetFullPath(
|
|
||||||
Path.Join(Plugin.Interface.ConfigDirectory.FullName, "EmoteCacheV1")
|
|
||||||
);
|
|
||||||
Directory.CreateDirectory(dir);
|
|
||||||
|
|
||||||
var dirPrefix = dir.EndsWith(Path.DirectorySeparatorChar)
|
|
||||||
? dir
|
|
||||||
: dir + Path.DirectorySeparatorChar;
|
|
||||||
var filePath = Path.GetFullPath(Path.Join(dir, $"{emote.Id}.{emote.ImageType}"));
|
|
||||||
if (!filePath.StartsWith(dirPrefix, StringComparison.Ordinal))
|
|
||||||
throw new InvalidOperationException(
|
|
||||||
$"Emote path escapes cache directory: id={emote.Id}, type={emote.ImageType}"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (File.Exists(filePath))
|
|
||||||
{
|
|
||||||
RawData = await File.ReadAllBytesAsync(filePath, ct);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var content = await Client.GetAsync(EmotePath.Format(emote.Id), ct);
|
|
||||||
RawData = await content.Content.ReadAsByteArrayAsync(ct);
|
|
||||||
|
|
||||||
await using var stream = new FileStream(
|
|
||||||
filePath,
|
|
||||||
FileMode.Create,
|
|
||||||
FileAccess.Write,
|
|
||||||
FileShare.Read
|
|
||||||
);
|
|
||||||
await stream.WriteAsync(RawData, ct);
|
|
||||||
}
|
|
||||||
|
|
||||||
return RawData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void InnerDispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class ImGuiEmote : EmoteBase
|
|
||||||
{
|
|
||||||
public ImGuiEmote Prepare(Emote emote)
|
|
||||||
{
|
|
||||||
var ct = EmoteCache.Token;
|
|
||||||
// Task.Run keeps the sync prefix off the ImGui render thread.
|
|
||||||
EmoteCache.TrackLoad(Task.Run(() => LoadAsyncTracked(emote, ct), ct), emote.Code);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task LoadAsyncTracked(Emote emote, CancellationToken ct)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var image = await LoadAsync(emote, ct);
|
|
||||||
if (image.Length <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ct.ThrowIfCancellationRequested();
|
|
||||||
Texture = await Plugin.TextureProvider.CreateFromImageAsync(
|
|
||||||
image,
|
|
||||||
cancellationToken: ct
|
|
||||||
);
|
|
||||||
IsLoaded = true;
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException) { }
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Failed = true;
|
|
||||||
Plugin.LogProxy.Error(ex, $"Unable to load {emote.Code} with id {emote.Id}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void InnerDispose()
|
|
||||||
{
|
|
||||||
Texture?.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class ImGuiGif : EmoteBase
|
|
||||||
{
|
|
||||||
private List<(IDalamudTextureWrap Texture, float Delay)> Frames = [];
|
|
||||||
private float FrameTimer;
|
|
||||||
private int CurrentFrame;
|
|
||||||
private ulong GlobalFrameCount;
|
|
||||||
|
|
||||||
public override void Draw(Vector2 size)
|
|
||||||
{
|
|
||||||
if (Frames.Count == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (CurrentFrame >= Frames.Count)
|
|
||||||
{
|
|
||||||
CurrentFrame = 0;
|
|
||||||
FrameTimer = -1f;
|
|
||||||
}
|
|
||||||
|
|
||||||
var frame = Frames[CurrentFrame];
|
|
||||||
if (FrameTimer <= 0.0f)
|
|
||||||
FrameTimer = frame.Delay;
|
|
||||||
|
|
||||||
ImGui.Image(frame.Texture.Handle, size);
|
|
||||||
|
|
||||||
if (GlobalFrameCount == Plugin.Interface.UiBuilder.FrameCount)
|
|
||||||
return;
|
|
||||||
|
|
||||||
GlobalFrameCount = Plugin.Interface.UiBuilder.FrameCount;
|
|
||||||
|
|
||||||
FrameTimer -= ImGui.GetIO().DeltaTime;
|
|
||||||
if (FrameTimer <= 0f)
|
|
||||||
CurrentFrame++;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void InnerDispose()
|
|
||||||
{
|
|
||||||
Frames.ForEach(f => f.Texture.Dispose());
|
|
||||||
Frames.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ImGuiGif Prepare(Emote emote)
|
|
||||||
{
|
|
||||||
var ct = EmoteCache.Token;
|
|
||||||
EmoteCache.TrackLoad(Task.Run(() => LoadAsyncTracked(emote, ct), ct), emote.Code);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task LoadAsyncTracked(Emote emote, CancellationToken ct)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var image = await LoadAsync(emote, ct);
|
|
||||||
if (image.Length <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
using var ms = new MemoryStream(image);
|
|
||||||
using var img = Image.Load<Rgba32>(ms);
|
|
||||||
if (img.Frames.Count == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var frames = new List<(IDalamudTextureWrap Tex, float Delay)>();
|
|
||||||
foreach (var frame in img.Frames)
|
|
||||||
{
|
|
||||||
ct.ThrowIfCancellationRequested();
|
|
||||||
|
|
||||||
var delay = frame.Metadata.GetGifMetadata().FrameDelay / 100f;
|
|
||||||
|
|
||||||
// Match browser behaviour: anything under 20ms rounds up to 100ms.
|
|
||||||
if (delay < 0.02f)
|
|
||||||
delay = 0.1f;
|
|
||||||
|
|
||||||
var buffer = new byte[4 * frame.Width * frame.Height];
|
|
||||||
frame.CopyPixelDataTo(buffer);
|
|
||||||
var tex = await Plugin.TextureProvider.CreateFromRawAsync(
|
|
||||||
RawImageSpecification.Rgba32(frame.Width, frame.Height),
|
|
||||||
buffer,
|
|
||||||
cancellationToken: ct
|
|
||||||
);
|
|
||||||
frames.Add((tex, delay));
|
|
||||||
}
|
|
||||||
|
|
||||||
Frames = frames;
|
|
||||||
IsLoaded = true;
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// Plugin disposed mid-load; release any partial frames.
|
|
||||||
foreach (var f in Frames)
|
|
||||||
f.Texture.Dispose();
|
|
||||||
Frames = [];
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Failed = true;
|
|
||||||
Plugin.LogProxy.Error(ex, $"Unable to load {emote.Code} with id {emote.Id}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -61,7 +61,7 @@ public sealed class FontManager : IDisposable
|
|||||||
// widget gallery exposes it.
|
// widget gallery exposes it.
|
||||||
internal static float SenderWeight = 1.3f;
|
internal static float SenderWeight = 1.3f;
|
||||||
|
|
||||||
// Wired post-build (B4b-3); a Func keeps FontManager off the theme layer.
|
// Wired post-build; a Func keeps FontManager off the theme layer.
|
||||||
private Func<ThemeTypography?>? _typographySource;
|
private Func<ThemeTypography?>? _typographySource;
|
||||||
|
|
||||||
// Lets RebuildDelegateFontsIfChanged skip rebuilds when the size is unchanged.
|
// Lets RebuildDelegateFontsIfChanged skip rebuilds when the size is unchanged.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
|
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
|
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
|
||||||
<Version>2.0.1</Version>
|
<Version>2.0.3</Version>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<!-- Use lock file to pin exact versions -->
|
<!-- Use lock file to pin exact versions -->
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
Media-Foundation-based codecs do not). Using the sub-package avoids pulling in
|
Media-Foundation-based codecs do not). Using the sub-package avoids pulling in
|
||||||
NAudio.WinForms (which requires WindowsDesktop and does not build on Linux hosts).
|
NAudio.WinForms (which requires WindowsDesktop and does not build on Linux hosts).
|
||||||
WaveOutEvent and WaveFileReader both live in NAudio.WinMM + NAudio.Core. -->
|
WaveOutEvent and WaveFileReader both live in NAudio.WinMM + NAudio.Core. -->
|
||||||
<PackageReference Include="NAudio.WinMM" Version="2.3.0" />
|
<PackageReference Include="NAudio.WinMM" Version="3.0.1" />
|
||||||
<PackageReference Include="Pidgin" Version="[3.5.1, 4.0.0)" />
|
<PackageReference Include="Pidgin" Version="[3.5.1, 4.0.0)" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="[3.1.12, 4.0.0)" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="[3.1.12, 4.0.0)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ icon_url: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/br
|
|||||||
image_urls:
|
image_urls:
|
||||||
- https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png
|
- https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png
|
||||||
- https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/settingsOverview.png
|
- https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/settingsOverview.png
|
||||||
- https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/themesPicker.png
|
- https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/firstRunWizard.png
|
||||||
tags:
|
tags:
|
||||||
- Social
|
- Social
|
||||||
- UI
|
- UI
|
||||||
@@ -35,6 +35,22 @@ tags:
|
|||||||
- Replacement
|
- Replacement
|
||||||
- Privacy
|
- Privacy
|
||||||
changelog: |-
|
changelog: |-
|
||||||
|
**v2.0.3 — Pop-out context menu, screenshot mode (2026-08-20)**
|
||||||
|
|
||||||
|
- **The context menu never opened in a pop-out window.** Right-clicking a name or an item there did nothing at all. Every chat surface shares one popup state, and whichever window drew first cleared the menu it had not opened before the pop-out got its turn. The menu now stays with the window the click came from.
|
||||||
|
- **Screenshot mode could not be turned off.** It is a saved setting, but neither of its two toggles wrote the change to the config file, so switching it off never survived a reload and the mode came back on at every plugin load. Both toggles save now. If it is stuck on for you, one click off is enough.
|
||||||
|
- **Text the game colours itself could render invisible.** Some of those colours arrive without an alpha byte, and the byte order swap then left them fully transparent.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**v2.0.2 — Emotes out, placeholders fixed (2026-08-19)**
|
||||||
|
|
||||||
|
- **BetterTTV emote support is gone.** Its shared-emote endpoint went behind authentication, and that was where nearly all of them came from — what remained was a 65-entry global set, eleven of which are on the known-broken list, so 54 mostly static images from Twitch's early days. Exactly one was animated, and that one wanted 492 frames and 37 MB of video memory. The plugin now makes no outbound network calls at all. Messages stored with emotes still read fine; they show the code that was typed.
|
||||||
|
- **Five settings descriptions printed `{0}` instead of the plugin name.** All 25 languages were affected, English included — it just hid better there, since "Hide {0} during cutscenes" still scans as a sentence while German puts the placeholder first. A test now walks every resource string with a placeholder and fails if one reaches a widget unformatted.
|
||||||
|
- **New preview images.** The ones in the plugin installer were from 8 May and showed the interface as it looked before any of the window rebuilds.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
**v2.0.1 — Hotfix (2026-08-19)**
|
**v2.0.1 — Hotfix (2026-08-19)**
|
||||||
|
|
||||||
A same-day follow-up to 2.0.0 with no user-facing changes. Install it if you picked up 2.0.0 in the first hour; there is nothing new to look at, it just carries a dependency update the 2.0.0 archive was built without.
|
A same-day follow-up to 2.0.0 with no user-facing changes. Install it if you picked up 2.0.0 in the first hour; there is nothing new to look at, it just carries a dependency update the 2.0.0 archive was built without.
|
||||||
@@ -75,49 +91,4 @@ changelog: |-
|
|||||||
|
|
||||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). The two codebases have diverged far enough that they no longer line up.
|
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). The two codebases have diverged far enough that they no longer line up.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**v1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)**
|
|
||||||
|
|
||||||
- Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need.
|
|
||||||
- New sender-name display options under Chat → Messages: separate world-suffix and name-format modes (Full name / First name only / Initials × Never / Other worlds only / Always).
|
|
||||||
- Plugin-only symbols now show a pre-send warning so other players do not get empty boxes (Chat → Messages → "Warn before sending plugin-only symbols").
|
|
||||||
- Separate window opacity for focused vs. inactive chat window (Appearance → Window style → "Inactive window opacity"). The slider above sets the focused value.
|
|
||||||
- Custom notification sound volume slider (General → Sound, and mirrored in Channels → per-tab → Notification). Affects only the three bundled custom sounds; the 16 game sounds are unaffected.
|
|
||||||
- The per-tab regex filter that briefly shipped earlier in this cycle has been removed — FFXIV's built-in blackword filter covers the same need.
|
|
||||||
- All 24 locale files updated for the new section labels and the v1.5.6 control labels (machine translation; native review continues via the Hellion Forge Discord).
|
|
||||||
|
|
||||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)**
|
|
||||||
|
|
||||||
A backlog-sync cycle: inherited tab-feature items plus a new fox
|
|
||||||
banner image and custom notification sounds.
|
|
||||||
|
|
||||||
User-visible:
|
|
||||||
|
|
||||||
- Failed tells now raise a warning toast when a message you sent
|
|
||||||
could not be delivered (recipient offline, in an instance, or
|
|
||||||
blocking you). Toggle in Settings, Chat tab.
|
|
||||||
- Per-tab notification sound: each tab can play a sound when a
|
|
||||||
message arrives while you are looking at a different tab. Pick
|
|
||||||
one of the 16 game chat sounds or one of three bundled Hellion
|
|
||||||
sounds, with a preview button to hear it. Off by default,
|
|
||||||
respects the global sound toggle.
|
|
||||||
- The tab rename field in the right-click menu now focuses
|
|
||||||
itself when the menu opens and accepts up to 512 characters,
|
|
||||||
matching the settings-tab rename.
|
|
||||||
- A jump-to-latest button appears in the chat log header while
|
|
||||||
you are scrolled up from the live end.
|
|
||||||
- Map flags and item links can be inserted into the chat input
|
|
||||||
from its right-click menu.
|
|
||||||
- The Hellion Forge fox banner in the first-run wizard and the
|
|
||||||
Information tab is now a real image instead of ASCII art.
|
|
||||||
|
|
||||||
Schema bumped to v18 (additive fields only, no data migration).
|
|
||||||
|
|
||||||
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
|
|
||||||
|
|
||||||
Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
|
Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ internal sealed class ThemeRegistryInitHostedService(
|
|||||||
foreach (var _ in registry.AllCustom()) { }
|
foreach (var _ in registry.AllCustom()) { }
|
||||||
registry.SwitchSilent(Plugin.Config.Theme);
|
registry.SwitchSilent(Plugin.Config.Theme);
|
||||||
|
|
||||||
// B4b-3: point font sizes at the active theme's typography, wire future
|
// Point font sizes at the active theme's typography, wire future
|
||||||
// theme switches to the atlas rebuild, and apply the boot theme's override.
|
// theme switches to the atlas rebuild, and apply the boot theme's override.
|
||||||
fontManager.SetTypographySource(() => registry.Active.Typography);
|
fontManager.SetTypographySource(() => registry.Active.Typography);
|
||||||
registry.SetActiveChangedCallback(() => fontManager.RebuildDelegateFontsIfChanged());
|
registry.SetActiveChangedCallback(() => fontManager.RebuildDelegateFontsIfChanged());
|
||||||
|
|||||||
@@ -175,8 +175,6 @@ public partial class Message
|
|||||||
}
|
}
|
||||||
|
|
||||||
var nextIsAutoTranslate = false;
|
var nextIsAutoTranslate = false;
|
||||||
var checkForEmotes =
|
|
||||||
(Code.IsPlayerMessage() || extraChatChannel != Guid.Empty) && Plugin.Config.ShowEmotes;
|
|
||||||
foreach (var chunk in oldChunks)
|
foreach (var chunk in oldChunks)
|
||||||
{
|
{
|
||||||
// Use as is if it's not a text chunk, it already has a payload, or is auto translate
|
// Use as is if it's not a text chunk, it already has a payload, or is auto translate
|
||||||
@@ -207,25 +205,6 @@ public partial class Message
|
|||||||
var wordUsed = false;
|
var wordUsed = false;
|
||||||
var tokenUsed = false;
|
var tokenUsed = false;
|
||||||
|
|
||||||
if (
|
|
||||||
checkForEmotes
|
|
||||||
&& EmoteCache.Exists(word)
|
|
||||||
&& !Plugin.Config.BlockedEmotes.Contains(word)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// Add the previous sentence before adding the emote
|
|
||||||
AddChunkWithMessage(text.NewWithStyle(chunk, sentenceBuilder.ToString()));
|
|
||||||
AddChunkWithMessage(
|
|
||||||
new TextChunk(chunk.Source, EmotePayload.ResolveEmote(word), word)
|
|
||||||
{
|
|
||||||
FallbackColour = text.FallbackColour,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
wordUsed = true;
|
|
||||||
sentenceBuilder.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token.TokenType == Tokenizer.TokenType.UrlString)
|
if (token.TokenType == Tokenizer.TokenType.UrlString)
|
||||||
{
|
{
|
||||||
// Add the previous sentence before adding the url
|
// Add the previous sentence before adding the url
|
||||||
|
|||||||
@@ -90,6 +90,8 @@ public class PayloadMessagePackFormatter : IMessagePackFormatter<Payload?>
|
|||||||
return new PartyFinderPayload(reader.ReadUInt32());
|
return new PartyFinderPayload(reader.ReadUInt32());
|
||||||
case PayloadMessagePackType.Uri:
|
case PayloadMessagePackType.Uri:
|
||||||
return new UriPayload(new Uri(reader.ReadString() ?? ""));
|
return new UriPayload(new Uri(reader.ReadString() ?? ""));
|
||||||
|
// Read-only since 2.0.2: nothing writes this any more, but rows
|
||||||
|
// stored before then carry it and must keep deserialising.
|
||||||
case PayloadMessagePackType.Emote:
|
case PayloadMessagePackType.Emote:
|
||||||
return EmotePayload.ResolveEmote(reader.ReadString() ?? "");
|
return EmotePayload.ResolveEmote(reader.ReadString() ?? "");
|
||||||
case PayloadMessagePackType.Other:
|
case PayloadMessagePackType.Other:
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ internal sealed class PayloadHandler
|
|||||||
public uint LastHoverCounter;
|
public uint LastHoverCounter;
|
||||||
|
|
||||||
private (Chunk, Payload?)? _popup;
|
private (Chunk, Payload?)? _popup;
|
||||||
|
private object? _popupOwner;
|
||||||
|
|
||||||
public PayloadHandler(
|
public PayloadHandler(
|
||||||
ThemeRegistry themes,
|
ThemeRegistry themes,
|
||||||
@@ -69,6 +70,10 @@ internal sealed class PayloadHandler
|
|||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Every chat surface shares this handler, so each one claims it before it
|
||||||
|
// renders. Without that the popup cannot tell whose click it belongs to.
|
||||||
|
internal object? ActiveSurface { get; set; }
|
||||||
|
|
||||||
internal void Draw()
|
internal void Draw()
|
||||||
{
|
{
|
||||||
DrawPopups();
|
DrawPopups();
|
||||||
@@ -84,7 +89,9 @@ internal sealed class PayloadHandler
|
|||||||
|
|
||||||
private void DrawPopups()
|
private void DrawPopups()
|
||||||
{
|
{
|
||||||
if (_popup == null)
|
// A foreign surface finds no open popup here and would otherwise read
|
||||||
|
// that as "closed" and drop the state before the owner gets to draw.
|
||||||
|
if (_popup == null || !PopupOwnership.Owns(_popupOwner, ActiveSurface))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var (chunk, payload) = _popup.Value;
|
var (chunk, payload) = _popup.Value;
|
||||||
@@ -93,6 +100,7 @@ internal sealed class PayloadHandler
|
|||||||
if (!popup.Success)
|
if (!popup.Success)
|
||||||
{
|
{
|
||||||
_popup = null;
|
_popup = null;
|
||||||
|
_popupOwner = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +194,10 @@ internal sealed class PayloadHandler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.Checkbox(Language.Context_ScreenshotMode, ref Plugin.Config.ScreenshotMode);
|
// The flag is persisted, so every toggle has to write it. Without the
|
||||||
|
// write it only sticks when some unrelated save happens to run after.
|
||||||
|
if (ImGui.Checkbox(Language.Context_ScreenshotMode, ref Plugin.Config.ScreenshotMode))
|
||||||
|
Plugin.Instance.SaveConfig();
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_HideChat))
|
if (ImGui.Selectable(Language.Context_HideChat))
|
||||||
Plugin.Config.HideChat = true;
|
Plugin.Config.HideChat = true;
|
||||||
@@ -934,6 +945,7 @@ internal sealed class PayloadHandler
|
|||||||
private void RightClickPayload(Chunk chunk, Payload? payload)
|
private void RightClickPayload(Chunk chunk, Payload? payload)
|
||||||
{
|
{
|
||||||
_popup = (chunk, payload);
|
_popup = (chunk, payload);
|
||||||
|
_popupOwner = ActiveSurface;
|
||||||
ImGui.OpenPopup(PopupId);
|
ImGui.OpenPopup(PopupId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -620,9 +620,6 @@ public sealed class Plugin : IAsyncDalamudPlugin
|
|||||||
// or already ran within the past 24 hours.
|
// or already ran within the past 24 hours.
|
||||||
RunRetentionSweepIfDue();
|
RunRetentionSweepIfDue();
|
||||||
|
|
||||||
if (Config.ShowEmotes)
|
|
||||||
_ = EmoteCache.LoadData();
|
|
||||||
|
|
||||||
// FilterAllTabsAsync now runs from MessageManagerInitHostedService
|
// FilterAllTabsAsync now runs from MessageManagerInitHostedService
|
||||||
// during Host.StartAsync (same Reason-not-Boot guard there).
|
// during Host.StartAsync (same Reason-not-Boot guard there).
|
||||||
|
|
||||||
@@ -841,7 +838,6 @@ public sealed class Plugin : IAsyncDalamudPlugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Static-class cleanups the container has no handle on.
|
// Static-class cleanups the container has no handle on.
|
||||||
failure = CaptureFailure(failure, () => EmoteCache.Dispose());
|
|
||||||
failure = CaptureFailure(failure, InputHistoryService.Reset);
|
failure = CaptureFailure(failure, InputHistoryService.Reset);
|
||||||
|
|
||||||
if (failure is not null)
|
if (failure is not null)
|
||||||
|
|||||||
@@ -202,8 +202,6 @@ internal class HellionStrings
|
|||||||
internal static string AutoTellTabs_UnGreetedTooltip => Get(nameof(AutoTellTabs_UnGreetedTooltip));
|
internal static string AutoTellTabs_UnGreetedTooltip => Get(nameof(AutoTellTabs_UnGreetedTooltip));
|
||||||
internal static string PinTab_MenuPin => Get(nameof(PinTab_MenuPin));
|
internal static string PinTab_MenuPin => Get(nameof(PinTab_MenuPin));
|
||||||
internal static string PinTab_MenuUnpin => Get(nameof(PinTab_MenuUnpin));
|
internal static string PinTab_MenuUnpin => Get(nameof(PinTab_MenuUnpin));
|
||||||
internal static string PinTab_MenuPromote => Get(nameof(PinTab_MenuPromote));
|
|
||||||
internal static string PinTab_PromoteTooltip => Get(nameof(PinTab_PromoteTooltip));
|
|
||||||
internal static string PinTab_LimitReached => Get(nameof(PinTab_LimitReached));
|
internal static string PinTab_LimitReached => Get(nameof(PinTab_LimitReached));
|
||||||
internal static string PinTab_PinnedTooltip => Get(nameof(PinTab_PinnedTooltip));
|
internal static string PinTab_PinnedTooltip => Get(nameof(PinTab_PinnedTooltip));
|
||||||
internal static string PinTab_PinTooltip => Get(nameof(PinTab_PinTooltip));
|
internal static string PinTab_PinTooltip => Get(nameof(PinTab_PinTooltip));
|
||||||
@@ -438,7 +436,6 @@ internal class HellionStrings
|
|||||||
internal static string Settings_About_GiteaRepo => Get(nameof(Settings_About_GiteaRepo));
|
internal static string Settings_About_GiteaRepo => Get(nameof(Settings_About_GiteaRepo));
|
||||||
internal static string Settings_About_CustomRepo => Get(nameof(Settings_About_CustomRepo));
|
internal static string Settings_About_CustomRepo => Get(nameof(Settings_About_CustomRepo));
|
||||||
internal static string Settings_Section_AutoTranslate => Get(nameof(Settings_Section_AutoTranslate));
|
internal static string Settings_Section_AutoTranslate => Get(nameof(Settings_Section_AutoTranslate));
|
||||||
internal static string Settings_Emotes_Block => Get(nameof(Settings_Emotes_Block));
|
|
||||||
internal static string Settings_Telemetry_None => Get(nameof(Settings_Telemetry_None));
|
internal static string Settings_Telemetry_None => Get(nameof(Settings_Telemetry_None));
|
||||||
internal static string Settings_Section_Database => Get(nameof(Settings_Section_Database));
|
internal static string Settings_Section_Database => Get(nameof(Settings_Section_Database));
|
||||||
|
|
||||||
@@ -549,7 +546,6 @@ internal class HellionStrings
|
|||||||
internal static string Settings_Section_Messages => Get(nameof(Settings_Section_Messages));
|
internal static string Settings_Section_Messages => Get(nameof(Settings_Section_Messages));
|
||||||
internal static string Settings_Section_InputPreview => Get(nameof(Settings_Section_InputPreview));
|
internal static string Settings_Section_InputPreview => Get(nameof(Settings_Section_InputPreview));
|
||||||
internal static string Settings_Section_AutoTellTabs => Get(nameof(Settings_Section_AutoTellTabs));
|
internal static string Settings_Section_AutoTellTabs => Get(nameof(Settings_Section_AutoTellTabs));
|
||||||
internal static string Settings_Section_Emotes => Get(nameof(Settings_Section_Emotes));
|
|
||||||
internal static string Settings_Section_LinksTooltips => Get(nameof(Settings_Section_LinksTooltips));
|
internal static string Settings_Section_LinksTooltips => Get(nameof(Settings_Section_LinksTooltips));
|
||||||
internal static string Settings_Section_NoviceNetwork => Get(nameof(Settings_Section_NoviceNetwork));
|
internal static string Settings_Section_NoviceNetwork => Get(nameof(Settings_Section_NoviceNetwork));
|
||||||
|
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Desfixa la pestanya</value>
|
<value>Desfixa la pestanya</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Converteix en pestanya permanent</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Converteix aquest TempTell en una pestanya normal. L'enllaç del tell amb el company es perd: la pestanya capturarà missatges pels seus filtres de canal a partir d'ara. Per a "la pestanya sobreviu al reconnectar mentre continua lligada a aquest company", utilitza Fixa la pestanya.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Les pestanyes fixades sobreviuen al reconnectar i continuen lligades a aquest interlocutor.</value>
|
<value>Les pestanyes fixades sobreviuen al reconnectar i continuen lligades a aquest interlocutor.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Pestanyes de tell automàtic</value>
|
<value>Pestanyes de tell automàtic</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Enllaços i consells</value>
|
<value>Enllaços i consells</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Traducció automàtica</value>
|
<value>Traducció automàtica</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Bloqueja</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Vés al missatge més recent</value>
|
<value>Vés al missatge més recent</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Odepnout záložku</value>
|
<value>Odepnout záložku</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Povýšit na trvalou záložku</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Přemění tento TempTell na normální záložku. Vazba na partnera přes tell se zruší: záložka od té doby zachytává zprávy podle filtrů kanálů. Chceš-li „záložka přežije relog a zůstane svázaná s tímto partnerem", použij raději Připnout záložku.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Připnuté záložky přeživají relog a zůstávají svázané s tímto konverzačním partnerem.</value>
|
<value>Připnuté záložky přeživají relog a zůstávají svázané s tímto konverzačním partnerem.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automatické karty pro tell</value>
|
<value>Automatické karty pro tell</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emoty</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Odkazy a popisky</value>
|
<value>Odkazy a popisky</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Automatický překlad</value>
|
<value>Automatický překlad</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Zablokovat</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Přejít na nejnovější zprávu</value>
|
<value>Přejít na nejnovější zprávu</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Frigør tab</value>
|
<value>Frigør tab</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Konvertér til permanent tab</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Gør denne TempTell til en regulær tab. Tell-bindingen til samtalepartneren fjernes, og tab'en vil fremover opfange beskeder via dens kanalfiltre. Brug Fastgør tab i stedet, hvis du vil have "tab overlever genlog og forbliver bundet til denne partner".</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Fastgjorte tabs overlever genlog og forbliver bundet til denne samtalepartner.</value>
|
<value>Fastgjorte tabs overlever genlog og forbliver bundet til denne samtalepartner.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Auto-tell-faner</value>
|
<value>Auto-tell-faner</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Links og værktøjstip</value>
|
<value>Links og værktøjstip</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Auto-oversættelse</value>
|
<value>Auto-oversættelse</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Bloker</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Hop til den seneste besked</value>
|
<value>Hop til den seneste besked</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Tab lösen</value>
|
<value>Tab lösen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>In Standard-Tab umwandeln</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Wandelt den temporären Flüster-Tab in einen regulären Tab um. Die Flüster-Bindung an die Person geht verloren, der Tab fängt dann Nachrichten anhand der Channel-Filter ein. Für „Tab überlebt Relog" stattdessen „Tab anpinnen" wählen.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_LimitReached" xml:space="preserve">
|
<data name="PinTab_LimitReached" xml:space="preserve">
|
||||||
<value>Maximal {0} angepinnte Flüster-Tabs erreicht. Erst einen lösen oder dauerhaft behalten.</value>
|
<value>Maximal {0} angepinnte Flüster-Tabs erreicht. Erst einen lösen oder dauerhaft behalten.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -897,9 +891,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Auto-Flüster-Tabs</value>
|
<value>Auto-Flüster-Tabs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Links & Tooltips</value>
|
<value>Links & Tooltips</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1094,9 +1085,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Auto-Übersetzung</value>
|
<value>Auto-Übersetzung</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Sperren</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Zur neuesten Nachricht springen</value>
|
<value>Zur neuesten Nachricht springen</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Ξεκαρφίτσωμα καρτέλας</value>
|
<value>Ξεκαρφίτσωμα καρτέλας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Προαγωγή σε μόνιμη</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Μετατρέπει αυτό το TempTell σε κανονική καρτέλα. Η σύνδεση tell με τον συνομιλητή καταργείται. Η καρτέλα θα συλλαμβάνει μηνύματα βάσει φίλτρων καναλιών από εδώ και εξής. Για "η καρτέλα επιβιώνει relog ενώ παραμένει συνδεδεμένη με αυτόν τον συνομιλητή", χρησιμοποίησε αντί αυτού το Καρφίτσωμα καρτέλας.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Οι καρφιτσωμένες καρτέλες επιβιώνουν relog και παραμένουν συνδεδεμένες με αυτόν τον συνομιλητή.</value>
|
<value>Οι καρφιτσωμένες καρτέλες επιβιώνουν relog και παραμένουν συνδεδεμένες με αυτόν τον συνομιλητή.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Αυτόματες καρτέλες tell</value>
|
<value>Αυτόματες καρτέλες tell</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Εκφράσεις</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Σύνδεσμοι & επεξηγήσεις</value>
|
<value>Σύνδεσμοι & επεξηγήσεις</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Αυτόματη μετάφραση</value>
|
<value>Αυτόματη μετάφραση</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Αποκλεισμός</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Μετάβαση στο πιο πρόσφατο μήνυμα</value>
|
<value>Μετάβαση στο πιο πρόσφατο μήνυμα</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Desfijar pestaña</value>
|
<value>Desfijar pestaña</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Convertir en pestaña permanente</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Convierte este TempTell en una pestaña regular. Se pierde el vínculo de tell con la persona: la pestaña captará mensajes según sus filtros de canal a partir de ahora. Para "la pestaña sobrevive al relog pero sigue vinculada a esta persona", usa Fijar pestaña en su lugar.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Las pestañas fijadas sobreviven al relog y permanecen vinculadas a esta persona de conversación.</value>
|
<value>Las pestañas fijadas sobreviven al relog y permanecen vinculadas a esta persona de conversación.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Pestañas de tell automático</value>
|
<value>Pestañas de tell automático</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Enlaces y sugerencias</value>
|
<value>Enlaces y sugerencias</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Traducción automática</value>
|
<value>Traducción automática</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Bloquear</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Ir al mensaje más reciente</value>
|
<value>Ir al mensaje más reciente</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Irrota välilehti</value>
|
<value>Irrota välilehti</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Muuta pysyväksi välilehdeksi</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Muuttaa tämän TempTell-välilehden tavalliseksi välilehdeksi. Tell-sidonta kumppaniin poistetaan: välilehti poimii viestit kanavasuodattimiensa perusteella tästä eteenpäin. Jos haluat "välilehti selviää relogista sidottuna tähän kumppaniin", käytä sen sijaan Kiinnitä välilehti -toimintoa.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Kiinnitetyt välilehdet selviävät relogista ja pysyvät sidottuina tähän keskustelukumppaniin.</value>
|
<value>Kiinnitetyt välilehdet selviävät relogista ja pysyvät sidottuina tähän keskustelukumppaniin.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automaattiset tell-välilehdet</value>
|
<value>Automaattiset tell-välilehdet</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotet</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Linkit ja työkaluvihjeet</value>
|
<value>Linkit ja työkaluvihjeet</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Automaattikäännös</value>
|
<value>Automaattikäännös</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Estä</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Siirry uusimpaan viestiin</value>
|
<value>Siirry uusimpaan viestiin</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Désépingler l'onglet</value>
|
<value>Désépingler l'onglet</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Promouvoir en permanent</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Transforme cet onglet MP temporaire en onglet régulier. Le lien du message privé avec le partenaire est rompu. L'onglet capturera désormais les messages selon ses filtres de canaux. Pour « onglet qui survit à la reconnexion en restant lié à ce partenaire », utilisez Épingler l'onglet à la place.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Les onglets épinglés survivent à la reconnexion et restent liés à ce partenaire de conversation.</value>
|
<value>Les onglets épinglés survivent à la reconnexion et restent liés à ce partenaire de conversation.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Onglets de message privé automatiques</value>
|
<value>Onglets de message privé automatiques</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Liens et infobulles</value>
|
<value>Liens et infobulles</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Traduction automatique</value>
|
<value>Traduction automatique</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Bloquer</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Aller au message le plus récent</value>
|
<value>Aller au message le plus récent</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Fül rögzítésének feloldása</value>
|
<value>Fül rögzítésének feloldása</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Előléptetés állandó füllé</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Ezt a TempTell-t normál füllé alakítja. A partnerhez való tell-kötés megszűnik: a fül ezentúl a csatornaszűrők alapján fogja az üzeneteket. Ha azt szeretnéd, hogy „a fül túlélje az újrabejelentkezést és kötve maradjon a partnerhez", inkább a Fül rögzítése funkciót használd.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>A rögzített fülek túlélik az újrabejelentkezést, és kötve maradnak a beszélgető partnerhez.</value>
|
<value>A rögzített fülek túlélik az újrabejelentkezést, és kötve maradnak a beszélgető partnerhez.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automatikus tell lapfülek</value>
|
<value>Automatikus tell lapfülek</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emote-ok</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Hivatkozások és súgóbubborékok</value>
|
<value>Hivatkozások és súgóbubborékok</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Automatikus fordítás</value>
|
<value>Automatikus fordítás</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Letiltás</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Ugrás a legutóbbi üzenetre</value>
|
<value>Ugrás a legutóbbi üzenetre</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Sblocca tab</value>
|
<value>Sblocca tab</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Converti in tab permanente</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Trasforma questo TempTell in un tab normale. Il legame tell con il partner viene rimosso: il tab catturerà i messaggi tramite i suoi filtri canale da ora in poi. Per "il tab sopravvive al relog restando legato a questo partner", usa Fissa tab.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>I tab fissi sopravvivono al relog e rimangono legati a questo partner di conversazione.</value>
|
<value>I tab fissi sopravvivono al relog e rimangono legati a questo partner di conversazione.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Schede tell automatiche</value>
|
<value>Schede tell automatiche</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Link e tooltip</value>
|
<value>Link e tooltip</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Traduzione automatica</value>
|
<value>Traduzione automatica</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Blocca</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Vai al messaggio più recente</value>
|
<value>Vai al messaggio più recente</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>タブのピン留めを解除</value>
|
<value>タブのピン留めを解除</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>永続タブに昇格</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>この TempTell を通常のタブに変換します。会話相手へのテル紐付けは解除され、以降はチャンネルフィルターでメッセージを受信します。「再ログイン後も残す + 相手との紐付けを維持」したい場合は「タブをピン留め」をご利用ください。</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>ピン留めされたタブは再ログイン後も残り、会話相手との紐付けを維持します。</value>
|
<value>ピン留めされたタブは再ログイン後も残り、会話相手との紐付けを維持します。</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>オートテルタブ</value>
|
<value>オートテルタブ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>エモート</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>リンクとツールチップ</value>
|
<value>リンクとツールチップ</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>定型文</value>
|
<value>定型文</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>ブロック</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>最新のメッセージへ移動</value>
|
<value>最新のメッセージへ移動</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>탭 고정 해제</value>
|
<value>탭 고정 해제</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>영구 탭으로 변환</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>이 임시 귓속말 탭을 일반 탭으로 변환합니다. 상대방과의 귓속말 연결이 해제되며, 이후 채널 필터로 메시지를 받습니다. "재접속 후에도 상대방과 연결 유지"를 원한다면 탭 고정을 사용하세요.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>고정된 탭은 재접속 후에도 유지되며 이 대화 상대와의 연결이 유지됩니다.</value>
|
<value>고정된 탭은 재접속 후에도 유지되며 이 대화 상대와의 연결이 유지됩니다.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>자동 귓속말 탭</value>
|
<value>자동 귓속말 탭</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>감정 표현</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>링크 및 툴팁</value>
|
<value>링크 및 툴팁</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>정형문</value>
|
<value>정형문</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>차단</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>최신 메시지로 이동</value>
|
<value>최신 메시지로 이동</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Løsgjør fane</value>
|
<value>Løsgjør fane</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Gjør permanent</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Gjør denne TempTell om til en vanlig fane. Tell-bindingen til samtalepartneren fjernes, og fanen vil fra nå av fange meldinger via kanalfilteret. For å overleve relog mens du forblir bundet til denne partneren, bruk Fest fane i stedet.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Festede faner overlever relog og forblir bundet til denne samtalepartneren.</value>
|
<value>Festede faner overlever relog og forblir bundet til denne samtalepartneren.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automatiske tell-faner</value>
|
<value>Automatiske tell-faner</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Lenker og verktøytips</value>
|
<value>Lenker og verktøytips</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Auto-oversettelse</value>
|
<value>Auto-oversettelse</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Blokker</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Hopp til den nyeste meldingen</value>
|
<value>Hopp til den nyeste meldingen</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Tabblad losmaken</value>
|
<value>Tabblad losmaken</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Omzetten naar permanent tabblad</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Zet deze TempTell om naar een gewoon tabblad. De tell-koppeling met de gesprekspartner wordt verbroken: het tabblad vangt berichten voortaan op via de kanaalsfilters. Gebruik "Tabblad vastpinnen" als je wilt dat het tabblad een relog overleeft terwijl het gekoppeld blijft aan deze gesprekspartner.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Vastgepinde tabbladen overleven een relog en blijven gekoppeld aan deze gesprekspartner.</value>
|
<value>Vastgepinde tabbladen overleven een relog en blijven gekoppeld aan deze gesprekspartner.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automatische tell-tabbladen</value>
|
<value>Automatische tell-tabbladen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Links en tooltips</value>
|
<value>Links en tooltips</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Automatische vertaling</value>
|
<value>Automatische vertaling</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Blokkeren</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Ga naar het nieuwste bericht</value>
|
<value>Ga naar het nieuwste bericht</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Odepnij zakładkę</value>
|
<value>Odepnij zakładkę</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Przekształć w stałą zakładkę</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Zamienia ten TempTell w zwykłą zakładkę. Powiązanie tell z partnerem zostaje usunięte: od tej pory zakładka będzie przechwytywać wiadomości na podstawie filtrów kanałów. Jeśli chcesz, żeby „zakładka przeżyła relog i pozostała powiązana z tym partnerem", użyj zamiast tego Przypnij zakładkę.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Przypięte zakładki przeżywają relog i pozostają powiązane z tym partnerem rozmowy.</value>
|
<value>Przypięte zakładki przeżywają relog i pozostają powiązane z tym partnerem rozmowy.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automatyczne karty tell</value>
|
<value>Automatyczne karty tell</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotki</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Linki i podpowiedzi</value>
|
<value>Linki i podpowiedzi</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Autotłumaczenie</value>
|
<value>Autotłumaczenie</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Zablokuj</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Przejdź do najnowszej wiadomości</value>
|
<value>Przejdź do najnowszej wiadomości</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Desafixar aba</value>
|
<value>Desafixar aba</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Promover para permanente</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Transforma este TempTell em uma aba regular. O vínculo de tell com o parceiro é removido: a aba passará a capturar mensagens pelos filtros de canal a partir de agora. Para "aba sobrevive ao relog mantendo o vínculo com este parceiro", use Fixar aba.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Abas fixadas sobrevivem ao relog e permanecem vinculadas a este parceiro de conversa.</value>
|
<value>Abas fixadas sobrevivem ao relog e permanecem vinculadas a este parceiro de conversa.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Abas de tell automático</value>
|
<value>Abas de tell automático</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Links e dicas</value>
|
<value>Links e dicas</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Tradução automática</value>
|
<value>Tradução automática</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Bloquear</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Ir para a mensagem mais recente</value>
|
<value>Ir para a mensagem mais recente</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Desafixar separador</value>
|
<value>Desafixar separador</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Promover a permanente</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Transforma este TempTell num separador normal. A ligação de tell ao parceiro é removida: o separador passará a capturar mensagens pelos seus filtros de canal. Para "separador sobrevive ao relog mantendo a ligação a este parceiro", usa Fixar separador.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Os separadores fixos sobrevivem ao relog e mantêm a ligação a este parceiro de conversa.</value>
|
<value>Os separadores fixos sobrevivem ao relog e mantêm a ligação a este parceiro de conversa.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Separadores de tell automático</value>
|
<value>Separadores de tell automático</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Ligações e dicas</value>
|
<value>Ligações e dicas</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Tradução automática</value>
|
<value>Tradução automática</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Bloquear</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Ir para a mensagem mais recente</value>
|
<value>Ir para a mensagem mais recente</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Unpin Tab</value>
|
<value>Unpin Tab</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Promote to permanent</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Turns this TempTell into a regular tab. The tell binding to the partner is dropped. The tab will catch messages by its channel filters from now on. For "tab survives relog while staying bound to this partner", use Pin Tab instead.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Pinned tabs survive relog and stay bound to this conversation partner.</value>
|
<value>Pinned tabs survive relog and stay bound to this conversation partner.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -993,9 +987,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Auto-tell tabs</value>
|
<value>Auto-tell tabs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Links & tooltips</value>
|
<value>Links & tooltips</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1120,9 +1111,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Auto-translate</value>
|
<value>Auto-translate</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Block</value>
|
|
||||||
</data>
|
|
||||||
<data name="Wizard_Step4_Summary_Off" xml:space="preserve">
|
<data name="Wizard_Step4_Summary_Off" xml:space="preserve">
|
||||||
<value>off</value>
|
<value>off</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Dezfixează tab-ul</value>
|
<value>Dezfixează tab-ul</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Promovează la permanent</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Transformă acest TempTell într-un tab obișnuit. Legătura tell cu partenerul este eliminată: tab-ul va prinde mesaje după filtrele de canal de acum înainte. Pentru „tab supraviețuiește relog rămânând legat de acest partener", folosește Fixează tab-ul.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Tab-urile fixate supraviețuiesc relog-ului și rămân legate de acest partener de conversație.</value>
|
<value>Tab-urile fixate supraviețuiesc relog-ului și rămân legate de acest partener de conversație.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>File tell automate</value>
|
<value>File tell automate</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emote-uri</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Linkuri și sugestii</value>
|
<value>Linkuri și sugestii</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Traducere automată</value>
|
<value>Traducere automată</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Blochează</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Salt la cel mai recent mesaj</value>
|
<value>Salt la cel mai recent mesaj</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Открепить вкладку</value>
|
<value>Открепить вкладку</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Преобразовать в постоянную</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Превращает эту TempTell в обычную вкладку. Привязка ЛС к собеседнику снимается — вкладка будет получать сообщения по фильтрам канала. Для «вкладка переживает релог, оставаясь привязанной к собеседнику» используйте «Закрепить вкладку».</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Закреплённые вкладки переживают релог и остаются привязанными к этому собеседнику.</value>
|
<value>Закреплённые вкладки переживают релог и остаются привязанными к этому собеседнику.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Авто-вкладки tell</value>
|
<value>Авто-вкладки tell</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Эмоции</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Ссылки и подсказки</value>
|
<value>Ссылки и подсказки</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Автоперевод</value>
|
<value>Автоперевод</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Заблокировать</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Перейти к последнему сообщению</value>
|
<value>Перейти к последнему сообщению</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Lossa flik</value>
|
<value>Lossa flik</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Uppgradera till permanent</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Omvandlar den här TempTell-fliken till en vanlig flik. Bindningen till konversationspartnern tas bort och fliken fångar meddelanden via sina kanalfilter från och med nu. Använd Fäst flik om du vill att fliken ska överleva omloggning och ändå vara bunden till den här partnern.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Fästa flikar överlever omloggning och är kvar bundna till den här konversationspartnern.</value>
|
<value>Fästa flikar överlever omloggning och är kvar bundna till den här konversationspartnern.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Automatiska tell-flikar</value>
|
<value>Automatiska tell-flikar</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Länkar och verktygstips</value>
|
<value>Länkar och verktygstips</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Autoöversättning</value>
|
<value>Autoöversättning</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Blockera</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Hoppa till det senaste meddelandet</value>
|
<value>Hoppa till det senaste meddelandet</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Sekmeyi serbest bırak</value>
|
<value>Sekmeyi serbest bırak</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Kalıcı sekmeye yükselt</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Bu TempTell'i normal bir sekmeye dönüştürür. Kullanıcıya olan tell bağlantısı kaldırılır; sekme bundan sonra kanal filtrelerine göre mesaj yakalar. "Kullanıcıya bağlı kalarak yeniden giriş sonrası hayatta kalma" için bunun yerine Sekmeyi Sabitle'yi kullan.</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Sabitlenmiş sekmeler yeniden girişten sonra hayatta kalır ve bu konuşma ortağına bağlı kalır.</value>
|
<value>Sabitlenmiş sekmeler yeniden girişten sonra hayatta kalır ve bu konuşma ortağına bağlı kalır.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Otomatik tell sekmeleri</value>
|
<value>Otomatik tell sekmeleri</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Emote'lar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Bağlantılar ve araç ipuçları</value>
|
<value>Bağlantılar ve araç ipuçları</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Otomatik çeviri</value>
|
<value>Otomatik çeviri</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Engelle</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>En son iletiye git</value>
|
<value>En son iletiye git</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>Відкріпити вкладку</value>
|
<value>Відкріпити вкладку</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>Перетворити на постійну</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>Перетворює цей TempTell на звичайну вкладку. Прив'язка tell до партнера знімається — вкладка надалі отримуватиме повідомлення за фільтрами каналів. Для «вкладка виживає після релогу та залишається прив'язаною до цього партнера» натомість скористайтесь «Закріпити вкладку».</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>Закріплені вкладки виживають після релогу та залишаються прив'язаними до цього партнера розмови.</value>
|
<value>Закріплені вкладки виживають після релогу та залишаються прив'язаними до цього партнера розмови.</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -902,9 +896,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>Автоматичні вкладки tell</value>
|
<value>Автоматичні вкладки tell</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>Емоції</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>Посилання та підказки</value>
|
<value>Посилання та підказки</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1099,9 +1090,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>Автопереклад</value>
|
<value>Автопереклад</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>Заблокувати</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>Перейти до останнього повідомлення</value>
|
<value>Перейти до останнього повідомлення</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>取消固定</value>
|
<value>取消固定</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>提升为永久标签页</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>将此临时密语标签页转换为普通标签页。与对话伙伴的密语绑定将被解除,之后该标签页将根据频道过滤器接收消息。若需要"标签页在重新登录后仍保持与该伙伴的绑定",请使用固定标签页功能。</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>固定的标签页在重新登录后仍会保留,并保持与该对话伙伴的绑定。</value>
|
<value>固定的标签页在重新登录后仍会保留,并保持与该对话伙伴的绑定。</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>自动密语标签页</value>
|
<value>自动密语标签页</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>表情动作</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>链接与工具提示</value>
|
<value>链接与工具提示</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>自动翻译</value>
|
<value>自动翻译</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>屏蔽</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>跳到最新消息</value>
|
<value>跳到最新消息</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -467,12 +467,6 @@
|
|||||||
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
<data name="PinTab_MenuUnpin" xml:space="preserve">
|
||||||
<value>取消釘選</value>
|
<value>取消釘選</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PinTab_MenuPromote" xml:space="preserve">
|
|
||||||
<value>升格為永久標籤頁</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PromoteTooltip" xml:space="preserve">
|
|
||||||
<value>將此 TempTell 轉換為一般標籤頁。與對話對象的悄悄話綁定將解除,標籤頁之後將依頻道篩選條件接收訊息。若要「標籤頁在重新登入後保留且持續綁定此對象」,請改用釘選標籤頁。</value>
|
|
||||||
</data>
|
|
||||||
<data name="PinTab_PinTooltip" xml:space="preserve">
|
<data name="PinTab_PinTooltip" xml:space="preserve">
|
||||||
<value>釘選的標籤頁在重新登入後仍會保留,並持續綁定此對話對象。</value>
|
<value>釘選的標籤頁在重新登入後仍會保留,並持續綁定此對話對象。</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -903,9 +897,6 @@
|
|||||||
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
<data name="Settings_Section_AutoTellTabs" xml:space="preserve">
|
||||||
<value>自動悄悄話標籤頁</value>
|
<value>自動悄悄話標籤頁</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Section_Emotes" xml:space="preserve">
|
|
||||||
<value>情感動作</value>
|
|
||||||
</data>
|
|
||||||
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
<data name="Settings_Section_LinksTooltips" xml:space="preserve">
|
||||||
<value>連結與工具提示</value>
|
<value>連結與工具提示</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1100,9 +1091,6 @@
|
|||||||
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
<data name="Settings_Section_AutoTranslate" xml:space="preserve">
|
||||||
<value>自動翻譯</value>
|
<value>自動翻譯</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Settings_Emotes_Block" xml:space="preserve">
|
|
||||||
<value>封鎖</value>
|
|
||||||
</data>
|
|
||||||
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
<data name="ChatLog_ScrollToBottom_Tooltip" xml:space="preserve">
|
||||||
<value>跳到最新訊息</value>
|
<value>跳到最新訊息</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Hide during battle</value>
|
<value>Hide during battle</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Hide the chat during battles.</value>
|
<value>Hide the chat during battles.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Not Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Zachová fokus vstupu, i když vstoupíš do boje nebo provedeš jinou akci.</value>
|
<value>Zachová fokus vstupu, i když vstoupíš do boje nebo provedeš jinou akci.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Zobrazit emoty</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Nahrazuje slova jejich emote verzí, aktuálně podporuje BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Zablokované emoty</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Skrýt v boji</value>
|
<value>Skrýt v boji</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Skryje chat, když je otevřeno menu New Game+. Zavřením menu se chat znovu zobrazí.</value>
|
<value>Skryje chat, když je otevřeno menu New Game+. Zavřením menu se chat znovu zobrazí.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Statistiky emotů</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Připraveno</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Nepřipraveno</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Dostupné emoty:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Zobrazí náhled se speciálními parametry, jako jsou emoty a <item>.</value>
|
<value>Zobrazí náhled se speciálními parametry, jako jsou emoty a <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Beholder inputfokus, selvom du går i kamp eller udfører andre handlinger.</value>
|
<value>Beholder inputfokus, selvom du går i kamp eller udfører andre handlinger.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Vis emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Erstatter ord med deres emote-version, understøtter i øjeblikket BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blokerede emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Skjul under kamp</value>
|
<value>Skjul under kamp</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Skjuler chatten mens New Game+-menuen er åben. Lukning af menuen viser chatten igen.</value>
|
<value>Skjuler chatten mens New Game+-menuen er åben. Lukning af menuen viser chatten igen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote-statistik</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Klar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Ikke klar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Tilgængelige emotes:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Viser en forhåndsvisning med særlige parametre evalueret, som emotes og <item>.</value>
|
<value>Viser en forhåndsvisning med særlige parametre evalueret, som emotes og <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1189,21 +1189,6 @@ Sie wurden gewarnt.</value>
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Der Eingabefokus wird beibehalten, selbst wenn du einen Kampf betrittst oder eine andere Aktion ausführst.</value>
|
<value>Der Eingabefokus wird beibehalten, selbst wenn du einen Kampf betrittst oder eine andere Aktion ausführst.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Emotes anzeigen</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Ersetzt Wörter mit ihrer Emote-Version, unterstützt derzeit BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blockierte Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Während des Kampfes ausblenden</value>
|
<value>Während des Kampfes ausblenden</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1216,18 +1201,6 @@ Sie wurden gewarnt.</value>
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Blendet den Chat aus, solange das New-Game+ Menü geöffnet ist. Schließen des Menüs blendet den Chat wieder ein.</value>
|
<value>Blendet den Chat aus, solange das New-Game+ Menü geöffnet ist. Schließen des Menüs blendet den Chat wieder ein.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote-Statistik</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Bereit</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Nicht bereit</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes verfügbar:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Zeigt eine Vorschau mit speziellen Parametern, wie Emotes und <item>.</value>
|
<value>Zeigt eine Vorschau mit speziellen Parametern, wie Emotes und <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Διατηρεί την εστίαση εισαγωγής, ακόμα και αν μπεις σε μάχη ή κάνεις άλλες ενέργειες.</value>
|
<value>Διατηρεί την εστίαση εισαγωγής, ακόμα και αν μπεις σε μάχη ή κάνεις άλλες ενέργειες.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Εμφάνιση emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Αντικαθιστά λέξεις με την έκδοση emote τους, υποστηρίζει αυτή τη στιγμή BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Αποκλεισμένα emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Απόκρυψη κατά τη μάχη</value>
|
<value>Απόκρυψη κατά τη μάχη</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Απόκρυψη της συνομιλίας ενώ το μενού New Game+ είναι ανοιχτό. Το κλείσιμο του μενού εμφανίζει ξανά τη συνομιλία.</value>
|
<value>Απόκρυψη της συνομιλίας ενώ το μενού New Game+ είναι ανοιχτό. Το κλείσιμο του μενού εμφανίζει ξανά τη συνομιλία.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Στατιστικά Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Έτοιμο</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Μη έτοιμο</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Διαθέσιμα emotes:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Εμφανίζει προεπισκόπηση με αξιολόγηση ειδικών παραμέτρων, όπως emotes και <item>.</value>
|
<value>Εμφανίζει προεπισκόπηση με αξιολόγηση ειδικών παραμέτρων, όπως emotes και <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Mantiene el foco de entrada, incluso si entras en combate o realizas otras acciones.</value>
|
<value>Mantiene el foco de entrada, incluso si entras en combate o realizas otras acciones.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Mostrar emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Reemplaza las palabras por su versión de emote, actualmente soporta BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Gestos</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Emotes bloqueados</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Gesto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Ocultar durante el combate</value>
|
<value>Ocultar durante el combate</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Ocultar el chat durante combates.</value>
|
<value>Ocultar el chat durante combates.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Estadísticas de gestos</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Listo</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>No listo</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Gestos disponibles:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Muestra una vista previa con un parámetro especial evaluado, como emotes o <item>.</value>
|
<value>Muestra una vista previa con un parámetro especial evaluado, como emotes o <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Pitää syöttöfokuksen, vaikka siirtyisit taisteluun tai tekisit muita toimintoja.</value>
|
<value>Pitää syöttöfokuksen, vaikka siirtyisit taisteluun tai tekisit muita toimintoja.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Näytä emootiot</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Korvaa sanat niiden emootioversioilla, tukee tällä hetkellä BetterTTV:tä.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emootiot</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Estetyt emootiot</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emootio</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Piilota taistelun aikana</value>
|
<value>Piilota taistelun aikana</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Piilottaa chatin New Game+ -valikon ollessa auki. Sulkeminen näyttää chatin uudelleen.</value>
|
<value>Piilottaa chatin New Game+ -valikon ollessa auki. Sulkeminen näyttää chatin uudelleen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emootiotilastot</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Valmis</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Ei valmis</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emootioita saatavilla:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Näyttää esikatselun erikoisparametreilla arvioituna, kuten emootiot ja <item>.</value>
|
<value>Näyttää esikatselun erikoisparametreilla arvioituna, kuten emootiot ja <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Maintient le focus de saisie, même si vous entrez au combat ou faites d'autres actions.</value>
|
<value>Maintient le focus de saisie, même si vous entrez au combat ou faites d'autres actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Afficher les emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Remplace les mots par leur version emote, prend actuellement en charge BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Émotes bloquées</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Cacher pendant le combat</value>
|
<value>Cacher pendant le combat</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Cacher le chat pendant les combats.</value>
|
<value>Cacher le chat pendant les combats.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Statistiques de l'emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Prêt</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Pas prêt</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes disponibles :</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Affiche un aperçu avec un paramètre spécial estimé, comme les emotes et <item>.</value>
|
<value>Affiche un aperçu avec un paramètre spécial estimé, comme les emotes et <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Megtartja a beviteli fókuszt, még harc közben vagy más műveletek végzésekor is.</value>
|
<value>Megtartja a beviteli fókuszt, még harc közben vagy más műveletek végzésekor is.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Emote-ok megjelenítése</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Szavakat helyettesít az emote változatukkal, jelenleg a BetterTTV-t támogatja.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emote-ok</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blokkolt emote-ok</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Elrejtés harc közben</value>
|
<value>Elrejtés harc közben</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>A chat elrejtése, amíg a New Game+ menü nyitva van. A menü bezárásakor a chat újra megjelenik.</value>
|
<value>A chat elrejtése, amíg a New Game+ menü nyitva van. A menü bezárásakor a chat újra megjelenik.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote statisztikák</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Kész</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Nem kész</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Elérhető emote-ok:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Előnézetet jelenít meg kiértékelt speciális paraméterekkel, például emote-ok és <item>.</value>
|
<value>Előnézetet jelenít meg kiértékelt speciális paraméterekkel, például emote-ok és <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Nascondi in battaglia</value>
|
<value>Nascondi in battaglia</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Nascondi la chat in battaglia.</value>
|
<value>Nascondi la chat in battaglia.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Pronto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Non pronto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>戦闘に入ったり、他のアクションを行ったりしても、入力フォーカスを維持します。</value>
|
<value>戦闘に入ったり、他のアクションを行ったりしても、入力フォーカスを維持します。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>エモートを表示</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>単語をエモートバージョンに置き換え、現在BetterTTVをサポートしています。</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>エモート</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>ブロックされたエモート</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>エモート</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>戦闘中は非表示</value>
|
<value>戦闘中は非表示</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>戦闘中はチャットを非表示にします。</value>
|
<value>戦闘中はチャットを非表示にします。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>準備完了</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>未準備</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>利用可能なエモート:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>emotes や <item> のように、特別なパラメータが評価されたプレビューを表示します。</value>
|
<value>emotes や <item> のように、特別なパラメータが評価されたプレビューを表示します。</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Hide during battle</value>
|
<value>Hide during battle</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Hide the chat during battles.</value>
|
<value>Hide the chat during battles.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Not Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Beholder inndatafokuset selv om du går inn i kamp eller gjør andre handlinger.</value>
|
<value>Beholder inndatafokuset selv om du går inn i kamp eller gjør andre handlinger.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Vis emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Erstatter ord med tilsvarende emote-versjon. Støtter for øyeblikket BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blokkerte emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Skjul under kamp</value>
|
<value>Skjul under kamp</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Skjuler chatten mens New Game+-menyen er åpen. Chatten vises igjen når menyen lukkes.</value>
|
<value>Skjuler chatten mens New Game+-menyen er åpen. Chatten vises igjen når menyen lukkes.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote-statistikk</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Klar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Ikke klar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Tilgjengelige emotes:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Viser en forhåndsvisning med spesielle parametere evaluert, som emotes og <item>.</value>
|
<value>Viser en forhåndsvisning med spesielle parametere evaluert, som emotes og <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Houdt de invoerfocus vast, zelfs als je een gevecht aangaat of andere acties uitvoert.</value>
|
<value>Houdt de invoerfocus vast, zelfs als je een gevecht aangaat of andere acties uitvoert.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Emotes tonen</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Vervangt woorden door hun emote-versie, ondersteunt momenteel BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Geblokkeerde emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Verbergen tijdens gevecht</value>
|
<value>Verbergen tijdens gevecht</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Verberg de chat tijdens gevechten.</value>
|
<value>Verberg de chat tijdens gevechten.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote-statistieken</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Gereed</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Niet Gereed</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes beschikbaar:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Toont een voorvertoning met geëvalueerde speciale parameters, zoals emotes en <item>.</value>
|
<value>Toont een voorvertoning met geëvalueerde speciale parameters, zoals emotes en <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Utrzymuje fokus na polu wprowadzania, nawet jeśli wejdziesz w walkę lub wykonasz inne czynności.</value>
|
<value>Utrzymuje fokus na polu wprowadzania, nawet jeśli wejdziesz w walkę lub wykonasz inne czynności.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Pokaż emoty</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Zastępuje słowa ich wersją emotów, obecnie obsługuje BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emoty</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Zablokowane emoty</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emot</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Ukryj podczas walki</value>
|
<value>Ukryj podczas walki</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Ukrywa czat gdy menu New Game+ jest otwarte. Zamknięcie menu pokazuje czat z powrotem.</value>
|
<value>Ukrywa czat gdy menu New Game+ jest otwarte. Zamknięcie menu pokazuje czat z powrotem.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Statystyki emotów</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Gotowe</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Niegotowe</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Dostępne emoty:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Wyświetla podgląd z obliczonymi parametrami specjalnymi, jak emoty i <item>.</value>
|
<value>Wyświetla podgląd z obliczonymi parametrami specjalnymi, jak emoty i <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Mantém o foco de entrada, mesmo que você entre em batalha ou faça outras ações.</value>
|
<value>Mantém o foco de entrada, mesmo que você entre em batalha ou faça outras ações.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Exibir gestos</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Substitui as palavras por sua versão de gesto, atualmente suporta BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Gesto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Gestos bloqueados</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Gesto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Esconder durante combate</value>
|
<value>Esconder durante combate</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Esconder o bate-papo durante combate.</value>
|
<value>Esconder o bate-papo durante combate.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Status de Gestos</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Pronto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Não está pronto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Gestos disponíveis:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Exibe uma prévia com parâmetro especial avaliado, como gestos e <item>.</value>
|
<value>Exibe uma prévia com parâmetro especial avaliado, como gestos e <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Mantém o foco no campo de entrada mesmo que entres em combate ou faças outras ações.</value>
|
<value>Mantém o foco no campo de entrada mesmo que entres em combate ou faças outras ações.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Mostrar emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Substitui palavras pela versão em emote correspondente. Suporta atualmente o BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Emotes bloqueados</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Ocultar durante o combate</value>
|
<value>Ocultar durante o combate</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Oculta o chat enquanto o menu New Game+ está aberto. Ao fechar o menu, o chat volta a ser apresentado.</value>
|
<value>Oculta o chat enquanto o menu New Game+ está aberto. Ao fechar o menu, o chat volta a ser apresentado.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Estatísticas de emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Pronto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Não está pronto</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes disponíveis:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Apresenta uma pré-visualização com parâmetros especiais avaliados, como emotes e <item>.</value>
|
<value>Apresenta uma pré-visualização com parâmetros especiais avaliados, como emotes e <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -1174,21 +1174,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Hide during battle</value>
|
<value>Hide during battle</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1201,18 +1186,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Hide the chat while the New Game+ menu is open. Closing the menu shows the chat again.</value>
|
<value>Hide the chat while the New Game+ menu is open. Closing the menu shows the chat again.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Not Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Hide during battle</value>
|
<value>Hide during battle</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Hide the chat during battles.</value>
|
<value>Hide the chat during battles.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Not Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Hide during battle</value>
|
<value>Hide during battle</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Hide the chat during battles.</value>
|
<value>Hide the chat during battles.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Not Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
<value>Keeps the input focus, even if you enter battle or do other actions.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Show emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Replaces words with their emote version, currently supports BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Blocked emotes</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Hide during battle</value>
|
<value>Hide during battle</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>Hide the chat during battles.</value>
|
<value>Hide the chat during battles.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Not Ready</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Emotes available:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
<value>Displays a preview with special parameter evaluated, like emotes and <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Savaşa girerken veya başka eylemler yaparken bile giriş odağını korur.</value>
|
<value>Savaşa girerken veya başka eylemler yaparken bile giriş odağını korur.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Emote'ları göster</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Kelimeleri emote sürümleriyle değiştirir, şu an BetterTTV desteklenmektedir.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Emote'lar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Engellenen emote'lar</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Emote</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Savaş sırasında gizle</value>
|
<value>Savaş sırasında gizle</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>New Game+ menüsü açıkken sohbeti gizler. Menüyü kapatmak sohbeti tekrar gösterir.</value>
|
<value>New Game+ menüsü açıkken sohbeti gizler. Menüyü kapatmak sohbeti tekrar gösterir.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Emote İstatistikleri</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Hazır</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Hazır Değil</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Kullanılabilir emote'lar:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Emote'lar ve <item> gibi özel parametrelerin değerlendirildiği bir önizleme gösterir.</value>
|
<value>Emote'lar ve <item> gibi özel parametrelerin değerlendirildiği bir önizleme gösterir.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
Generated
-27
@@ -1190,21 +1190,6 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>Зберігає фокус введення навіть під час бою чи інших дій.</value>
|
<value>Зберігає фокус введення навіть під час бою чи інших дій.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>Показувати емоти</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>Замінює слова їх версіями емотів. Наразі підтримує BetterTTV.</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>Емоти</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>Заблоковані емоти</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>Емот</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>Приховувати під час бою</value>
|
<value>Приховувати під час бою</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1217,18 +1202,6 @@
|
|||||||
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
<data name="Options_HideInNewGamePlusMenu_Description" xml:space="preserve">
|
||||||
<value>Приховати чат, поки відкрито меню New Game+. Закриття меню знову показує чат.</value>
|
<value>Приховати чат, поки відкрито меню New Game+. Закриття меню знову показує чат.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>Статистика емотів</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>Готово</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>Не готово</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>Доступно емотів:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>Показує попередній перегляд з обробленими спеціальними параметрами, як-от емоти та <item>.</value>
|
<value>Показує попередній перегляд з обробленими спеціальними параметрами, як-от емоти та <item>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
-27
@@ -1168,39 +1168,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>保持输入焦点,即使你进入战斗或执行其他操作。</value>
|
<value>保持输入焦点,即使你进入战斗或执行其他操作。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>显示表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>用表情替换单词,目前支持 BetterTTV。</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>已屏蔽的表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>在战斗中隐藏</value>
|
<value>在战斗中隐藏</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>在战斗中隐藏聊天窗</value>
|
<value>在战斗中隐藏聊天窗</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>表情状态</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>准备就绪</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>尚未准备好</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>可用表情: </value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>显示特殊参数预览,如表情和 <item>。</value>
|
<value>显示特殊参数预览,如表情和 <item>。</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
-27
@@ -1169,39 +1169,12 @@
|
|||||||
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
<data name="Options_KeepInputFocus_Description" xml:space="preserve">
|
||||||
<value>保持輸入焦點,即使進入戰鬥或執行其他操作。</value>
|
<value>保持輸入焦點,即使進入戰鬥或執行其他操作。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_ShowEmotes_Name" xml:space="preserve">
|
|
||||||
<value>顯示表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_ShowEmotes_Desc" xml:space="preserve">
|
|
||||||
<value>用表情替換單詞,目前支持 BetterTTV。</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Tab" xml:space="preserve">
|
|
||||||
<value>表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_BlockedEmotes" xml:space="preserve">
|
|
||||||
<value>已屏蔽的表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_EmoteTable" xml:space="preserve">
|
|
||||||
<value>表情</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
<data name="Options_HideInBattle_Name" xml:space="preserve">
|
||||||
<value>在戰鬥中隱藏</value>
|
<value>在戰鬥中隱藏</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
<data name="Options_HideInBattle_Description" xml:space="preserve">
|
||||||
<value>在戰鬥中隱藏聊天窗。</value>
|
<value>在戰鬥中隱藏聊天窗。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Options_Emote_EmoteStats" xml:space="preserve">
|
|
||||||
<value>表情狀態</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Ready" xml:space="preserve">
|
|
||||||
<value>已就緒</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_NotReady" xml:space="preserve">
|
|
||||||
<value>尚未就緒</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Emote_Loaded" xml:space="preserve">
|
|
||||||
<value>可用表情:</value>
|
|
||||||
</data>
|
|
||||||
<data name="Options_Preview_Description" xml:space="preserve">
|
<data name="Options_Preview_Description" xml:space="preserve">
|
||||||
<value>顯示特殊參數預覽,如表情或 <item>。</value>
|
<value>顯示特殊參數預覽,如表情或 <item>。</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Dalamud.Plugin.SelfTest;
|
|||||||
namespace HellionChat.SelfTests;
|
namespace HellionChat.SelfTests;
|
||||||
|
|
||||||
// Optional metric capture. Accumulates 1000 steady-state frames of ImGui IO
|
// Optional metric capture. Accumulates 1000 steady-state frames of ImGui IO
|
||||||
// counters plus the plugin's full-Draw wall-time (Plugin.LastDrawMs, B5-1),
|
// counters plus the plugin's full-Draw wall-time (Plugin.LastDrawMs),
|
||||||
// then writes a single perf-baseline.json into the plugin ConfigDirectory so
|
// then writes a single perf-baseline.json into the plugin ConfigDirectory so
|
||||||
// the cycle-notes author can copy the baseline figures without a separate
|
// the cycle-notes author can copy the baseline figures without a separate
|
||||||
// profiling harness. The step only records — it never fails on a threshold
|
// profiling harness. The step only records — it never fails on a threshold
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ internal static class ThemeJsonLoader
|
|||||||
// policy from the v2.x style refactor: v1 user themes are not migrated,
|
// policy from the v2.x style refactor: v1 user themes are not migrated,
|
||||||
// they're silently ignored so the loader stays free of legacy mapping
|
// they're silently ignored so the loader stays free of legacy mapping
|
||||||
// code. Any other malformed input still throws FormatException.
|
// code. Any other malformed input still throws FormatException.
|
||||||
// B4b-2: callers must pass the logger or the default-fill warnings go silent.
|
// Callers must pass the logger or the default-fill warnings go silent.
|
||||||
public static Theme? LoadFromString(string json, ILogger? logger = null)
|
public static Theme? LoadFromString(string json, ILogger? logger = null)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(json))
|
if (string.IsNullOrWhiteSpace(json))
|
||||||
|
|||||||
@@ -88,18 +88,8 @@ internal sealed class ChunkRenderer
|
|||||||
DrawChunk(chunks[i], wrap, handler, lineWidth);
|
DrawChunk(chunks[i], wrap, handler, lineWidth);
|
||||||
|
|
||||||
if (i < chunks.Count - 1)
|
if (i < chunks.Count - 1)
|
||||||
{
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
}
|
}
|
||||||
else if (chunks[i].Link is EmotePayload && Plugin.Config.ShowEmotes)
|
|
||||||
{
|
|
||||||
// Emote payloads seem to not automatically put newlines, which
|
|
||||||
// is an issue when modern mode is disabled.
|
|
||||||
ImGui.SameLine();
|
|
||||||
// Use default ImGui behavior for newlines.
|
|
||||||
ImGui.TextUnformatted("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawChunk(
|
private void DrawChunk(
|
||||||
@@ -118,31 +108,6 @@ internal sealed class ChunkRenderer
|
|||||||
if (chunk is not TextChunk text)
|
if (chunk is not TextChunk text)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (chunk.Link is EmotePayload emotePayload && Plugin.Config.ShowEmotes)
|
|
||||||
{
|
|
||||||
var emoteSize = ImGui.CalcTextSize("W");
|
|
||||||
emoteSize = emoteSize with { Y = emoteSize.X } * 1.5f;
|
|
||||||
|
|
||||||
// TextWrap doesn't work for emotes, so we have to wrap them manually
|
|
||||||
if (ImGui.GetContentRegionAvail().X < emoteSize.X)
|
|
||||||
ImGui.NewLine();
|
|
||||||
|
|
||||||
// We only draw a dummy if it is still loading, in the case it failed we draw the actual name
|
|
||||||
var image = EmoteCache.GetEmote(emotePayload.Code);
|
|
||||||
if (image is { Failed: false })
|
|
||||||
{
|
|
||||||
if (image.IsLoaded)
|
|
||||||
image.Draw(emoteSize);
|
|
||||||
else
|
|
||||||
ImGui.Dummy(emoteSize);
|
|
||||||
|
|
||||||
if (ImGui.IsItemHovered())
|
|
||||||
ImGuiUtil.Tooltip(emotePayload.Code);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var colour = text.Foreground;
|
var colour = text.Foreground;
|
||||||
if (colour == null && text.FallbackColour != null)
|
if (colour == null && text.FallbackColour != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -901,7 +901,10 @@ internal sealed class InputBar
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
// Persisted flag -- write it here too, or turning it back off
|
||||||
|
// never reaches the config file.
|
||||||
Plugin.Config.ScreenshotMode = !Plugin.Config.ScreenshotMode;
|
Plugin.Config.ScreenshotMode = !Plugin.Config.ScreenshotMode;
|
||||||
|
Plugin.Instance.SaveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|||||||
@@ -158,6 +158,11 @@ internal sealed class MessageList
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Claim the shared handler, so a popup opened here stays with this
|
||||||
|
// window instead of being cleared by whichever surface draws first.
|
||||||
|
if (_handler is not null)
|
||||||
|
_handler.ActiveSurface = this;
|
||||||
|
|
||||||
// No own ImRaii.Child here — MainWindow already wraps the message
|
// No own ImRaii.Child here — MainWindow already wraps the message
|
||||||
// area in one. Nesting would give the window two stacked scrolls
|
// area in one. Nesting would give the window two stacked scrolls
|
||||||
// and a runaway content-height computation.
|
// and a runaway content-height computation.
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ internal sealed class ChatTab
|
|||||||
private readonly Plugin _plugin;
|
private readonly Plugin _plugin;
|
||||||
private readonly SettingsWidgets _w;
|
private readonly SettingsWidgets _w;
|
||||||
|
|
||||||
private string _blockedEmoteInput = string.Empty;
|
|
||||||
|
|
||||||
public ChatTab(Plugin plugin, TokenResolver resolver)
|
public ChatTab(Plugin plugin, TokenResolver resolver)
|
||||||
{
|
{
|
||||||
_plugin = plugin;
|
_plugin = plugin;
|
||||||
@@ -129,17 +127,6 @@ internal sealed class ChatTab
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
_w.Section(
|
|
||||||
ImGui.GetID("chat.emotes"u8),
|
|
||||||
HellionStrings.Settings_Section_Emotes,
|
|
||||||
open: false
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
DrawEmotes();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
_w.Section(
|
_w.Section(
|
||||||
ImGui.GetID("chat.autotranslate"u8),
|
ImGui.GetID("chat.autotranslate"u8),
|
||||||
@@ -157,66 +144,4 @@ internal sealed class ChatTab
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PRIVACY.md names the switch below as the way to stop the one outbound
|
|
||||||
// call the plugin makes, and it had no control at all since May. A
|
|
||||||
// documented opt-out that lives only in the JSON is not an opt-out.
|
|
||||||
private void DrawEmotes()
|
|
||||||
{
|
|
||||||
_w.ToggleRow(
|
|
||||||
ImGui.GetID("chat.emotes.show"u8),
|
|
||||||
Language.Options_ShowEmotes_Name,
|
|
||||||
Language.Options_ShowEmotes_Desc,
|
|
||||||
() => Plugin.Config.ShowEmotes,
|
|
||||||
v => Plugin.Config.ShowEmotes = v
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!Plugin.Config.ShowEmotes)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ImGui.Spacing();
|
|
||||||
ImGui.TextUnformatted(
|
|
||||||
EmoteCache.State == EmoteCache.LoadingState.Done
|
|
||||||
? $"{Language.Options_Emote_Loaded} {EmoteCache.SortedCodeArray.Length:N0} ({Language.Options_Emote_Ready})"
|
|
||||||
: $"{Language.Options_Emote_Loaded} {Language.Options_Emote_NotReady}"
|
|
||||||
);
|
|
||||||
|
|
||||||
ImGui.Spacing();
|
|
||||||
ImGui.TextUnformatted(Language.Options_Emote_BlockedEmotes);
|
|
||||||
|
|
||||||
// A blocked code stops that one emote from ever being drawn or
|
|
||||||
// downloaded, which is a finer instrument than switching emotes off
|
|
||||||
// wholesale. The list has been in the config since v1.0 with nowhere to
|
|
||||||
// edit it.
|
|
||||||
ImGui.SetNextItemWidth(220f * ImGuiHelpers.GlobalScale);
|
|
||||||
ImGui.InputText("##hc-blocked-emote", ref _blockedEmoteInput, 64);
|
|
||||||
ImGui.SameLine();
|
|
||||||
|
|
||||||
var candidate = _blockedEmoteInput.Trim();
|
|
||||||
using (ImRaii.Disabled(candidate.Length == 0))
|
|
||||||
{
|
|
||||||
if (ImGui.Button(HellionStrings.Settings_Emotes_Block))
|
|
||||||
{
|
|
||||||
lock (_plugin.ConfigMapsLock)
|
|
||||||
Plugin.Config.BlockedEmotes.Add(candidate);
|
|
||||||
_blockedEmoteInput = string.Empty;
|
|
||||||
_plugin.SaveConfig();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Snapshot: the remove button mutates the set inside the loop.
|
|
||||||
foreach (var blocked in Plugin.Config.BlockedEmotes.OrderBy(e => e).ToList())
|
|
||||||
{
|
|
||||||
using var id = ImRaii.PushId(blocked);
|
|
||||||
if (ImGuiUtil.IconButton(FontAwesomeIcon.Trash, "##remove"))
|
|
||||||
{
|
|
||||||
lock (_plugin.ConfigMapsLock)
|
|
||||||
Plugin.Config.BlockedEmotes.Remove(blocked);
|
|
||||||
_plugin.SaveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui.SameLine();
|
|
||||||
ImGui.TextUnformatted(blocked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,14 +187,14 @@ internal sealed class WindowTab
|
|||||||
_w.ToggleRow(
|
_w.ToggleRow(
|
||||||
ImGui.GetID("window.hide.uihidden"u8),
|
ImGui.GetID("window.hide.uihidden"u8),
|
||||||
Language.Options_HideWhenUiHidden_Name,
|
Language.Options_HideWhenUiHidden_Name,
|
||||||
Language.Options_HideWhenUiHidden_Description,
|
string.Format(Language.Options_HideWhenUiHidden_Description, Plugin.PluginName),
|
||||||
() => Plugin.Config.HideWhenUiHidden,
|
() => Plugin.Config.HideWhenUiHidden,
|
||||||
v => Plugin.Config.HideWhenUiHidden = v
|
v => Plugin.Config.HideWhenUiHidden = v
|
||||||
);
|
);
|
||||||
_w.ToggleRow(
|
_w.ToggleRow(
|
||||||
ImGui.GetID("window.hide.loading"u8),
|
ImGui.GetID("window.hide.loading"u8),
|
||||||
Language.Options_HideInLoadingScreens_Name,
|
Language.Options_HideInLoadingScreens_Name,
|
||||||
Language.Options_HideInLoadingScreens_Description,
|
string.Format(Language.Options_HideInLoadingScreens_Description, Plugin.PluginName),
|
||||||
() => Plugin.Config.HideInLoadingScreens,
|
() => Plugin.Config.HideInLoadingScreens,
|
||||||
v => Plugin.Config.HideInLoadingScreens = v
|
v => Plugin.Config.HideInLoadingScreens = v
|
||||||
);
|
);
|
||||||
@@ -212,7 +212,7 @@ internal sealed class WindowTab
|
|||||||
_w.ToggleRow(
|
_w.ToggleRow(
|
||||||
ImGui.GetID("window.hide.cutscenes"u8),
|
ImGui.GetID("window.hide.cutscenes"u8),
|
||||||
Language.Options_HideDuringCutscenes_Name,
|
Language.Options_HideDuringCutscenes_Name,
|
||||||
Language.Options_HideDuringCutscenes_Description,
|
string.Format(Language.Options_HideDuringCutscenes_Description, Plugin.PluginName),
|
||||||
() => Plugin.Config.HideDuringCutscenes,
|
() => Plugin.Config.HideDuringCutscenes,
|
||||||
v => Plugin.Config.HideDuringCutscenes = v
|
v => Plugin.Config.HideDuringCutscenes = v
|
||||||
);
|
);
|
||||||
@@ -226,7 +226,7 @@ internal sealed class WindowTab
|
|||||||
_w.ToggleRow(
|
_w.ToggleRow(
|
||||||
ImGui.GetID("window.hide.notloggedin"u8),
|
ImGui.GetID("window.hide.notloggedin"u8),
|
||||||
Language.Options_HideWhenNotLoggedIn_Name,
|
Language.Options_HideWhenNotLoggedIn_Name,
|
||||||
Language.Options_HideWhenNotLoggedIn_Description,
|
string.Format(Language.Options_HideWhenNotLoggedIn_Description, Plugin.PluginName),
|
||||||
() => Plugin.Config.HideWhenNotLoggedIn,
|
() => Plugin.Config.HideWhenNotLoggedIn,
|
||||||
v => Plugin.Config.HideWhenNotLoggedIn = v
|
v => Plugin.Config.HideWhenNotLoggedIn = v
|
||||||
);
|
);
|
||||||
@@ -243,7 +243,7 @@ internal sealed class WindowTab
|
|||||||
_w.ToggleRow(
|
_w.ToggleRow(
|
||||||
ImGui.GetID("window.tooltips.native"u8),
|
ImGui.GetID("window.tooltips.native"u8),
|
||||||
Language.Options_NativeItemTooltips_Name,
|
Language.Options_NativeItemTooltips_Name,
|
||||||
Language.Options_NativeItemTooltips_Description,
|
string.Format(Language.Options_NativeItemTooltips_Description, Plugin.PluginName),
|
||||||
() => Plugin.Config.NativeItemTooltips,
|
() => Plugin.Config.NativeItemTooltips,
|
||||||
v => Plugin.Config.NativeItemTooltips = v
|
v => Plugin.Config.NativeItemTooltips = v
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ internal sealed class TopTabBar
|
|||||||
for (var i = 0; i < tabs.Count; i++)
|
for (var i = 0; i < tabs.Count; i++)
|
||||||
{
|
{
|
||||||
var tab = tabs[i];
|
var tab = tabs[i];
|
||||||
// POP-1b: a popped-out tab is owned by its pop-out window, not the main
|
// A popped-out tab is owned by its pop-out window, not the main
|
||||||
// strip (1.5.6 exclusivity). Gate on the pool, not Tab.PopOut (stale flag).
|
// strip (1.5.6 exclusivity). Gate on the pool, not Tab.PopOut (stale flag).
|
||||||
if (_pool.IsOpen(tab.Identifier))
|
if (_pool.IsOpen(tab.Identifier))
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ internal sealed class InputPreview : Window
|
|||||||
_handlerLender.ResetCounter();
|
_handlerLender.ResetCounter();
|
||||||
|
|
||||||
var handler = _handlerLender.Borrow();
|
var handler = _handlerLender.Borrow();
|
||||||
|
handler.ActiveSurface = this;
|
||||||
_chunkRenderer.DrawChunks(
|
_chunkRenderer.DrawChunks(
|
||||||
_previewMessage!.Content,
|
_previewMessage!.Content,
|
||||||
wrap: true,
|
wrap: true,
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ internal sealed class ChannelPopoutWindow : Window, IFocusableChatWindow
|
|||||||
if (Bound is null)
|
if (Bound is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// POP-1f: the bound tab is live-visible in this pop-out, so it carries no
|
// The bound tab is live-visible in this pop-out, so it carries no
|
||||||
// unread badge — mirror MainWindow's per-frame zero for the active tab.
|
// unread badge — mirror MainWindow's per-frame zero for the active tab.
|
||||||
// View-state reset only (tab.Messages store is untouched).
|
// View-state reset only (tab.Messages store is untouched).
|
||||||
Bound.Unread = 0;
|
Bound.Unread = 0;
|
||||||
|
|||||||
@@ -310,9 +310,9 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
|
|||||||
TabLifecycleHelpers.OnTabActivated(reseed, active);
|
TabLifecycleHelpers.OnTabActivated(reseed, active);
|
||||||
}
|
}
|
||||||
|
|
||||||
// POP-1c: a popped-out tab must not stay the main window's active surface
|
// A popped-out tab must not stay the main window's active surface
|
||||||
// (1.5.6 exclusivity). Re-anchor to the first non-popped tab the moment the
|
// (1.5.6 exclusivity). Re-anchor to the first non-popped tab the moment the
|
||||||
// active one is popped; null when every tab is popped (POP-1d guards Draw).
|
// active one is popped; null when every tab is popped, which Draw guards for.
|
||||||
// Runs post-seed, before the sidebar/top-tab draw, so the popped tab never
|
// Runs post-seed, before the sidebar/top-tab draw, so the popped tab never
|
||||||
// renders. Idempotent: PickMainActiveTab returns the same reference once
|
// renders. Idempotent: PickMainActiveTab returns the same reference once
|
||||||
// settled, so OnTabActivated fires only on the pop frame.
|
// settled, so OnTabActivated fires only on the pop frame.
|
||||||
|
|||||||
@@ -66,8 +66,23 @@ internal static class ColourUtil
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Cherry-picked from ChatTwo upstream a51789b + 5b58513 (Infiziert90,
|
||||||
|
// 2026-06-12). Both guards belong together -- a51789b alone turns a zero
|
||||||
|
// colour into opaque black, which then slips past the invisible-text
|
||||||
|
// guard in ChunkUtil and paints over the inherited colour.
|
||||||
|
// TEST-MIRROR: ../../../Hellion Build test/Util/ColourUtilTests.cs
|
||||||
|
// ---------------------------------------------------------------
|
||||||
public static unsafe uint ArgbToRgba(uint x)
|
public static unsafe uint ArgbToRgba(uint x)
|
||||||
{
|
{
|
||||||
|
if (x == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// The game omits the alpha byte on some GlobalValue colours, and the
|
||||||
|
// swap below would leave alpha at 0 -- invisible text.
|
||||||
|
if (x <= 0x00FFFFFFu)
|
||||||
|
x |= 0xFF000000u;
|
||||||
|
|
||||||
var buf = (byte*)&x;
|
var buf = (byte*)&x;
|
||||||
(buf[1], buf[2], buf[3], buf[0]) = (buf[0], buf[1], buf[2], buf[3]);
|
(buf[1], buf[2], buf[3], buf[0]) = (buf[0], buf[1], buf[2], buf[3]);
|
||||||
return x;
|
return x;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using System;
|
|||||||
namespace HellionChat.Util;
|
namespace HellionChat.Util;
|
||||||
|
|
||||||
// Plugin.LogProxy bridge for consumers that cannot take a logger via the
|
// Plugin.LogProxy bridge for consumers that cannot take a logger via the
|
||||||
// constructor: static helpers (EmoteCache et al.), Dalamud-reflected types
|
// constructor: static helpers, Dalamud-reflected types
|
||||||
// (Configuration), data classes with mass instantiation (Message) and
|
// (Configuration), data classes with mass instantiation (Message) and
|
||||||
// instance classes that only log from static methods (FontManager).
|
// instance classes that only log from static methods (FontManager).
|
||||||
internal interface IPluginLogProxy
|
internal interface IPluginLogProxy
|
||||||
|
|||||||
@@ -68,6 +68,14 @@ internal class UriPayload(Uri uri) : Payload
|
|||||||
protected override byte[] EncodeImpl() => throw new NotImplementedException();
|
protected override byte[] EncodeImpl() => throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kept for reading, not for writing. BetterTTV emotes came out of the plugin in
|
||||||
|
// 2.0.2, but messages stored before that carry this payload in the database and
|
||||||
|
// have to stay readable -- MessageStore writes the type byte for it, so removing
|
||||||
|
// the type would make those rows fail to deserialise. Nothing produces one any
|
||||||
|
// more; a stored emote now renders as its own code, which is the text the user
|
||||||
|
// typed in the first place.
|
||||||
|
//
|
||||||
|
// The 0x53 below and PayloadMessagePackType.Emote must never be reassigned.
|
||||||
internal class EmotePayload : Payload
|
internal class EmotePayload : Payload
|
||||||
{
|
{
|
||||||
public override PayloadType Type => (PayloadType)0x53;
|
public override PayloadType Type => (PayloadType)0x53;
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace HellionChat.Util;
|
||||||
|
|
||||||
|
// Chat surfaces share one payload handler and all render it in the same frame.
|
||||||
|
// A popup belongs to the surface that opened it; the others must leave its
|
||||||
|
// state alone instead of reading "no popup here" as "popup was closed".
|
||||||
|
internal static class PopupOwnership
|
||||||
|
{
|
||||||
|
// Reference identity on purpose -- two surfaces can compare equal without
|
||||||
|
// being the same window.
|
||||||
|
internal static bool Owns(object? owner, object? surface) =>
|
||||||
|
owner is not null && ReferenceEquals(owner, surface);
|
||||||
|
}
|
||||||
@@ -165,7 +165,7 @@ internal static class TabLifecycleHelpers
|
|||||||
|
|
||||||
// Sectioned sidebar render order (1.5.6 parity): persistent → pinned TempTabs →
|
// Sectioned sidebar render order (1.5.6 parity): persistent → pinned TempTabs →
|
||||||
// unpinned TempTabs. Returns indices into the live tab list so the list order is
|
// unpinned TempTabs. Returns indices into the live tab list so the list order is
|
||||||
// never mutated and DrawRow keeps each tab's ORIGINAL index for PushID. POP-1a:
|
// never mutated and DrawRow keeps each tab's ORIGINAL index for PushID.
|
||||||
// isPoppedOut excludes tabs bound to a pop-out window — an excluded tab draws no
|
// isPoppedOut excludes tabs bound to a pop-out window — an excluded tab draws no
|
||||||
// row and its pool's section header gates on the first tab actually reached. Pure
|
// row and its pool's section header gates on the first tab actually reached. Pure
|
||||||
// + Dalamud-free so the Build-Suite can pin it.
|
// + Dalamud-free so the Build-Suite can pin it.
|
||||||
@@ -215,7 +215,7 @@ internal static class TabLifecycleHelpers
|
|||||||
return persistent;
|
return persistent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// POP-1c: returns the tab the main window should display — the current tab if it
|
// Returns the tab the main window should display — the current tab if it
|
||||||
// is not popped out, else the FIRST non-popped tab in list order, else null when
|
// is not popped out, else the FIRST non-popped tab in list order, else null when
|
||||||
// every tab is popped. NOTE: deliberately NOT ResetActiveTabIfRemoved's
|
// every tab is popped. NOTE: deliberately NOT ResetActiveTabIfRemoved's
|
||||||
// unconditional Tabs[0] — Tabs[0] may itself be popped and would re-trigger the
|
// unconditional Tabs[0] — Tabs[0] may itself be popped and would re-trigger the
|
||||||
@@ -243,7 +243,7 @@ internal static class TabLifecycleHelpers
|
|||||||
Popout,
|
Popout,
|
||||||
}
|
}
|
||||||
|
|
||||||
// POP-1f: the alreadyPopped case is the whole reason this is a function.
|
// The alreadyPopped case is the whole reason this is a function.
|
||||||
//
|
//
|
||||||
// Revealing a popped-out tab in the main window looks like it does nothing,
|
// Revealing a popped-out tab in the main window looks like it does nothing,
|
||||||
// and then does something worse: PickMainActiveTab re-anchors on the next
|
// and then does something worse: PickMainActiveTab re-anchors on the next
|
||||||
@@ -268,12 +268,12 @@ internal static class TabLifecycleHelpers
|
|||||||
_ => switchAlways && !alreadyPopped ? TellReveal.MainWindow : TellReveal.None,
|
_ => switchAlways && !alreadyPopped ? TellReveal.MainWindow : TellReveal.None,
|
||||||
};
|
};
|
||||||
|
|
||||||
// POP-1e: popout-aware sibling of WrapTabIndex for the ChatTabForward/Backward
|
// Popout-aware sibling of WrapTabIndex for the ChatTabForward/Backward
|
||||||
// keybind. Steps from current by delta's sign (±1), wrapping, and returns the
|
// keybind. Steps from current by delta's sign (±1), wrapping, and returns the
|
||||||
// first index whose tab is NOT popped out within tabs.Count steps; returns current
|
// first index whose tab is NOT popped out within tabs.Count steps; returns current
|
||||||
// when every other tab is popped (no-op), the list is empty, or a single tab.
|
// when every other tab is popped (no-op), the list is empty, or a single tab.
|
||||||
// Skipping popped tabs here is what stops the POP-1c re-anchor from making the
|
// Skipping popped tabs here is what stops the PickMainActiveTab re-anchor
|
||||||
// cycle stick (CYCLE-1). Pure + Dalamud-free.
|
// from making the cycle stick. Pure + Dalamud-free.
|
||||||
// TEST-MIRROR: ../../../Hellion Build test/_Helpers/NextMainTabIndexTests.cs
|
// TEST-MIRROR: ../../../Hellion Build test/_Helpers/NextMainTabIndexTests.cs
|
||||||
internal static int NextMainTabIndex(
|
internal static int NextMainTabIndex(
|
||||||
int current,
|
int current,
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 199 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 262 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 45 KiB |
@@ -104,11 +104,12 @@
|
|||||||
},
|
},
|
||||||
"NAudio.WinMM": {
|
"NAudio.WinMM": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[2.3.0, )",
|
"requested": "[3.0.1, )",
|
||||||
"resolved": "2.3.0",
|
"resolved": "3.0.1",
|
||||||
"contentHash": "5G1dRjsZm50T3luyuqcmI2BSvj3K4ZJaD/x776/0Epj88qOsOryDZG40+MufwIk1UFJSFWhRobBqtJYFc8Ss4g==",
|
"contentHash": "qeedyr0TtKWjEirwVG2ZkL1ecYVUfyh+s0YLsau6XC2FqyqT42LfR96kVEuDdv6U9LUp+aNGDiHO5MK/td0BAA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"NAudio.Core": "2.3.0"
|
"NAudio.Core": "3.0.1",
|
||||||
|
"NAudio.Midi": "3.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Pidgin": {
|
"Pidgin": {
|
||||||
@@ -377,8 +378,19 @@
|
|||||||
},
|
},
|
||||||
"NAudio.Core": {
|
"NAudio.Core": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.3.0",
|
"resolved": "3.0.1",
|
||||||
"contentHash": "jMd7r6dB6tAtXhOYL58ntPqwERNm1/Rhw5MKOIYvsnXzuX+PTGsa2VMam6n0npZYSwlSidKa4GAm4bFcXFUlcg=="
|
"contentHash": "3fJ6UnkoiNBeeczKd9OozvcE85FvtyYCykmfzEbFW0uB0uT2+keKdconUGkz9qYlhaq1RJDTFptXOooQBYLijA==",
|
||||||
|
"dependencies": {
|
||||||
|
"System.Numerics.Tensors": "9.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Midi": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.0.1",
|
||||||
|
"contentHash": "/YiJWtG6EAIt//BYgd6SMudDT/A4cPgX8qpTbV9sxfJenSli8ujDEkPNF/Fa73YCeimK2bA0K3BmsgQ4olN+Nw==",
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "3.0.1"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
@@ -406,6 +418,11 @@
|
|||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "10.0.7",
|
"resolved": "10.0.7",
|
||||||
"contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ=="
|
"contentHash": "WbmDLeTPYhEzXhvYVioTVn/D1XX6bovyny9n5p8Zxtf03+eY385RB818teZm6n+fA63iZNvng0/Np4tLuhkMhQ=="
|
||||||
|
},
|
||||||
|
"System.Numerics.Tensors": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "9.0.0",
|
||||||
|
"contentHash": "hyJB4UlpAi19Xr9AXzu2NuagKC4lPfHObNMEAA0HmqFz2rX7wKgzeYzO/jM/eBHDhnUGFFEjk5cOoJaxqg5J4A=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-38
@@ -20,8 +20,8 @@ Last reviewed: 2026-08-18 (HellionChat v1.12.0).
|
|||||||
`pluginConfigs/HellionChat/` directory.
|
`pluginConfigs/HellionChat/` directory.
|
||||||
- The plugin does not phone home. No telemetry, no analytics, no crash reporter, no usage counter,
|
- The plugin does not phone home. No telemetry, no analytics, no crash reporter, no usage counter,
|
||||||
no remote update check beyond what Dalamud itself does.
|
no remote update check beyond what Dalamud itself does.
|
||||||
- One outbound network call exists by design: the BetterTTV emote service (for chat emotes). It is
|
- As of v2.0.2 the plugin makes **no outbound network requests at all**. The one that existed, the
|
||||||
documented in detail below and can be reasoned about per request.
|
BetterTTV emote service, was removed along with the feature it served.
|
||||||
- You can export every message the plugin has stored, in Markdown, JSON or CSV. You can delete it by
|
- You can export every message the plugin has stored, in Markdown, JSON or CSV. You can delete it by
|
||||||
channel, by age, or all of it at once.
|
channel, by age, or all of it at once.
|
||||||
|
|
||||||
@@ -42,8 +42,9 @@ HellionChat keeps three kinds of state on your machine, all under
|
|||||||
ExtraChat. Public chat, NPC dialogue, system messages and battle logs are dropped on the storage
|
ExtraChat. Public chat, NPC dialogue, system messages and battle logs are dropped on the storage
|
||||||
layer and never written to disk.
|
layer and never written to disk.
|
||||||
|
|
||||||
3. **Cached emote images** (`EmoteCacheV1/` directory). Image files downloaded from BetterTTV when
|
Earlier versions kept a third item here, an `EmoteCacheV1/` directory of images downloaded from
|
||||||
an emote appears in a message you receive. See "Outbound network calls" below.
|
BetterTTV. Nothing writes to it as of v2.0.2. If you used a version before that, the directory is
|
||||||
|
still on disk and can be deleted by hand; the plugin no longer reads or creates it.
|
||||||
|
|
||||||
There is no shared state with the upstream Chat 2 plugin. `pluginConfigs/HellionChat/` is
|
There is no shared state with the upstream Chat 2 plugin. `pluginConfigs/HellionChat/` is
|
||||||
independent from `pluginConfigs/ChatTwo/`.
|
independent from `pluginConfigs/ChatTwo/`.
|
||||||
@@ -73,35 +74,23 @@ turn the retention sweep on in the settings. Until then, stored messages stay un
|
|||||||
|
|
||||||
## Outbound network calls
|
## Outbound network calls
|
||||||
|
|
||||||
HellionChat makes one kind of automatic outbound network request, inherited from upstream Chat 2 and
|
**None.** As of v2.0.2 the plugin makes no automatic outbound network requests of any kind. Both
|
||||||
documented here because "GDPR-by-design" means you should know what your client does on your behalf.
|
calls this section used to describe are gone, and the section is kept so the claim can be checked
|
||||||
The second one this section used to list, the Lodestone font download, was removed in v1.0.4 and the
|
against what it replaced rather than simply asserted.
|
||||||
font is bundled instead.
|
|
||||||
|
|
||||||
### 1. BetterTTV emote service (`api.betterttv.net`, `cdn.betterttv.net`)
|
### 1. BetterTTV emote service (removed in v2.0.2)
|
||||||
|
|
||||||
- **What it does:** When a chat message arrives that references a BetterTTV emote, the plugin asks
|
Until v2.0.2 the plugin fetched an emote list from `api.betterttv.net` once per session at startup,
|
||||||
the BetterTTV API for the emote metadata and downloads the image from the BetterTTV CDN to display
|
and individual images from `cdn.betterttv.net` on demand, caching them in `EmoteCacheV1/`. The
|
||||||
it inline.
|
startup fetch meant BetterTTV's edge saw your IP as soon as the plugin loaded, whether or not an
|
||||||
- **What is sent:** A standard HTTPS GET request. Your IP address reaches BetterTTV (unavoidable for
|
emote ever appeared in your chat. A setting could switch it off, but it was on by default.
|
||||||
any HTTPS request); the request itself contains no identifying user data, no character name, no
|
|
||||||
message text. Only the emote ID being looked up is in the URL path.
|
|
||||||
- **When it triggers:**
|
|
||||||
- The emote _list_ (global emotes plus the top-1500 community emotes over fifteen API pages) is
|
|
||||||
fetched from `api.betterttv.net` once per session at plugin startup, provided the **Show
|
|
||||||
emotes** option is on. This first list-fetch happens before any chat message has arrived.
|
|
||||||
BetterTTV's edge therefore sees your IP as soon as the plugin loads, not only after an emote is
|
|
||||||
mentioned.
|
|
||||||
- The individual emote _images_ on `cdn.betterttv.net` are fetched on demand, only when an
|
|
||||||
incoming chat message contains a token matching one of the cached IDs. These are cached locally
|
|
||||||
(`EmoteCacheV1/`) and reused across sessions.
|
|
||||||
- **Cached:** Yes, in `EmoteCacheV1/`. A given emote is downloaded once per machine and reused.
|
|
||||||
- **How to opt out:** Turn off the **Show emotes** option in Settings → Chat → Display modes. With
|
|
||||||
it disabled, the emote cache does not load and no requests to BetterTTV are made for the rest of
|
|
||||||
the session.
|
|
||||||
- **BetterTTV's privacy policy:** <https://betterttv.com/privacy>
|
|
||||||
|
|
||||||
Source: `HellionChat/EmoteCache.cs`.
|
The feature was removed rather than defaulted off: BetterTTV moved its shared-emote endpoint behind
|
||||||
|
authentication, which left 54 mostly static images from a set of 65, and that is not worth a
|
||||||
|
connection nobody asked for. The download path, the cache directory and the renderer are gone from
|
||||||
|
the source.
|
||||||
|
|
||||||
|
Messages already stored with emotes in them remain readable and show the code that was typed.
|
||||||
|
|
||||||
### 2. Square Enix Lodestone font (removed in v1.0.4)
|
### 2. Square Enix Lodestone font (removed in v1.0.4)
|
||||||
|
|
||||||
@@ -204,13 +193,12 @@ messages. Existing data needs the retroactive cleanup to apply retroactively, by
|
|||||||
|
|
||||||
| Party | Why they appear | What reaches them | Their privacy policy |
|
| Party | Why they appear | What reaches them | Their privacy policy |
|
||||||
| ---------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------------------- |
|
| ---------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------------------- |
|
||||||
| BetterTTV (NightDev LLC) | Optional emote rendering | HTTPS request for an emote ID; your IP | <https://betterttv.com/privacy> |
|
|
||||||
| Hellion Forge (Gitea, self-hosted by Hellion Online Media) | Plugin distribution via custom repo, issue tracker | Whatever the Gitea instance sees from any HTTPS request to a public repo | <https://hellion-media.de/datenschutz> |
|
| Hellion Forge (Gitea, self-hosted by Hellion Online Media) | Plugin distribution via custom repo, issue tracker | Whatever the Gitea instance sees from any HTTPS request to a public repo | <https://hellion-media.de/datenschutz> |
|
||||||
| Dalamud / XIVLauncher (goatcorp) | Plugin loader, font subsystem, repo polling | Whatever Dalamud reports for itself; out of HellionChat's scope | <https://github.com/goatcorp/Dalamud> |
|
| Dalamud / XIVLauncher (goatcorp) | Plugin loader, font subsystem, repo polling | Whatever Dalamud reports for itself; out of HellionChat's scope | <https://github.com/goatcorp/Dalamud> |
|
||||||
|
|
||||||
The Hellion Forge Gitea instance and the Dalamud/XIVLauncher loader are unavoidable for anyone using
|
Both are unavoidable for anyone using HellionChat through Dalamud at all. Since v2.0.2 the plugin
|
||||||
HellionChat through Dalamud at all. BetterTTV is the only third party HellionChat introduces on top
|
introduces no third party on top of that baseline: BetterTTV was the only one, and it left with the
|
||||||
of that baseline, and it is opt-out via settings.
|
emote feature.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -223,11 +211,10 @@ plugin pulls in:
|
|||||||
- `Microsoft.Data.Sqlite`: local SQLite access, no network.
|
- `Microsoft.Data.Sqlite`: local SQLite access, no network.
|
||||||
- `morelinq`: LINQ helpers, no network.
|
- `morelinq`: LINQ helpers, no network.
|
||||||
- `Pidgin`: parser combinators, no network.
|
- `Pidgin`: parser combinators, no network.
|
||||||
- `SixLabors.ImageSharp`: image decoding (used for the BetterTTV emote pipeline), no network on its
|
- `SixLabors.ImageSharp`: image decoding (icon handling), no network on its own.
|
||||||
own.
|
|
||||||
|
|
||||||
The single network call listed under "Outbound network calls" is written directly in HellionChat's
|
No dependency opens a connection on the plugin's behalf, and since v2.0.2 the plugin opens none
|
||||||
own source, not delegated to a dependency.
|
itself either.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
|
[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
|
[](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
|
||||||
[](https://github.com/goatcorp/Dalamud)
|
[](https://github.com/goatcorp/Dalamud)
|
||||||
[](https://dotnet.microsoft.com/)
|
[](https://dotnet.microsoft.com/)
|
||||||
[](https://www.finalfantasyxiv.com/)
|
[](https://www.finalfantasyxiv.com/)
|
||||||
@@ -11,14 +11,17 @@
|
|||||||
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
|
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
**Version 2.0.1** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally
|
**Version 2.0.3** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally
|
||||||
forked from [Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
|
forked from [Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
|
||||||
|
|
||||||
Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine
|
Hellion Chat is a privacy-first chat plugin that began as a fork of Chat 2. The core it grew from
|
||||||
comes from Chat 2 (message store, channel logic, hook system), and most keyboard shortcuts continue
|
is still recognisable — the message store, the channel logic, the hook system — and most keyboard
|
||||||
to work as you'd expect. What changes: stricter privacy defaults out of the box, custom slash
|
shortcuts work the way you would expect. Everything above that has been rebuilt: as of v2.0.0 every
|
||||||
commands under `/hellionchat`, no web interface, and as of v1.1.0, a theme engine as a step toward a
|
window is drawn by the plugin rather than by ImGui defaults.
|
||||||
distinct UI look and feel.
|
|
||||||
|
What sets it apart from upstream: stricter privacy defaults out of the box, a first-run wizard that
|
||||||
|
asks what may be stored before anything is, a theme engine with ten built-in palettes, 25 UI
|
||||||
|
languages, and no web interface. Slash commands live under `/hellion`.
|
||||||
|
|
||||||
The data-handling focus is on GDPR/EU, US, and JP regulations, as far as practically applicable for
|
The data-handling focus is on GDPR/EU, US, and JP regulations, as far as practically applicable for
|
||||||
a chat plugin: per-channel retention periods, granular filters, and self-service data export. A full
|
a chat plugin: per-channel retention periods, granular filters, and self-service data export. A full
|
||||||
@@ -31,6 +34,10 @@ fundamental rework and cherry-picks are no longer portable. From here, Hellion C
|
|||||||
independent codebase — background and attribution in
|
independent codebase — background and attribution in
|
||||||
[`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md).
|
[`docs/UPSTREAM_SYNC.md`](docs/UPSTREAM_SYNC.md).
|
||||||
|
|
||||||
|
> **A note on plugins.** Third-party plugins are a grey area in Final Fantasy XIV: Square Enix's
|
||||||
|
> terms of service do not cover them, and Naoki Yoshida has publicly asked that people not advertise
|
||||||
|
> them. Keep the subject out of Say, Yell, Shout and every other public channel in game.
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|
||||||
Hellion Chat is built on [Chat 2](https://github.com/Infiziert90/ChatTwo) by
|
Hellion Chat is built on [Chat 2](https://github.com/Infiziert90/ChatTwo) by
|
||||||
@@ -77,9 +84,9 @@ Hellion Chat is developed under **Hellion Forge**, the specialized modding and p
|
|||||||
- **Export** to Markdown, JSON, or CSV via the Dalamud file dialog (GDPR Art. 15 right of access).
|
- **Export** to Markdown, JSON, or CSV via the Dalamud file dialog (GDPR Art. 15 right of access).
|
||||||
Narrow it by channel group, by age in days, or by a substring of the sender's name.
|
Narrow it by channel group, by age in days, or by a substring of the sender's name.
|
||||||
- **Full privacy overview** in [`PRIVACY.md`](PRIVACY.md) and third-party components in
|
- **Full privacy overview** in [`PRIVACY.md`](PRIVACY.md) and third-party components in
|
||||||
[`docs/THIRD_PARTY_NOTICES.md`](docs/THIRD_PARTY_NOTICES.md): what is stored, the single outbound
|
[`docs/THIRD_PARTY_NOTICES.md`](docs/THIRD_PARTY_NOTICES.md): what is stored, an explicit
|
||||||
call that exists and how to switch it off (BetterTTV), an explicit no-telemetry statement,
|
no-telemetry statement, and the mapping of GDPR rights (Art. 15/17/18/20/21) to concrete plugin
|
||||||
and the mapping of GDPR rights (Art. 15/17/18/20/21) to concrete plugin functions.
|
functions. As of v2.0.2 the plugin makes no outbound network requests at all.
|
||||||
|
|
||||||
### Onboarding
|
### Onboarding
|
||||||
|
|
||||||
@@ -136,7 +143,6 @@ Deuteranopia/Protanopia-safe (red-green color blindness) based on the Wong/Okabe
|
|||||||
|
|
||||||
### Stability
|
### Stability
|
||||||
|
|
||||||
- BetterTTV cache crash fix (null key handling).
|
|
||||||
- Font atlas build fallback for missing system fonts.
|
- Font atlas build fallback for missing system fonts.
|
||||||
- Defensive wrapping of all migration operations.
|
- Defensive wrapping of all migration operations.
|
||||||
|
|
||||||
@@ -169,7 +175,7 @@ HellionChat/
|
|||||||
│ ├── Inter-OFL.txt # OFL-1.1 license text (bundled with font)
|
│ ├── Inter-OFL.txt # OFL-1.1 license text (bundled with font)
|
||||||
│ └── Language*.resx # Upstream localization (Crowdin)
|
│ └── Language*.resx # Upstream localization (Crowdin)
|
||||||
├── Ui/
|
├── Ui/
|
||||||
│ ├── FirstRunWizard.cs # Three-profile onboarding
|
│ ├── FirstRunWizard.cs # Four-step, four-profile onboarding
|
||||||
│ ├── StyleEngine/ # Tokens, widgets and the theme push
|
│ ├── StyleEngine/ # Tokens, widgets and the theme push
|
||||||
│ ├── Windows/ # Main, settings, popouts, DB viewer
|
│ ├── Windows/ # Main, settings, popouts, DB viewer
|
||||||
│ └── Components/Settings/Tabs/
|
│ └── Components/Settings/Tabs/
|
||||||
@@ -265,9 +271,6 @@ Linux / XIVLauncher Core:
|
|||||||
```bash
|
```bash
|
||||||
mv ~/.xlcore/pluginConfigs/ChatTwo/chat-sqlite.db \
|
mv ~/.xlcore/pluginConfigs/ChatTwo/chat-sqlite.db \
|
||||||
~/.xlcore/pluginConfigs/HellionChat/chat-sqlite.db
|
~/.xlcore/pluginConfigs/HellionChat/chat-sqlite.db
|
||||||
[ -d ~/.xlcore/pluginConfigs/ChatTwo/EmoteCacheV1 ] && \
|
|
||||||
mv ~/.xlcore/pluginConfigs/ChatTwo/EmoteCacheV1 \
|
|
||||||
~/.xlcore/pluginConfigs/HellionChat/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Windows / XIVLauncher:
|
Windows / XIVLauncher:
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ I respond on weekdays during European business hours.
|
|||||||
influence)
|
influence)
|
||||||
- The privacy filter in `MessageStore.cs` and the export pipeline
|
- The privacy filter in `MessageStore.cs` and the export pipeline
|
||||||
- The configuration migration logic
|
- The configuration migration logic
|
||||||
- The `EmoteCache` HTTP client and path handling
|
|
||||||
- The Auto-Tell-Tabs spawn logic and history preload
|
- The Auto-Tell-Tabs spawn logic and history preload
|
||||||
|
|
||||||
### Out of scope
|
### Out of scope
|
||||||
|
|||||||
@@ -11,6 +11,63 @@ releases as an overview and links to the release pages for details.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [2.0.3] — 2026-08-20
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The context menu never opened in a pop-out window. Right-clicking a name or an
|
||||||
|
item there did nothing at all. One payload handler is shared by the main
|
||||||
|
window, every pop-out and the input preview, and it carries a single popup
|
||||||
|
state. The main window draws first, found no open popup in its own scope, read
|
||||||
|
that as closed and cleared the state before the pop-out had drawn. A popup now
|
||||||
|
belongs to the surface that opened it and the others leave it alone.
|
||||||
|
- Screenshot mode could not be turned off. The setting is persisted, but neither
|
||||||
|
of its two toggles saved the config, so turning it on only stuck when an
|
||||||
|
unrelated save happened to follow — and once stored, turning it off never
|
||||||
|
reached the file, so it returned at every plugin load. Both toggles save now;
|
||||||
|
an install currently stuck on it needs one click.
|
||||||
|
- Text the game colours itself could render invisible. Some of those colours
|
||||||
|
arrive without an alpha byte, and the byte order swap left them fully
|
||||||
|
transparent. A colour that carries no value at all still resolves to the
|
||||||
|
colour already in effect rather than to opaque black.
|
||||||
|
|
||||||
|
## [2.0.2] — 2026-08-19
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- BetterTTV emote support, in full. The shared-emote endpoint went behind
|
||||||
|
authentication and it supplied nearly all of them; what was left is a 65-entry
|
||||||
|
global set, eleven of those on the known-broken list, so 54 largely static
|
||||||
|
images. One was animated — 492 frames at 140x140, which is 37 MB of texture
|
||||||
|
memory for a single emote. Gone with it: the download path, the on-disk cache,
|
||||||
|
the GIF renderer, the settings section, the block list, and 13 translation
|
||||||
|
keys across 50 resource files. The plugin makes no outbound network calls at
|
||||||
|
all now.
|
||||||
|
- `EmotePayload` and its MessagePack type byte deliberately stay. Messages
|
||||||
|
stored before this release carry them, and removing the type would make those
|
||||||
|
rows fail to deserialise. Nothing writes one any more; a stored emote renders
|
||||||
|
as the code that was typed. `0x53` and `PayloadMessagePackType.Emote` must
|
||||||
|
never be reassigned.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Five descriptions in the Window settings tab printed `{0}` where the plugin
|
||||||
|
name belonged. They were handed to the widget directly instead of through
|
||||||
|
`string.Format`, which the neighbouring rows do correctly. Every language was
|
||||||
|
affected including English, where it read less obviously — German puts the
|
||||||
|
placeholder at the start of the sentence, which is why it surfaced there.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- A test that walks every resource string containing a placeholder, finds each
|
||||||
|
use of it in the sources, and fails if one reaches a widget unformatted. It
|
||||||
|
was verified by falsification: reintroducing the defect turns it red.
|
||||||
|
- New preview images for the plugin installer. The previous set was from
|
||||||
|
2026-05-08 and showed the interface as it looked before the window rebuilds.
|
||||||
|
Taken with screenshot mode on, so no character names are in them.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [2.0.1] — 2026-08-19
|
## [2.0.1] — 2026-08-19
|
||||||
|
|
||||||
A same-day hotfix on 2.0.0 with nothing user-facing in it.
|
A same-day hotfix on 2.0.0 with nothing user-facing in it.
|
||||||
|
|||||||
@@ -12,6 +12,18 @@ be a poor fit for the plugin's privacy-first scope during brainstorming.
|
|||||||
|
|
||||||
## Released
|
## Released
|
||||||
|
|
||||||
|
**v2.0.2 — Emotes out, placeholders fixed (2026-08-19)** removed BetterTTV emote
|
||||||
|
support entirely. Its shared-emote endpoint went behind authentication and that was
|
||||||
|
where nearly all of them came from; what remained was 54 mostly static images, one
|
||||||
|
of them animated at 492 frames. With it went the plugin's only outbound network
|
||||||
|
call. Also fixed five settings descriptions that printed `{0}` instead of the
|
||||||
|
plugin name, and replaced the preview images, which were older than every cycle in
|
||||||
|
2.0.0.
|
||||||
|
|
||||||
|
**v2.0.1 — Hotfix (2026-08-19)** lifted MessagePack to 3.1.7 and repaired the
|
||||||
|
release workflow, which built the 2.0.0 archive successfully and then failed to
|
||||||
|
attach it.
|
||||||
|
|
||||||
**v2.0.0 — Rebuilt, Repaired, Reset (2026-08-19)** ships everything that was
|
**v2.0.0 — Rebuilt, Repaired, Reset (2026-08-19)** ships everything that was
|
||||||
developed as v1.6.0 through v1.15.0. Those versions were never published on their
|
developed as v1.6.0 through v1.15.0. Those versions were never published on their
|
||||||
own: the whole window layer was being rewritten from ImGui defaults to custom
|
own: the whole window layer was being rewritten from ImGui defaults to custom
|
||||||
@@ -66,6 +78,25 @@ follows.
|
|||||||
Native-speaker review of the AI-assisted v1.5.3 translations (13 legacy Crowdin locales) runs in
|
Native-speaker review of the AI-assisted v1.5.3 translations (13 legacy Crowdin locales) runs in
|
||||||
parallel as a continuous correction pass, gathered via the Hellion Forge Discord.
|
parallel as a continuous correction pass, gathered via the Hellion Forge Discord.
|
||||||
|
|
||||||
|
### Carried over from the 2.0.x cycle
|
||||||
|
|
||||||
|
Small items that surfaced during the 2.0.0 release and were deliberately left for
|
||||||
|
a later pass rather than rushed into a patch:
|
||||||
|
|
||||||
|
- **Comment length.** 47 comment blocks run to 12 lines or more, the longest at 41.
|
||||||
|
The task codes and personal names came out in 2.0.0; trimming the long ones needs
|
||||||
|
judgement rather than a pattern, since several carry reasoning that is now the
|
||||||
|
basis of the style reference.
|
||||||
|
- **Channel names are only translated in 10 of 25 languages.** Spanish had two of
|
||||||
|
three translated and one left in English, which was corrected. The other 15 sit
|
||||||
|
fully in English, which is correct for anyone on an English client — FFXIV ships
|
||||||
|
four client languages — but inconsistent where a language does have its own.
|
||||||
|
- **An orphaned `EmoteCacheV1/` directory** stays on disk for anyone who ran a
|
||||||
|
version before 2.0.2. Nothing reads or writes it. A one-time cleanup on load
|
||||||
|
would be tidier than asking people to delete it by hand.
|
||||||
|
- **`Metrics.Scale` uses the deprecated `ImGuiHelpers.GlobalScaleSafe`**, which is
|
||||||
|
the only compiler warning left in the build.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v1.5.6 — Settings Overhaul + Filter & Notification Polish (released 2026-05-23)
|
## v1.5.6 — Settings Overhaul + Filter & Notification Polish (released 2026-05-23)
|
||||||
|
|||||||
@@ -55,13 +55,12 @@ history, including the close of active cherry-picking in the v1.4.x cycle.
|
|||||||
## Components that touch the network
|
## Components that touch the network
|
||||||
|
|
||||||
Of everything listed above, **none** of the bundled or NuGet components opens network connections on
|
Of everything listed above, **none** of the bundled or NuGet components opens network connections on
|
||||||
their own. All outbound traffic is initiated explicitly by HellionChat's own source files and is
|
their own, and as of v2.0.2 neither does HellionChat itself. Both calls this list used to name are
|
||||||
documented in `PRIVACY.md` under "Outbound network calls":
|
gone:
|
||||||
|
|
||||||
- `HellionChat/EmoteCache.cs` → BetterTTV API + CDN (opt-out via setting)
|
- `HellionChat/EmoteCache.cs` → BetterTTV API + CDN, removed in v2.0.2 along with the emote feature.
|
||||||
|
- The Square Enix Lodestone font download (`FontManager.cs`), removed in v1.0.4 — a leftover from
|
||||||
The earlier Square Enix Lodestone font download (`FontManager.cs`) was removed in v1.0.4 — it was a
|
upstream's removed webinterface feature that was no longer consumed.
|
||||||
leftover from upstream's removed webinterface feature and was no longer consumed.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"Author": "Jon Kazama (Hellion Forge)",
|
"Author": "Jon Kazama (Hellion Forge)",
|
||||||
"Name": "Hellion Chat",
|
"Name": "Hellion Chat",
|
||||||
"InternalName": "HellionChat",
|
"InternalName": "HellionChat",
|
||||||
"AssemblyVersion": "2.0.1.0",
|
"AssemblyVersion": "2.0.3.0",
|
||||||
"Description": "A Hellion Forge plugin — privacy-focused chat replacement for FINAL FANTASY XIV, built for EU, US and JP data rules.\n\nBy default only your own conversations are stored. Public chat, NPC dialogue, system messages and battle logs are discarded at the storage layer unless you opt in. Retention windows are configurable per channel, history can be wiped retroactively, and everything can be exported on demand.\n\nFeatures:\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with preview and Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with four profiles: Privacy-First, Casual, Roleplay, Full History\n- Multi-language UI (24 locales) with live language switching\n- Own config and database — no shared state with other plugins\n\nBased on Chat 2 by Infi and Anna (EUPL-1.2).\nSupport: https://discord.gg/X9V7Kcv5gR",
|
"Description": "A Hellion Forge plugin — privacy-focused chat replacement for FINAL FANTASY XIV, built for EU, US and JP data rules.\n\nBy default only your own conversations are stored. Public chat, NPC dialogue, system messages and battle logs are discarded at the storage layer unless you opt in. Retention windows are configurable per channel, history can be wiped retroactively, and everything can be exported on demand.\n\nFeatures:\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with preview and Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with four profiles: Privacy-First, Casual, Roleplay, Full History\n- Multi-language UI (24 locales) with live language switching\n- Own config and database — no shared state with other plugins\n\nBased on Chat 2 by Infi and Anna (EUPL-1.2).\nSupport: https://discord.gg/X9V7Kcv5gR",
|
||||||
"ApplicableVersion": "any",
|
"ApplicableVersion": "any",
|
||||||
"RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat",
|
"RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat",
|
||||||
@@ -20,17 +20,17 @@
|
|||||||
"CanUnloadAsync": false,
|
"CanUnloadAsync": false,
|
||||||
"LoadPriority": 0,
|
"LoadPriority": 0,
|
||||||
"Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.",
|
"Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.",
|
||||||
"Changelog": "**v2.0.1 — Hotfix (2026-08-19)**\n\nA same-day follow-up to 2.0.0 with no user-facing changes. Install it if you picked up 2.0.0 in the first hour; there is nothing new to look at, it just carries a dependency update the 2.0.0 archive was built without.\n\n- MessagePack raised from 3.1.4 to 3.1.7. It handles the payload serialisation behind the message database. The advisories are a recursion-depth limit in `Skip` and a fault in LZ4 decompression, both reachable only through crafted input — this plugin writes and reads its own bytes in a local file, so the practical exposure needs someone who already has write access to it. Lifted anyway, because it costs nothing.\n- The release workflow publishes through the Gitea API directly. The 2.0.0 build succeeded and then failed to attach its own archive, which is why that release had to be completed by hand.",
|
"Changelog": "**v2.0.3 \u2014 Pop-out context menu, screenshot mode (2026-08-20)**\n\n- **The context menu never opened in a pop-out window.** Right-clicking a name or an item there did nothing at all. Every chat surface shares one popup state, and whichever window drew first cleared the menu it had not opened before the pop-out got its turn. The menu now stays with the window the click came from.\n- **Screenshot mode could not be turned off.** It is a saved setting, but neither of its two toggles wrote the change to the config file, so switching it off never survived a reload and the mode came back on at every plugin load. Both toggles save now. If it is stuck on for you, one click off is enough.\n- **Text the game colours itself could render invisible.** Some of those colours arrive without an alpha byte, and the byte order swap then left them fully transparent.\n\n---\n\n**v2.0.2 — Emotes out, placeholders fixed (2026-08-19)**\n\n- **BetterTTV emote support is gone.** Its shared-emote endpoint went behind authentication, and that was where nearly all of them came from — what remained was a 65-entry global set, eleven of which are on the known-broken list, so 54 mostly static images from Twitch's early days. Exactly one was animated, and that one wanted 492 frames and 37 MB of video memory. The plugin now makes no outbound network calls at all. Messages stored with emotes still read fine; they show the code that was typed.\n- **Five settings descriptions printed `{0}` instead of the plugin name.** All 25 languages were affected, English included — it just hid better there, since \"Hide {0} during cutscenes\" still scans as a sentence while German puts the placeholder first. A test now walks every resource string with a placeholder and fails if one reaches a widget unformatted.\n- **New preview images.** The ones in the plugin installer were from 8 May and showed the interface as it looked before any of the window rebuilds.",
|
||||||
"AcceptsFeedback": true,
|
"AcceptsFeedback": true,
|
||||||
"DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.1/latest.zip",
|
"DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.3/latest.zip",
|
||||||
"DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.1/latest.zip",
|
"DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.3/latest.zip",
|
||||||
"DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.1/latest.zip",
|
"DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.3/latest.zip",
|
||||||
"TestingAssemblyVersion": "2.0.1.0",
|
"TestingAssemblyVersion": "2.0.3.0",
|
||||||
"IconUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/icon.png",
|
"IconUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/icon.png",
|
||||||
"ImageUrls": [
|
"ImageUrls": [
|
||||||
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png",
|
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png",
|
||||||
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/settingsOverview.png",
|
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/settingsOverview.png",
|
||||||
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/themesPicker.png"
|
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/firstRunWizard.png"
|
||||||
],
|
],
|
||||||
"DownloadCount": 0,
|
"DownloadCount": 0,
|
||||||
"IsHide": false,
|
"IsHide": false,
|
||||||
|
|||||||
Reference in New Issue
Block a user