[frontend] Add localization support, perform initial localization pass
This commit is contained in:
parent
09c849805a
commit
79b7bf07e0
9 changed files with 298 additions and 19 deletions
|
@ -1,18 +1,20 @@
|
||||||
@using FParsec
|
|
||||||
@using Iceshrimp.Assets.PhosphorIcons
|
@using Iceshrimp.Assets.PhosphorIcons
|
||||||
@using Iceshrimp.Frontend.Core.Services
|
@using Iceshrimp.Frontend.Core.Services
|
||||||
@using Iceshrimp.Shared.Schemas
|
@using Iceshrimp.Shared.Schemas
|
||||||
@using Iceshrimp.Frontend.Components.Note
|
@using Iceshrimp.Frontend.Components.Note
|
||||||
|
@using Iceshrimp.Frontend.Localization
|
||||||
|
@using Microsoft.Extensions.Localization
|
||||||
@inject IJSRuntime Js
|
@inject IJSRuntime Js
|
||||||
@inject ApiService ApiService
|
@inject ApiService ApiService
|
||||||
@inject ComposeService ComposeService
|
@inject ComposeService ComposeService
|
||||||
|
@inject IStringLocalizer<Localization> Loc;
|
||||||
<dialog class="compose" @ref="Dialog">
|
<dialog class="compose" @ref="Dialog">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<button @onclick="CloseDialog">
|
<button @onclick="CloseDialog">
|
||||||
<Icon Name="Icons.X"/>
|
<Icon Name="Icons.X"/>
|
||||||
</button>
|
</button>
|
||||||
<Dropdown TBind="NoteVisibility" Elements="@DropDownCreate()" @bind-Value="NoteDraft.Visibility"/>
|
<Dropdown TBind="NoteVisibility" Elements="@DropDownCreate()" @bind-Value="NoteDraft.Visibility"/>
|
||||||
<button @onclick="SendNote" class="post-btn">Post<Icon Name="Icons.PaperPlaneRight"/></button>
|
<button @onclick="SendNote" class="post-btn">@Loc["ComposePost"]<Icon Name="Icons.PaperPlaneRight"/></button>
|
||||||
</div>
|
</div>
|
||||||
@if (ReplyOrQuote != null)
|
@if (ReplyOrQuote != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
@using Iceshrimp.Assets.PhosphorIcons
|
@using Iceshrimp.Assets.PhosphorIcons
|
||||||
|
@using Iceshrimp.Frontend.Localization
|
||||||
@using Iceshrimp.Shared.Schemas
|
@using Iceshrimp.Shared.Schemas
|
||||||
|
@using Microsoft.Extensions.Localization
|
||||||
|
@inject IStringLocalizer<Localization> Loc;
|
||||||
|
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<span class="info">
|
<span class="info">
|
||||||
<span class="time">@RenderDate(CreatedAt)</span>
|
<span class="time">@RenderDate(CreatedAt)</span>
|
||||||
|
@ -29,22 +33,22 @@
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@code {
|
@code {
|
||||||
[Parameter] [EditorRequired] public required DateTime CreatedAt { get; set; }
|
[Parameter] [EditorRequired] public required DateTime CreatedAt { get; set; }
|
||||||
[Parameter] [EditorRequired] public required NoteVisibility Visibility { get; set; }
|
[Parameter] [EditorRequired] public required NoteVisibility Visibility { get; set; }
|
||||||
[Parameter] [EditorRequired] public required string? InstanceName { get; set; }
|
[Parameter] [EditorRequired] public required string? InstanceName { get; set; }
|
||||||
|
|
||||||
private string RenderDate(DateTime date)
|
private string RenderDate(DateTime date)
|
||||||
{
|
{
|
||||||
var diff = DateTime.Now - date;
|
var diff = DateTime.Now - date;
|
||||||
return diff switch
|
return diff switch
|
||||||
{
|
{
|
||||||
{ Days: >= 365 } => $"{diff.Days / 365}yr",
|
{ Days: >= 365 } => Loc["{0}y", diff.Days / 365],
|
||||||
{ Days: >= 30 } => $"{diff.Days / 30}mo",
|
{ Days: >= 30 } => Loc["{0}mo" ,diff.Days / 30],
|
||||||
{ Days: >= 7 } => $"{diff.Days / 7}w",
|
{ Days: >= 7 } => Loc["{0}d", diff.Days / 7],
|
||||||
{ Days: >= 1 } => $"{diff.Days}d",
|
{ Days: >= 1 } => Loc["{0}d", diff.Days],
|
||||||
{ Hours: >= 1 } => $"{diff.Hours}h",
|
{ Hours: >= 1 } => Loc["{0}h", diff.Hours],
|
||||||
{ Minutes: >= 1 } => $"{diff.Minutes}m",
|
{ Minutes: >= 1 } => Loc["{0}m", diff.Minutes],
|
||||||
_ => "Just now."
|
_ => Loc["Just now"]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
26
Iceshrimp.Frontend/Core/Miscellaneous/LocaleHelper.cs
Normal file
26
Iceshrimp.Frontend/Core/Miscellaneous/LocaleHelper.cs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
using System.Globalization;
|
||||||
|
using Blazored.LocalStorage;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
namespace Iceshrimp.Frontend.Core.Miscellaneous;
|
||||||
|
|
||||||
|
public class LocaleHelper(ISyncLocalStorageService localStorage)
|
||||||
|
{
|
||||||
|
[Inject] public ISyncLocalStorageService LocalStorage { get; } = localStorage;
|
||||||
|
|
||||||
|
public CultureInfo LoadCulture()
|
||||||
|
{
|
||||||
|
var defaultCulture = "en-150";
|
||||||
|
var culture = LocalStorage.GetItem<string?>("blazorCulture") ?? defaultCulture;
|
||||||
|
var res = new CultureInfo(culture);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StoreCulture(CultureInfo cultureInfo)
|
||||||
|
{
|
||||||
|
var cultureString = cultureInfo.Name;
|
||||||
|
LocalStorage.SetItem("blazorCulture", cultureString);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -21,6 +21,10 @@
|
||||||
<RunAOTCompilation>true</RunAOTCompilation>
|
<RunAOTCompilation>true</RunAOTCompilation>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Iceshrimp.Parsing\Iceshrimp.Parsing.fsproj" />
|
<ProjectReference Include="..\Iceshrimp.Parsing\Iceshrimp.Parsing.fsproj" />
|
||||||
<ProjectReference Include="..\Iceshrimp.Shared\Iceshrimp.Shared.csproj" />
|
<ProjectReference Include="..\Iceshrimp.Shared\Iceshrimp.Shared.csproj" />
|
||||||
|
@ -35,8 +39,24 @@
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.6" />
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="8.0.6" />
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="8.0.6" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Localization" Version="8.0.6" />
|
||||||
<PackageReference Include="TypedSignalR.Client" Version="3.5.2" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
<PackageReference Include="TypedSignalR.Client" Version="3.5.2" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
|
||||||
<PackageReference Include="Iceshrimp.Assets.PhosphorIcons" Version="2.0.2" />
|
<PackageReference Include="Iceshrimp.Assets.PhosphorIcons" Version="2.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Update="Localization\Localization.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Localization.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="Localization\Localization.Designer.cs">
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Localization.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
@using Iceshrimp.Frontend.Components
|
@using Iceshrimp.Frontend.Components
|
||||||
@using Iceshrimp.Assets.PhosphorIcons
|
@using Iceshrimp.Assets.PhosphorIcons
|
||||||
|
@using Microsoft.Extensions.Localization
|
||||||
|
@inject IStringLocalizer<Localization.Localization> Loc;
|
||||||
|
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<account-dropdown />
|
<account-dropdown />
|
||||||
|
@ -8,18 +11,18 @@
|
||||||
<div class="sidebar-btn">
|
<div class="sidebar-btn">
|
||||||
<NavLink href="/">
|
<NavLink href="/">
|
||||||
<Icon Name="Icons.House" />
|
<Icon Name="Icons.House" />
|
||||||
<span class="text">Timeline</span>
|
<span class="text">@Loc["Timeline"]</span>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-btn">
|
<div class="sidebar-btn">
|
||||||
<NavLink href="/notifications">
|
<NavLink href="/notifications">
|
||||||
<Icon Name="Icons.Bell"/>
|
<Icon Name="Icons.Bell"/>
|
||||||
<span class="text">Notifications</span>
|
<span class="text">@Loc["Notifications"]</span>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
<hr/>
|
||||||
<button class="sidebar-btn" @onclick="Open">Open</button>
|
<button class="sidebar-btn" @onclick="Open">@Loc["Post"]</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="bottom-bar">
|
<div class="bottom-bar">
|
||||||
|
@ -30,19 +33,19 @@
|
||||||
<div class="sidebar-btn">
|
<div class="sidebar-btn">
|
||||||
<NavLink href="/">
|
<NavLink href="/">
|
||||||
<Icon Name="Icons.House"/>
|
<Icon Name="Icons.House"/>
|
||||||
<span class="text">Timeline</span>
|
<span class="text">@Loc["Timeline"]</span>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-btn">
|
<div class="sidebar-btn">
|
||||||
<NavLink href="/notifications">
|
<NavLink href="/notifications">
|
||||||
<Icon Name="Icons.Bell"/>
|
<Icon Name="Icons.Bell"/>
|
||||||
<span class="text">Notifications</span>
|
<span class="text">@Loc["Notifications"]</span>
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button @onclick="Open" class="sidebar-btn">
|
<button @onclick="Open" class="sidebar-btn">
|
||||||
<Icon Name="Icons.Pencil"/>
|
<Icon Name="Icons.Pencil"/>
|
||||||
<span class="text">Open!</span>
|
<span class="text">@Loc["Post"]</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
114
Iceshrimp.Frontend/Localization/Localization.Designer.cs
generated
Normal file
114
Iceshrimp.Frontend/Localization/Localization.Designer.cs
generated
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace Iceshrimp.Frontend.Localization {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||||
|
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class Localization {
|
||||||
|
|
||||||
|
private static System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Localization() {
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.Equals(null, resourceMan)) {
|
||||||
|
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Iceshrimp.Frontend.Localization.Localization", typeof(Localization).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Timeline {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Timeline", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Notifications {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Notifications", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Post {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Post", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string _0_yr {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("{0}yr", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string _0_mo {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("{0}mo", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string _0_w {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("{0}w", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string _0_d {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("{0}d", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string _0_h {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("{0}h", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string _0_m {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("{0}m", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Just_now {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Just now", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string ComposePost {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ComposePost", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
47
Iceshrimp.Frontend/Localization/Localization.en-150.resx
Normal file
47
Iceshrimp.Frontend/Localization/Localization.en-150.resx
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<root>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>1.3</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="Timeline" xml:space="preserve">
|
||||||
|
<value>Timeline</value>
|
||||||
|
</data>
|
||||||
|
<data name="Notifications" xml:space="preserve">
|
||||||
|
<value>Notifications</value>
|
||||||
|
</data>
|
||||||
|
<data name="Post" xml:space="preserve">
|
||||||
|
<value>Post</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}yr" xml:space="preserve">
|
||||||
|
<value>{0}yr</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}d" xml:space="preserve">
|
||||||
|
<value>{0}d</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}h" xml:space="preserve">
|
||||||
|
<value>{0}h</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}m" xml:space="preserve">
|
||||||
|
<value>{0}m</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}mo" xml:space="preserve">
|
||||||
|
<value>{0}mo</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}w" xml:space="preserve">
|
||||||
|
<value>{0}w</value>
|
||||||
|
</data>
|
||||||
|
<data name="Just now" xml:space="preserve">
|
||||||
|
<value>Just now</value>
|
||||||
|
</data>
|
||||||
|
<data name="ComposePost" xml:space="preserve">
|
||||||
|
<value>Post</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
54
Iceshrimp.Frontend/Localization/Localization.resx
Normal file
54
Iceshrimp.Frontend/Localization/Localization.resx
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<root>
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>1.3</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="Timeline" xml:space="preserve">
|
||||||
|
<value>Timeline</value>
|
||||||
|
</data>
|
||||||
|
<data name="Notifications" xml:space="preserve">
|
||||||
|
<value>Notifications</value>
|
||||||
|
</data>
|
||||||
|
<data name="Post" xml:space="preserve">
|
||||||
|
<value>Post</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}yr" xml:space="preserve">
|
||||||
|
<value>{0}yr</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}mo" xml:space="preserve">
|
||||||
|
<value>{0}mo</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}w" xml:space="preserve">
|
||||||
|
<value>{0}w</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}d" xml:space="preserve">
|
||||||
|
<value>{0}d</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}h" xml:space="preserve">
|
||||||
|
<value>{0}h</value>
|
||||||
|
</data>
|
||||||
|
<data name="{0}m" xml:space="preserve">
|
||||||
|
<value>{0}m</value>
|
||||||
|
</data>
|
||||||
|
<data name="Just now" xml:space="preserve">
|
||||||
|
<value>Just now</value>
|
||||||
|
</data>
|
||||||
|
<data name="ComposePost" xml:space="preserve">
|
||||||
|
<value>Post</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
|
@ -5,12 +5,15 @@ using Iceshrimp.Frontend;
|
||||||
using Iceshrimp.Frontend.Core.Services;
|
using Iceshrimp.Frontend.Core.Services;
|
||||||
using Ljbc1994.Blazor.IntersectionObserver;
|
using Ljbc1994.Blazor.IntersectionObserver;
|
||||||
using Microsoft.AspNetCore.Components.Authorization;
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
|
using System.Globalization;
|
||||||
|
using Iceshrimp.Frontend.Core.Miscellaneous;
|
||||||
|
|
||||||
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
||||||
builder.RootComponents.Add<App>("#app");
|
builder.RootComponents.Add<App>("#app");
|
||||||
builder.RootComponents.Add<HeadOutlet>("head::after");
|
builder.RootComponents.Add<HeadOutlet>("head::after");
|
||||||
|
|
||||||
builder.Services.AddSingleton(_ => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
|
builder.Services.AddSingleton(_ => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
|
||||||
|
builder.Services.AddLocalization();
|
||||||
builder.Services.AddSingleton<ApiClient>();
|
builder.Services.AddSingleton<ApiClient>();
|
||||||
builder.Services.AddSingleton<ApiService>();
|
builder.Services.AddSingleton<ApiService>();
|
||||||
builder.Services.AddIntersectionObserver();
|
builder.Services.AddIntersectionObserver();
|
||||||
|
@ -22,4 +25,10 @@ builder.Services.AddAuthorizationCore();
|
||||||
builder.Services.AddCascadingAuthenticationState();
|
builder.Services.AddCascadingAuthenticationState();
|
||||||
builder.Services.AddBlazoredLocalStorageAsSingleton();
|
builder.Services.AddBlazoredLocalStorageAsSingleton();
|
||||||
|
|
||||||
await builder.Build().RunAsync();
|
// Culture information (locale) has to be set before run.
|
||||||
|
var host = builder.Build();
|
||||||
|
var helper = new LocaleHelper(host.Services.GetRequiredService<ISyncLocalStorageService>());
|
||||||
|
var culture = helper.LoadCulture();
|
||||||
|
CultureInfo.DefaultThreadCurrentCulture = culture;
|
||||||
|
CultureInfo.DefaultThreadCurrentUICulture = culture;
|
||||||
|
await host.RunAsync();
|
Loading…
Add table
Reference in a new issue