1
0
mirror of git://jb55.com/damus synced 2024-10-06 11:43:21 +00:00

Fix localization and add tests for EventGroupView

This commit is contained in:
Terry Yiu 2023-02-27 07:01:23 +13:00
parent 64b1a57918
commit 77bcd1b715
No known key found for this signature in database
GPG Key ID: 108645AE8A19B71A
10 changed files with 638 additions and 38 deletions

View File

@ -15,6 +15,7 @@
3A3040EF29A8FEE9008A0F29 /* EventDetailBarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */; };
3A3040F129A8FF97008A0F29 /* LocalizationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */; };
3A3040F329A91366008A0F29 /* ProfileViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F229A91366008A0F29 /* ProfileViewTests.swift */; };
3A30410129AB12AA008A0F29 /* EventGroupViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A30410029AB12AA008A0F29 /* EventGroupViewTests.swift */; };
3A4325A82961E11400BFCD9D /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 3A4325AA2961E11400BFCD9D /* Localizable.stringsdict */; };
3AA247FD297E3CFF0090C62D /* RepostsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FC297E3CFF0090C62D /* RepostsModel.swift */; };
3AA247FF297E3D900090C62D /* RepostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FE297E3D900090C62D /* RepostsView.swift */; };
@ -280,6 +281,8 @@
3A3040FC29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
3A3040FD29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-TW"; path = "zh-TW.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
3A3040FE29A91F31008A0F29 /* zh-TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-TW"; path = "zh-TW.lproj/Localizable.strings"; sourceTree = "<group>"; };
3A3040FF29AB02D1008A0F29 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/Localizable.strings"; sourceTree = "<group>"; };
3A30410029AB12AA008A0F29 /* EventGroupViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventGroupViewTests.swift; sourceTree = "<group>"; };
3A41E559299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/InfoPlist.strings; sourceTree = "<group>"; };
3A41E55A299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = "<group>"; };
3A41E55B299D52BE001FA465 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = id; path = id.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
@ -1032,6 +1035,7 @@
3A3040EC29A5CB86008A0F29 /* ReplyDescriptionTests.swift */,
3A3040EE29A8FEE9008A0F29 /* EventDetailBarTests.swift */,
3A3040F229A91366008A0F29 /* ProfileViewTests.swift */,
3A30410029AB12AA008A0F29 /* EventGroupViewTests.swift */,
);
path = damusTests;
sourceTree = "<group>";
@ -1490,6 +1494,7 @@
buildActionMask = 2147483647;
files = (
3A3040ED29A5CB86008A0F29 /* ReplyDescriptionTests.swift in Sources */,
3A30410129AB12AA008A0F29 /* EventGroupViewTests.swift in Sources */,
3ACBCB78295FE5C70037388A /* TimeAgoTests.swift in Sources */,
DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */,
3A3040EF29A8FEE9008A0F29 /* EventDetailBarTests.swift in Sources */,
@ -1604,6 +1609,7 @@
3A827A19299FC69D00C4D171 /* ru */,
3A3040FA29A91EFC008A0F29 /* zh-HK */,
3A3040FE29A91F31008A0F29 /* zh-TW */,
3A3040FF29AB02D1008A0F29 /* en-US */,
);
name = Localizable.strings;
sourceTree = "<group>";

View File

@ -7,8 +7,12 @@
import Foundation
func bundleForLocale(locale: Locale) -> Bundle {
let path = Bundle.main.path(forResource: locale.identifier, ofType: "lproj")
func bundleForLocale(locale: Locale?) -> Bundle {
if locale == nil {
return Bundle.main
}
let path = Bundle.main.path(forResource: locale!.identifier, ofType: "lproj")
return path != nil ? (Bundle(path: path!) ?? Bundle.main) : Bundle.main
}

View File

@ -46,62 +46,86 @@ func determine_reacting_to(our_pubkey: String, ev: NostrEvent?) -> ReactingTo {
return .tagged_in
}
func determine_reacting_to_text(_ r: ReactingTo) -> String {
switch r {
case .tagged_in:
return "a post you were tagged in"
case .your_post:
return "your post"
case .your_profile:
return "your profile"
}
}
func event_author_name(profiles: Profiles, _ ev: NostrEvent) -> String {
let alice_pk = ev.pubkey
let alice_prof = profiles.lookup(id: alice_pk)
return Profile.displayName(profile: alice_prof, pubkey: alice_pk)
}
func reacting_to_text(profiles: Profiles, our_pubkey: String, group: EventGroupType, ev: NostrEvent?) -> String {
/**
Returns a notification string describing user actions in response to an event group type.
The localization keys read by this function are the following (although some keys may not actually be used in practice):
"??" - returned when there are no events associated with the specified event group type.
"reacted_tagged_in_1" - returned when 1 reaction occurred to a post that the current user was tagged in
"reacted_tagged_in_2" - returned when 2 reactions occurred to a post that the current user was tagged in
"reacted_tagged_in_3" - returned when 3 or more reactions occurred to a post that the current user was tagged in
"reacted_your_post_1" - returned when 1 reaction occurred to the current user's post
"reacted_your_post_2" - returned when 2 reactions occurred to the current user's post
"reacted_your_post_3" - returned when 3 or more reactions occurred to the current user's post
"reacted_your_profile_1" - returned when 1 reaction occurred to the current user's profile
"reacted_your_profile_2" - returned when 2 reactions occurred to the current user's profile
"reacted_your_profile_3" - returned when 3 or more reactions occurred to the current user's profile
"reposted_tagged_in_1" - returned when 1 repost occurred to a post that the current user was tagged in
"reposted_tagged_in_2" - returned when 2 reposts occurred to a post that the current user was tagged in
"reposted_tagged_in_3" - returned when 3 or more reposts occurred to a post that the current user was tagged in
"reposted_your_post_1" - returned when 1 repost occurred to the current user's post
"reposted_your_post_2" - returned when 2 reposts occurred to the current user's post
"reposted_your_post_3" - returned when 3 or more reposts occurred to the current user's post
"reposted_your_profile_1" - returned when 1 repost occurred to the current user's profile
"reposted_your_profile_2" - returned when 2 reposts occurred to the current user's profile
"reposted_your_profile_3" - returned when 3 or more reposts occurred to the current user's profile
"zapped_tagged_in_1" - returned when 1 zap occurred to a post that the current user was tagged in
"zapped_tagged_in_2" - returned when 2 zaps occurred to a post that the current user was tagged in
"zapped_tagged_in_3" - returned when 3 or more zaps occurred to a post that the current user was tagged in
"zapped_your_post_1" - returned when 1 zap occurred to the current user's post
"zapped_your_post_2" - returned when 2 zaps occurred to the current user's post
"zapped_your_post_3" - returned when 3 or more zaps occurred to the current user's post
"zapped_your_profile_1" - returned when 1 zap occurred to the current user's profile
"zapped_your_profile_2" - returned when 2 zaps occurred to the current user's profile
"zapped_your_profile_3" - returned when 3 or more zaps occurred to the current user's profile
*/
func reacting_to_text(profiles: Profiles, our_pubkey: String, group: EventGroupType, ev: NostrEvent?, locale: Locale? = nil) -> String {
let verb = reacting_to_verb(group: group)
let reacting_to = determine_reacting_to(our_pubkey: our_pubkey, ev: ev)
let target = determine_reacting_to_text(reacting_to)
if group.events.count == 1 {
let localization_key = "\(verb)_\(reacting_to)_\(min(group.events.count, 3))"
let bundle = bundleForLocale(locale: locale)
switch group.events.count {
case 0:
return NSLocalizedString("??", comment: "")
case 1:
let ev = group.events.first!
let profile = profiles.lookup(id: ev.pubkey)
let display_name = Profile.displayName(profile: profile, pubkey: ev.pubkey)
return String(format: "%@ is %@ %@", display_name, verb, target)
}
if group.events.count == 2 {
return String(format: bundle.localizedString(forKey: localization_key, value: bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: localization_key, value: nil, table: nil), table: nil), locale: locale, display_name)
case 2:
let alice_name = event_author_name(profiles: profiles, group.events[0])
let bob_name = event_author_name(profiles: profiles, group.events[1])
return String(format: "%@ and %@ are %@ %@", alice_name, bob_name, verb, target)
}
if group.events.count > 2 {
return String(format: bundle.localizedString(forKey: localization_key, value: bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: localization_key, value: nil, table: nil), table: nil), locale: locale, alice_name, bob_name)
default:
let alice_name = event_author_name(profiles: profiles, group.events.first!)
let count = group.events.count - 1
return String(format: "%@ and %d other people are %@ %@", alice_name, count, verb, target)
return String(format: bundle.localizedString(forKey: localization_key, value: bundleForLocale(locale: Locale(identifier: "en-US")).localizedString(forKey: localization_key, value: nil, table: nil), table: nil), locale: locale, count, alice_name)
}
return "??"
}
func reacting_to_verb(group: EventGroupType) -> String {
switch group {
case .reaction:
return "reacting"
return "reacted"
case .repost:
return "reposting"
return "reposted"
case .zap: fallthrough
case .profile_zap:
return "zapping"
return "zapped"
}
}
@ -111,7 +135,7 @@ struct EventGroupView: View {
let group: EventGroupType
var GroupDescription: some View {
Text(reacting_to_text(profiles: state.profiles, our_pubkey: state.pubkey, group: group, ev: event))
Text(verbatim: "\(reacting_to_text(profiles: state.profiles, our_pubkey: state.pubkey, group: group, ev: event))")
}
func ZapIcon(_ zapgrp: ZapGroup) -> some View {
@ -168,8 +192,9 @@ struct EventGroupView: View {
}
let test_encoded_post = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}"
let test_repost = NostrEvent(id: "", content: test_encoded_post, pubkey: "", kind: 6, tags: [], createdAt: 1)
let test_reposts = [test_repost, test_repost]
let test_repost_1 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk1", kind: 6, tags: [], createdAt: 1)
let test_repost_2 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk2", kind: 6, tags: [], createdAt: 1)
let test_reposts = [test_repost_1, test_repost_2]
let test_event_group = EventGroup(events: test_reposts)
struct EventGroupView_Previews: PreviewProvider {

Binary file not shown.

View File

@ -34,6 +34,54 @@
<string>Followers</string>
</dict>
</dict>
<key>reacted_tagged_in_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REACTED@</string>
<key>REACTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reacted to a post you were tagged in</string>
<key>other</key>
<string>%2$@ and %1$d others reacted to a post you were tagged in</string>
</dict>
</dict>
<key>reacted_your_post_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REACTED@</string>
<key>REACTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reacted to your post</string>
<key>other</key>
<string>%2$@ and %1$d others reacted to your post</string>
</dict>
</dict>
<key>reacted_your_profile_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REACTED@</string>
<key>REACTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reacted to your profile</string>
<key>other</key>
<string>%2$@ and %1$d others reacted to your profile</string>
</dict>
</dict>
<key>reactions_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
@ -82,6 +130,54 @@
<string>Replying to %2$@, %3$@ &amp; %1$d others</string>
</dict>
</dict>
<key>reposted_tagged_in_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REPOSTED@</string>
<key>REPOSTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reposted a post you were tagged in</string>
<key>other</key>
<string>%2$@ and %1$d others reposted a post you were tagged in</string>
</dict>
</dict>
<key>reposted_your_post_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REPOSTED@</string>
<key>REPOSTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reposted your post</string>
<key>other</key>
<string>%2$@ and %1$d others reposted your post</string>
</dict>
</dict>
<key>reposted_your_profile_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REPOSTED@</string>
<key>REPOSTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reposted your profile</string>
<key>other</key>
<string>%2$@ and %1$d others reposted your profile</string>
</dict>
</dict>
<key>reposts_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
@ -114,6 +210,54 @@
<string>%2$@ sats</string>
</dict>
</dict>
<key>zapped_tagged_in_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@ZAPPED@</string>
<key>ZAPPED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other zapped a post you were tagged in</string>
<key>other</key>
<string>%2$@ and %1$d others zapped a post you were tagged in</string>
</dict>
</dict>
<key>zapped_your_post_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@ZAPPED@</string>
<key>ZAPPED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other zapped your post</string>
<key>other</key>
<string>%2$@ and %1$d others zapped your post</string>
</dict>
</dict>
<key>zapped_your_profile_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@ZAPPED@</string>
<key>ZAPPED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other zapped your profile</string>
<key>other</key>
<string>%2$@ and %1$d others zapped your profile</string>
</dict>
</dict>
<key>zaps_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>

View File

@ -32,6 +32,11 @@
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="%@" xml:space="preserve">
<source>%@</source>
<target>%@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ %@" xml:space="preserve">
<source>%@ %@</source>
<target>%@ %@</target>
@ -73,6 +78,11 @@ Sentence composed of 2 variables to describe how many people are following a use
<target>'%@' is an invalid NIP-05 identifier. It should look like an email.</target>
<note>Description of why the nip05 identifier is invalid.</note>
</trans-unit>
<trans-unit id="??" xml:space="preserve">
<source>??</source>
<target>??</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="API Key (optional)" xml:space="preserve">
<source>API Key (optional)</source>
<target>API Key (optional)</target>
@ -1209,6 +1219,66 @@ Label for filter for seeing your posts and replies (instead of only your posts).
<target>optional</target>
<note>Label indicating that a form input is optional.</note>
</trans-unit>
<trans-unit id="reacted_tagged_in_1" xml:space="preserve">
<source>%@ reacted to a post you were tagged in</source>
<target>%@ reacted to a post you were tagged in</target>
<note>Notification that a user reacted to a post that the current user was tagged in</note>
</trans-unit>
<trans-unit id="reacted_tagged_in_2" xml:space="preserve">
<source>%@ and %@ reacted to a post you were tagged in</source>
<target>%@ and %@ reacted to a post you were tagged in</target>
<note>Notification that 2 users reacted to a post that the current user was tagged in</note>
</trans-unit>
<trans-unit id="reacted_your_post_1" xml:space="preserve">
<source>%@ reacted to your post</source>
<target>%@ reacted to your post</target>
<note>Notification that a user reacted to the current user's post</note>
</trans-unit>
<trans-unit id="reacted_your_post_2" xml:space="preserve">
<source>%@ and %@ reacted to your post</source>
<target>%@ and %@ reacted to your post</target>
<note>Notification that 2 users reacted to the current user's profile</note>
</trans-unit>
<trans-unit id="reacted_your_profile_1" xml:space="preserve">
<source>%@ reacted to your profile</source>
<target>%@ reacted to your profile</target>
<note>Notification that a user reacted to the current user's profile</note>
</trans-unit>
<trans-unit id="reacted_your_profile_2" xml:space="preserve">
<source>%@ and %@ reacted to your profile</source>
<target>%@ and %@ reacted to your profile</target>
<note>Notification that 2 users reacted to the current user's profile</note>
</trans-unit>
<trans-unit id="reposted_tagged_in_1" xml:space="preserve">
<source>%@ reposted a post you were tagged in</source>
<target>%@ reposted a post you were tagged in</target>
<note>Notification that a user reposted a post that the current user was tagged in</note>
</trans-unit>
<trans-unit id="reposted_tagged_in_2" xml:space="preserve">
<source>%@ and %@ reposted a post you were tagged in</source>
<target>%@ and %@ reposted a post you were tagged in</target>
<note>Notification that 2 users reposted a post that the current user was tagged in</note>
</trans-unit>
<trans-unit id="reposted_your_post_1" xml:space="preserve">
<source>%@ reposted your post</source>
<target>%@ reposted your post</target>
<note>Notification that a user reposted the current user's post</note>
</trans-unit>
<trans-unit id="reposted_your_post_2" xml:space="preserve">
<source>%@ and %@ reposted your post</source>
<target>%@ and %@ reposted your post</target>
<note>Notification that 2 users reposted the current user's post</note>
</trans-unit>
<trans-unit id="reposted_your_profile_1" xml:space="preserve">
<source>%@ reposted your profile</source>
<target>%@ reposted your profile</target>
<note>Notification that a user reposted the current user's profile</note>
</trans-unit>
<trans-unit id="reposted_your_profile_2" xml:space="preserve">
<source>%@ and %@ reposted your profile</source>
<target>%@ and %@ reposted your profile</target>
<note>Notification that 2 users reposted the current user's profile</note>
</trans-unit>
<trans-unit id="satoshi" xml:space="preserve">
<source>satoshi</source>
<target>satoshi</target>
@ -1224,6 +1294,36 @@ Label for filter for seeing your posts and replies (instead of only your posts).
<target>you</target>
<note>You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself.</note>
</trans-unit>
<trans-unit id="zapped_tagged_in_1" xml:space="preserve">
<source>%@ zapped a post you were tagged in</source>
<target>%@ zapped a post you were tagged in</target>
<note>Notification that a user zapped a post that the current user was tagged in</note>
</trans-unit>
<trans-unit id="zapped_tagged_in_2" xml:space="preserve">
<source>%@ and %@ zapped a post you were tagged in</source>
<target>%@ and %@ zapped a post you were tagged in</target>
<note>Notification that 2 users zapped a post that the current user was tagged in</note>
</trans-unit>
<trans-unit id="zapped_your_post_1" xml:space="preserve">
<source>%@ zapped your post</source>
<target>%@ zapped your post</target>
<note>Notification that a user zapped the current user's post</note>
</trans-unit>
<trans-unit id="zapped_your_post_2" xml:space="preserve">
<source>%@ and %@ zapped your post</source>
<target>%@ and %@ zapped your post</target>
<note>Notification that 2 users zapped the current user's post</note>
</trans-unit>
<trans-unit id="zapped_your_profile_1" xml:space="preserve">
<source>%@ zapped your profile</source>
<target>%@ zapped your profile</target>
<note>Notification that a user zapped the current user's profile</note>
</trans-unit>
<trans-unit id="zapped_your_profile_2" xml:space="preserve">
<source>%@ and %@ zapped your profile</source>
<target>%@ and %@ zapped your profile</target>
<note>Notification that 2 users zapped the current user's profile</note>
</trans-unit>
<trans-unit id="⚡️ %@" xml:space="preserve">
<source>⚡️ %@</source>
<target>⚡️ %@</target>
@ -1266,6 +1366,51 @@ Label for filter for seeing your posts and replies (instead of only your posts).
<target>%#@FOLLOWERS@</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_tagged_in_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REACTED@</source>
<target>%#@REACTED@</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_tagged_in_3:dict/REACTED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other reacted to a post you were tagged in</source>
<target>%2$@ and %1$d other reacted to a post you were tagged in</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_tagged_in_3:dict/REACTED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others reacted to a post you were tagged in</source>
<target>%2$@ and %1$d others reacted to a post you were tagged in</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_your_post_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REACTED@</source>
<target>%#@REACTED@</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_your_post_3:dict/REACTED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other reacted to your post</source>
<target>%2$@ and %1$d other reacted to your post</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_your_post_3:dict/REACTED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others reacted to your post</source>
<target>%2$@ and %1$d others reacted to your post</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_your_profile_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REACTED@</source>
<target>%#@REACTED@</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_your_profile_3:dict/REACTED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other reacted to your profile</source>
<target>%2$@ and %1$d other reacted to your profile</target>
<note/>
</trans-unit>
<trans-unit id="/reacted_your_profile_3:dict/REACTED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others reacted to your profile</source>
<target>%2$@ and %1$d others reacted to your profile</target>
<note/>
</trans-unit>
<trans-unit id="/reactions_count:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REACTIONS@</source>
<target>%#@REACTIONS@</target>
@ -1311,6 +1456,51 @@ Label for filter for seeing your posts and replies (instead of only your posts).
<target>Replying to %2$@, %3$@ &amp; %1$d others</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_tagged_in_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REPOSTED@</source>
<target>%#@REPOSTED@</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_tagged_in_3:dict/REPOSTED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other reposted a post you were tagged in</source>
<target>%2$@ and %1$d other reposted a post you were tagged in</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_tagged_in_3:dict/REPOSTED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others reposted a post you were tagged in</source>
<target>%2$@ and %1$d others reposted a post you were tagged in</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_your_post_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REPOSTED@</source>
<target>%#@REPOSTED@</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_your_post_3:dict/REPOSTED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other reposted your post</source>
<target>%2$@ and %1$d other reposted your post</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_your_post_3:dict/REPOSTED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others reposted your post</source>
<target>%2$@ and %1$d others reposted your post</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_your_profile_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REPOSTED@</source>
<target>%#@REPOSTED@</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_your_profile_3:dict/REPOSTED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other reposted your profile</source>
<target>%2$@ and %1$d other reposted your profile</target>
<note/>
</trans-unit>
<trans-unit id="/reposted_your_profile_3:dict/REPOSTED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others reposted your profile</source>
<target>%2$@ and %1$d others reposted your profile</target>
<note/>
</trans-unit>
<trans-unit id="/reposts_count:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@REPOSTS@</source>
<target>%#@REPOSTS@</target>
@ -1341,6 +1531,51 @@ Label for filter for seeing your posts and replies (instead of only your posts).
<target>%2$@ sats</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_tagged_in_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@ZAPPED@</source>
<target>%#@ZAPPED@</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_tagged_in_3:dict/ZAPPED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other zapped a post you were tagged in</source>
<target>%2$@ and %1$d other zapped a post you were tagged in</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_tagged_in_3:dict/ZAPPED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others zapped a post you were tagged in</source>
<target>%2$@ and %1$d others zapped a post you were tagged in</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_your_post_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@ZAPPED@</source>
<target>%#@ZAPPED@</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_your_post_3:dict/ZAPPED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other zapped your post</source>
<target>%2$@ and %1$d other zapped your post</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_your_post_3:dict/ZAPPED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others zapped your post</source>
<target>%2$@ and %1$d others zapped your post</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_your_profile_3:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@ZAPPED@</source>
<target>%#@ZAPPED@</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_your_profile_3:dict/ZAPPED:dict/one:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d other zapped your profile</source>
<target>%2$@ and %1$d other zapped your profile</target>
<note/>
</trans-unit>
<trans-unit id="/zapped_your_profile_3:dict/ZAPPED:dict/other:dict/:string" xml:space="preserve">
<source>%2$@ and %1$d others zapped your profile</source>
<target>%2$@ and %1$d others zapped your profile</target>
<note/>
</trans-unit>
<trans-unit id="/zaps_count:dict/NSStringLocalizedFormatKey:dict/:string" xml:space="preserve">
<source>%#@ZAPS@</source>
<target>%#@ZAPS@</target>

View File

@ -34,6 +34,54 @@
<string>Followers</string>
</dict>
</dict>
<key>reacted_tagged_in_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REACTED@</string>
<key>REACTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reacted to a post you were tagged in</string>
<key>other</key>
<string>%2$@ and %1$d others reacted to a post you were tagged in</string>
</dict>
</dict>
<key>reacted_your_post_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REACTED@</string>
<key>REACTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reacted to your post</string>
<key>other</key>
<string>%2$@ and %1$d others reacted to your post</string>
</dict>
</dict>
<key>reacted_your_profile_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REACTED@</string>
<key>REACTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reacted to your profile</string>
<key>other</key>
<string>%2$@ and %1$d others reacted to your profile</string>
</dict>
</dict>
<key>reactions_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
@ -82,6 +130,54 @@
<string>Replying to %2$@, %3$@ &amp; %1$d others</string>
</dict>
</dict>
<key>reposted_tagged_in_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REPOSTED@</string>
<key>REPOSTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reposted a post you were tagged in</string>
<key>other</key>
<string>%2$@ and %1$d others reposted a post you were tagged in</string>
</dict>
</dict>
<key>reposted_your_post_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REPOSTED@</string>
<key>REPOSTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reposted your post</string>
<key>other</key>
<string>%2$@ and %1$d others reposted your post</string>
</dict>
</dict>
<key>reposted_your_profile_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@REPOSTED@</string>
<key>REPOSTED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other reposted your profile</string>
<key>other</key>
<string>%2$@ and %1$d others reposted your profile</string>
</dict>
</dict>
<key>reposts_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
@ -114,6 +210,54 @@
<string>%2$@ sats</string>
</dict>
</dict>
<key>zapped_tagged_in_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@ZAPPED@</string>
<key>ZAPPED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other zapped a post you were tagged in</string>
<key>other</key>
<string>%2$@ and %1$d others zapped a post you were tagged in</string>
</dict>
</dict>
<key>zapped_your_post_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@ZAPPED@</string>
<key>ZAPPED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other zapped your post</string>
<key>other</key>
<string>%2$@ and %1$d others zapped your post</string>
</dict>
</dict>
<key>zapped_your_profile_3</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@ZAPPED@</string>
<key>ZAPPED</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%2$@ and %1$d other zapped your profile</string>
<key>other</key>
<string>%2$@ and %1$d others zapped your profile</string>
</dict>
</dict>
<key>zaps_count</key>
<dict>
<key>NSStringLocalizedFormatKey</key>

View File

@ -0,0 +1,42 @@
//
// EventGroupViewTests.swift
// damusTests
//
// Created by Terry Yiu on 2/26/23.
//
import XCTest
@testable import damus
final class EventGroupViewTests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testReactingToText() throws {
let enUsLocale = Locale(identifier: "en-US")
let damusState = test_damus_state()
let encodedPost = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}"
let repost1 = NostrEvent(id: "", content: encodedPost, pubkey: "pk1", kind: NostrKind.boost.rawValue, tags: [], createdAt: 1)
let repost2 = NostrEvent(id: "", content: encodedPost, pubkey: "pk2", kind: NostrKind.boost.rawValue, tags: [], createdAt: 1)
XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [])), ev: test_event, locale: enUsLocale), "??")
XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1])), ev: test_event, locale: enUsLocale), "pk1:pk1 reposted a post you were tagged in")
XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2])), ev: test_event, locale: enUsLocale), "pk1:pk1 and pk2:pk2 reposted a post you were tagged in")
XCTAssertEqual(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2, repost2])), ev: test_event, locale: enUsLocale), "pk1:pk1 and 2 others reposted a post you were tagged in")
Bundle.main.localizations.map { Locale(identifier: $0) }.forEach {
XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [])), ev: test_event, locale: $0), "??")
XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1])), ev: test_event, locale: $0))
XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2])), ev: test_event, locale: $0))
XCTAssertNoThrow(reacting_to_text(profiles: damusState.profiles, our_pubkey: damusState.pubkey, group: .repost(EventGroup(events: [repost1, repost2, repost2])), ev: test_event, locale: $0))
}
}
}

View File

@ -4,4 +4,4 @@
xcodebuild -exportLocalizations -project damus.xcodeproj -localizationPath "damus" -exportLanguage en-US
# Generates all SwiftUI Text() wrapped localized strings.
genstrings -o "damus/en-US.xcloc/Source Contents/damus/en-US.lproj/" -SwiftUI **/*.swift
genstrings -a -d -o "damus/en-US.xcloc/Source Contents/damus/en-US.lproj/" -SwiftUI **/*.swift