"me-web?" 0.7.1: changing the language changes all of it
- Choosing another language now changes every text on the screen at once. Before, the titles, the question about the test from outside and most labels stayed in the previous language until the app was restarted. - On narrow phones the name at the top shrinks to fit instead of slipping under the info button. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
1 parent
320936c688
commit
2062d3bdd5
5 files changed
+13
-4
No files matched your search
@@ -167,6 +167,10 @@ The Android release key: alias `meweb`, certificate SHA-256
|
|||||||
right-to-left languages the `Localizer` wraps the name in U+2066/U+2069 (left-to-right isolate), the English fallback
|
right-to-left languages the `Localizer` wraps the name in U+2066/U+2069 (left-to-right isolate), the English fallback
|
||||||
included: without it Avalonia lays out ”me-web?“ alone on a line as `me-web?”“`, and inside a sentence the `?`
|
included: without it Avalonia lays out ”me-web?“ alone on a line as `me-web?”“`, and inside a sentence the `?`
|
||||||
jumps to the other end of the name. A left-to-right mark after the name was tried and does not fix the lone title.
|
jumps to the other end of the name. A left-to-right mark after the name was tried and does not fix the lone title.
|
||||||
|
- **Avalonia 12 refreshes an indexer binding only on `PropertyChanged("Item")`.** `{s:Tr Key}` binds `Localizer.Instance[Key]`;
|
||||||
|
the WPF name `"Item[]"` and `""` refresh nothing, so until 0.7.1 changing the language left every `{s:Tr}` text in
|
||||||
|
the old one while the view models' `*Formatted` strings followed. The screenshot tool draws each `start-<code>`
|
||||||
|
shot by switching from English on a live view, which is the check that would have caught it.
|
||||||
- **Values worth copying are read-only text boxes with a copy button inside** (`Views/CopyField`): addresses, the
|
- **Values worth copying are read-only text boxes with a copy button inside** (`Views/CopyField`): addresses, the
|
||||||
router, the network, the reverse name, the route, the STUN answers and a submission's code. The box is
|
router, the network, the reverse name, the route, the STUN answers and a submission's code. The box is
|
||||||
left-to-right in every language and copies the raw value, never the bidi marks `Texts.Isolate` adds to display
|
left-to-right in every language and copies the raw value, never the bidi marks `Texts.Isolate` adds to display
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>0.7.0</Version>
|
<Version>0.7.1</Version>
|
||||||
<Product>“me-web?”</Product>
|
<Product>“me-web?”</Product>
|
||||||
<Company>Arasaka di Hvozdikov Yevheniy</Company>
|
<Company>Arasaka di Hvozdikov Yevheniy</Company>
|
||||||
<Copyright>© 2026 Arasaka di Hvozdikov Yevheniy</Copyright>
|
<Copyright>© 2026 Arasaka di Hvozdikov Yevheniy</Copyright>
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public sealed class Localizer : INotifyPropertyChanged
|
|||||||
Culture = CultureFor(Language.Code);
|
Culture = CultureFor(Language.Code);
|
||||||
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = Culture;
|
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = Culture;
|
||||||
CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = Culture;
|
CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = Culture;
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item[]"));
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty));
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,9 @@
|
|||||||
<Grid>
|
<Grid>
|
||||||
<DockPanel>
|
<DockPanel>
|
||||||
<Grid DockPanel.Dock="Top" ColumnDefinitions="*,Auto,Auto" Margin="20,14,20,6">
|
<Grid DockPanel.Dock="Top" ColumnDefinitions="*,Auto,Auto" Margin="20,14,20,6">
|
||||||
<TextBlock Grid.Column="0" Classes="title" Text="{s:Tr AppName}" VerticalAlignment="Center" />
|
<Viewbox Grid.Column="0" StretchDirection="DownOnly" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,0,10,0">
|
||||||
|
<TextBlock Classes="title" Text="{s:Tr AppName}" />
|
||||||
|
</Viewbox>
|
||||||
<Button Grid.Column="1" Classes="round" Margin="0,0,10,0" VerticalAlignment="Center"
|
<Button Grid.Column="1" Classes="round" Margin="0,0,10,0" VerticalAlignment="Center"
|
||||||
AutomationProperties.AutomationId="main-contacts"
|
AutomationProperties.AutomationId="main-contacts"
|
||||||
AutomationProperties.Name="{s:Tr Contacts}"
|
AutomationProperties.Name="{s:Tr Contacts}"
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ Directory.CreateDirectory(output);
|
|||||||
var session = HeadlessUnitTestSession.StartNew(typeof(ScreenshotEntry));
|
var session = HeadlessUnitTestSession.StartNew(typeof(ScreenshotEntry));
|
||||||
await session.Dispatch(async () =>
|
await session.Dispatch(async () =>
|
||||||
{
|
{
|
||||||
|
var saved = AppSettings.Read();
|
||||||
var run = await App.Services.GetRequiredService<CheckRunner>().Run((_, _) => { }, CancellationToken.None);
|
var run = await App.Services.GetRequiredService<CheckRunner>().Run((_, _) => { }, CancellationToken.None);
|
||||||
Console.WriteLine($"run: {string.Join(", ", run.Findings.Select(f => $"{f.Id}={f.Outcome}"))}");
|
Console.WriteLine($"run: {string.Join(", ", run.Findings.Select(f => $"{f.Id}={f.Outcome}"))}");
|
||||||
foreach (var (width, height, label) in new[] { (1100, 1500, "desktop"), (400, 8000, "phone") })
|
foreach (var (width, height, label) in new[] { (1100, 1500, "desktop"), (400, 8000, "phone") })
|
||||||
@@ -29,7 +30,8 @@ await session.Dispatch(async () =>
|
|||||||
Shoot(width, height, $"main-{label}-{code}", model => model.Replay(run));
|
Shoot(width, height, $"main-{label}-{code}", model => model.Replay(run));
|
||||||
if (label != "desktop")
|
if (label != "desktop")
|
||||||
{
|
{
|
||||||
Shoot(width, 860, $"start-{code}", _ => { });
|
Localizer.Instance.SetLanguage(Languages.Fallback);
|
||||||
|
Shoot(width, 860, $"start-{code}", model => model.SelectedLanguage = Languages.Find(code) ?? Languages.Fallback);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Shoot(width, 900, $"contacts-{code}", model => model.ShowContacts = true);
|
Shoot(width, 900, $"contacts-{code}", model => model.ShowContacts = true);
|
||||||
@@ -40,6 +42,7 @@ await session.Dispatch(async () =>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
AppSettings.Write(saved);
|
||||||
return 0;
|
return 0;
|
||||||
}, CancellationToken.None);
|
}, CancellationToken.None);
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
|
|||||||
Reference in new issue
Block a user