Skip to content

Commit 1f06648

Browse files
committed
Add translations for the Profile page
1 parent 1a4832d commit 1f06648

File tree

4 files changed

+215
-33
lines changed

4 files changed

+215
-33
lines changed

Tevling/Pages/Profile.en.resx

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<root>
3+
<resheader name="resmimetype">
4+
<value>text/microsoft-resx</value>
5+
</resheader>
6+
<resheader name="version">
7+
<value>2.0</value>
8+
</resheader>
9+
<resheader name="reader">
10+
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
11+
</resheader>
12+
<resheader name="writer">
13+
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
14+
</resheader>
15+
<!--Data-->
16+
<data name="Profile" xml:space="preserve">
17+
<value>Profile</value>
18+
</data>
19+
<data name="MemberSince" xml:space="preserve">
20+
<value>Member since {0}</value>
21+
</data>
22+
<data name="FollowRequests" xml:space="preserve">
23+
<value>Follow Requests</value>
24+
</data>
25+
<data name="Followers" xml:space="preserve">
26+
<value>Followers</value>
27+
</data>
28+
<data name="NoFollowers" xml:space="preserve">
29+
<value>You currently have no followers 😕</value>
30+
</data>
31+
<data name="Following" xml:space="preserve">
32+
<value>Following</value>
33+
</data>
34+
<data name="NoFollowings" xml:space="preserve">
35+
<value>You're not following anyone 😕</value>
36+
</data>
37+
<data name="Import_title" xml:space="preserve">
38+
<value>Import activities from Strava</value>
39+
</data>
40+
<data name="Import_body" xml:space="preserve">
41+
<value>Import last 30 days of activities to get started! &lt;br/&gt; (This can only be done once)</value>
42+
</data>
43+
<data name="ImportComplete" xml:space="preserve">
44+
<value>Import complete</value>
45+
</data>
46+
<data name="Importing" xml:space="preserve">
47+
<value>Importing</value>
48+
</data>
49+
<data name="ImportActivities" xml:space="preserve">
50+
<value>Import activities</value>
51+
</data>
52+
<data name="SorryOnlyOnce" xml:space="preserve">
53+
<value>Sorry, you can only import once.</value>
54+
</data>
55+
<data name="ImportingActivities" xml:space="preserve">
56+
<value>Importing activities, please wait...</value>
57+
</data>
58+
<data name="ImportSuccessful" xml:space="preserve">
59+
<value>Import completed successfully</value>
60+
</data>
61+
<data name="ImportFailed" xml:space="preserve">
62+
<value>Import failed with error: {0}</value>
63+
</data>
64+
<data name="Signout_title" xml:space="preserve">
65+
<value>Sign out</value>
66+
</data>
67+
<data name="Signout_body" xml:space="preserve">
68+
<value>If using a public/shared computer, please remember to sign out.</value>
69+
</data>
70+
<data name="SignOut" xml:space="preserve">
71+
<value>Sign out</value>
72+
</data>
73+
<data name="DeleteAccount_title" xml:space="preserve">
74+
<value>Delete account</value>
75+
</data>
76+
<data name="DeleteAccount_body" xml:space="preserve">
77+
<value>Delete user account and deauthorize application. All data will be removed.&lt;br/&gt;NB! This cannot be undone!</value>
78+
</data>
79+
<data name="ForgetMe" xml:space="preserve">
80+
<value>Forget me</value>
81+
</data>
82+
<data name="DeleteAccount_confirm" xml:space="preserve">
83+
<value>Are you sure you want to delete your Tevling account?</value>
84+
</data>
85+
<data name="DeleteAccount" xml:space="preserve">
86+
<value>Delete account</value>
87+
</data>
88+
<data name="Cancel" xml:space="preserve">
89+
<value>Cancel</value>
90+
</data>
91+
</root>

Tevling/Pages/Profile.no.resx

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<root>
3+
<resheader name="resmimetype">
4+
<value>text/microsoft-resx</value>
5+
</resheader>
6+
<resheader name="version">
7+
<value>2.0</value>
8+
</resheader>
9+
<resheader name="reader">
10+
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
11+
</resheader>
12+
<resheader name="writer">
13+
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
14+
</resheader>
15+
<!--Data-->
16+
<data name="Profile" xml:space="preserve">
17+
<value>Profil</value>
18+
</data>
19+
<data name="MemberSince" xml:space="preserve">
20+
<value>Medlem siden {0}</value>
21+
</data>
22+
<data name="FollowRequests" xml:space="preserve">
23+
<value>Følgeforespørsler</value>
24+
</data>
25+
<data name="Followers" xml:space="preserve">
26+
<value>Følgere</value>
27+
</data>
28+
<data name="NoFollowers" xml:space="preserve">
29+
<value>Du har for tiden ingen følgere 😕</value>
30+
</data>
31+
<data name="Following" xml:space="preserve">
32+
<value>Fulgte</value>
33+
</data>
34+
<data name="NoFollowings" xml:space="preserve">
35+
<value>Du følger ingen 😕</value>
36+
</data>
37+
<data name="Import_title" xml:space="preserve">
38+
<value>Importér aktiviteter fra Strava</value>
39+
</data>
40+
<data name="Import_body" xml:space="preserve">
41+
<value>Importér siste 30 dager for å komme i gang! &lt;br/&gt; (Dette kan bare gjøres én gang)</value>
42+
</data>
43+
<data name="ImportComplete" xml:space="preserve">
44+
<value>Import ferdig</value>
45+
</data>
46+
<data name="Importing" xml:space="preserve">
47+
<value>Importerer</value>
48+
</data>
49+
<data name="ImportActivities" xml:space="preserve">
50+
<value>Importér aktiviteter</value>
51+
</data>
52+
<data name="SorryOnlyOnce" xml:space="preserve">
53+
<value>Beklager, du kan kun importere en gang.</value>
54+
</data>
55+
<data name="ImportingActivities" xml:space="preserve">
56+
<value>Importerer aktiviteter, vennligst vent...</value>
57+
</data>
58+
<data name="ImportSuccessful" xml:space="preserve">
59+
<value>Import vellykket</value>
60+
</data>
61+
<data name="ImportFailed" xml:space="preserve">
62+
<value>Feil ved import: {0}</value>
63+
</data>
64+
<data name="Signout_title" xml:space="preserve">
65+
<value>Logg ut</value>
66+
</data>
67+
<data name="Signout_body" xml:space="preserve">
68+
<value>Husk å logg ut dersom dette er en datamaskin du deler med andre.</value>
69+
</data>
70+
<data name="SignOut" xml:space="preserve">
71+
<value>Logg ut</value>
72+
</data>
73+
<data name="DeleteAccount_title" xml:space="preserve">
74+
<value>Slett konto</value>
75+
</data>
76+
<data name="DeleteAccount_body" xml:space="preserve">
77+
<value>Fjern brukerkonto og avregistrer applikasjonen. All data vil bli slettet.&lt;br/&gt;NB! Dette kan ikke angres!</value>
78+
</data>
79+
<data name="ForgetMe" xml:space="preserve">
80+
<value>Glem meg</value>
81+
</data>
82+
<data name="DeleteAccount_confirm" xml:space="preserve">
83+
<value>Er du sikker på at du vil slette din bruker på Tevling?</value>
84+
</data>
85+
<data name="DeleteAccount" xml:space="preserve">
86+
<value>Slett konto</value>
87+
</data>
88+
<data name="Cancel" xml:space="preserve">
89+
<value>Avbryt</value>
90+
</data>
91+
</root>

Tevling/Pages/Profile.razor

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
@page "/profile"
22

3-
<h1 class="title mb-5">Profile</h1>
3+
<h1 class="title mb-5">@Loc["Profile"]</h1>
44
<div class="profile d-flex flex-row column-gap-2 mb-5">
55
<Avatar Url="@Athlete.ImgUrl" Size="50"/>
66
<div class="d-flex flex-column">
77
<span class="profile-name">@Athlete.Name</span>
8-
<span class="member-since">Member since @CreatedTime</span>
8+
<span class="member-since">@string.Format(Loc["MemberSince"], @CreatedTime)</span>
99
</div>
1010
</div>
1111

@@ -15,7 +15,7 @@
1515
@if (Athlete.PendingFollowers?.Count > 0 && Athlete.PendingFollowers is not null)
1616
{
1717
<div class="follow-requests">
18-
<h2 class="mb-3">Follow Requests</h2>
18+
<h2 class="mb-3">@Loc["FollowRequests"]</h2>
1919
<div class="d-flex flex-column row-gap-3">
2020
@foreach (Athlete? pendingFollower in Athlete.PendingFollowers)
2121
{
@@ -32,12 +32,12 @@
3232
</div>
3333
</div>
3434
}
35-
35+
3636
<div class="followers">
37-
<h2 class="mb-3">Followers</h2>
37+
<h2 class="mb-3">@Loc["Followers"]</h2>
3838
@if (Athlete.Followers?.Count == 0 || Athlete.Followers is null)
3939
{
40-
<span>You currently have no followers 😕</span>
40+
<span>@Loc["NoFollowers"]</span>
4141
}
4242
else
4343
{
@@ -57,10 +57,10 @@
5757
</div>
5858

5959
<div class="following mb-5">
60-
<h2 class="mb-3">Following</h2>
60+
<h2 class="mb-3">@Loc["Following"]</h2>
6161
@if ((Athlete.Following?.Count == 0 || Athlete.Following is null) && (Athlete.PendingFollowing?.Count == 0 || Athlete.PendingFollowing is null))
6262
{
63-
<span>You're not following anyone 😕</span>
63+
<span>@Loc["NoFollowings"]</span>
6464
}
6565
else
6666
{
@@ -92,21 +92,21 @@
9292
</div>
9393
<div class="profile-actions mb-5">
9494
<div class="d-flex flex-column row-gap-3">
95-
<h4 class="mt-4">Import activities from Strava</h4>
96-
<span>Import last 30 days of activities to get started! <br/> (This can only be done once)</span>
95+
<h4 class="mt-4">@Loc["Import_title"]</h4>
96+
<span>@(new MarkupString(Loc["Import_body"]))</span>
9797
<button class="btn btn-primary" @onclick="Import" disabled="@(Importing || Athlete.HasImportedActivities)">
9898
<i class="bi bi-box-arrow-in-down me-1" aria-hidden="true"></i>
9999
@if (Athlete.HasImportedActivities)
100100
{
101-
<text>Import complete</text>
101+
<text>@Loc["ImportComplete"]</text>
102102
}
103103
else if (Importing)
104104
{
105-
<text>Importing...</text>
105+
<text>@Loc["Importing"]...</text>
106106
}
107107
else
108108
{
109-
<text>Import activities</text>
109+
<text>@Loc["ImportActivities"]</text>
110110
}
111111
</button>
112112
@if (!string.IsNullOrEmpty(ImportResult))
@@ -116,20 +116,18 @@
116116
</div>
117117

118118
<div class="d-flex flex-column row-gap-2">
119-
<h4 class="mt-4">Sign out</h4>
120-
<span>If using a public/shared computer, please remember to sign out.</span>
121-
<a class="btn btn-secondary mt-1" href="/auth/logout"><i class="bi bi-box-arrow-right me-1"
122-
aria-hidden="true"></i>Sign out</a>
119+
<h4 class="mt-4">@Loc["Signout_title"]</h4>
120+
<span>@Loc["Signout_body"]</span>
121+
<a class="btn btn-secondary mt-1" href="/auth/logout">
122+
<i class="bi bi-box-arrow-right me-1" aria-hidden="true"></i>@Loc["SignOut"]
123+
</a>
123124
</div>
124125

125126
<div class="d-flex flex-column row-gap-2">
126-
<h4 class="mt-4">Delete account</h4>
127-
<span class="text-danger">
128-
Delete user account and deauthorize application. All data will be
129-
removed.<br/>NB! This cannot be undone!
130-
</span>
127+
<h4 class="mt-4">@Loc["DeleteAccount_title"]</h4>
128+
<span class="text-danger">@(new MarkupString(Loc["DeleteAccount_body"]))</span>
131129
<a class="btn btn-danger mt-1" data-bs-toggle="modal" data-bs-target="#deleteAccount">
132-
<i class="bi bi-trash-fill me-1" aria-hidden="true"></i>Forget me
130+
<i class="bi bi-trash-fill me-1" aria-hidden="true"></i>@Loc["ForgetMe"]
133131
</a>
134132
</div>
135133
</div>
@@ -138,15 +136,14 @@
138136

139137
<Modal Id="deleteAccount" Size="sm">
140138
<HeaderContent>
141-
<span>Delete account</span>
139+
<span>@Loc["DeleteAccount_title"]</span>
142140
</HeaderContent>
143141
<BodyContent>
144142
<i class="bi bi-trash delete-account-modal-icon" aria-hidden="true"></i>
145-
<span class="text-center delete-account-modal-text">Are you sure you want to delete your Tevling account?</span>
143+
<span class="text-center delete-account-modal-text">@Loc["DeleteAccount_confirm"]</span>
146144
</BodyContent>
147145
<FooterContent>
148-
<a class="btn btn-danger mt-1 delete-account-modal-button" href="/auth/logout?deauthorize=true">Delete
149-
account</a>
150-
<button class="btn btn-secondary mt-1 delete-account-modal-button" data-bs-dismiss="modal">Cancel</button>
146+
<a class="btn btn-danger mt-1 delete-account-modal-button" href="/auth/logout?deauthorize=true">@Loc["DeleteAccount"]</a>
147+
<button class="btn btn-secondary mt-1 delete-account-modal-button" data-bs-dismiss="modal">@Loc["Cancel"]</button>
151148
</FooterContent>
152149
</Modal>

Tevling/Pages/Profile.razor.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Microsoft.Extensions.Localization;
2+
13
namespace Tevling.Pages;
24

35
public partial class Profile : ComponentBase
@@ -6,6 +8,7 @@ public partial class Profile : ComponentBase
68
[Inject] private IActivityService ActivityService { get; set; } = null!;
79
[Inject] private IAthleteService AthleteService { get; set; } = null!;
810
[Inject] private IBrowserTime BrowserTime { get; set; } = null!;
11+
[Inject] private IStringLocalizer<Profile> Loc { get; set; } = null!;
912

1013
private string? CreatedTime;
1114
private bool Importing { get; set; }
@@ -20,30 +23,30 @@ protected override async Task OnInitializedAsync()
2023
protected override async Task OnParametersSetAsync()
2124
{
2225
DateTimeOffset browserTime = await BrowserTime.ConvertToLocal(Athlete.Created);
23-
CreatedTime = browserTime.ToString("dd'.'MM'.'yyyy");
26+
CreatedTime = browserTime.ToString("d");
2427
}
2528

2629
private async Task Import()
2730
{
2831
if (Athlete.HasImportedActivities)
2932
{
30-
ImportResult = "Sorry, you can only import once.";
33+
ImportResult = Loc["SorryOnlyOnce"];
3134
return;
3235
}
3336

3437
Importing = true;
35-
ImportResult = "Importing activities, please wait...";
38+
ImportResult = Loc["ImportingActivities"];
3639
try
3740
{
3841
await ActivityService.ImportActivitiesForAthleteAsync(
3942
Athlete.Id,
4043
DateTimeOffset.Now - TimeSpan.FromDays(30));
4144
Athlete = await AthleteService.SetHasImportedActivities(Athlete.Id);
42-
ImportResult = "Import completed successfully";
45+
ImportResult = Loc["ImportSuccessful"];
4346
}
4447
catch (Exception ex)
4548
{
46-
ImportResult = $"Import failed with error: {ex.Message}";
49+
ImportResult = string.Format(Loc["ImportFailed"], ex.Message);
4750
}
4851
finally
4952
{

0 commit comments

Comments
 (0)