Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 90 additions & 1 deletion AppIntents.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,36 @@
"state" : "translated",
"value" : "%lld items"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "%lld elementos"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "%lld éléments"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "%lld элементов"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "%lld öğe"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "%lld елементів"
}
}
}
},
Expand All @@ -31,11 +61,40 @@
"state" : "translated",
"value" : "${int} Borrowed Items"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "${int} elementos prestados"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "${int} éléments empruntés"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "${int} выданных книг"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "${int} ödünç alınan öğe"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "${int} позичених елементів"
}
}
}
},
"BTLB" : {
"comment" : "AppIntents.strings\n BTLB\n\n Created by Martin Kim Dung-Pham on 20.02.24.\n Copyright © 2024 neoneon. All rights reserved.\n\n Keep this file so that App Intents will stay localized",
"localizations" : {
"de" : {
"stringUnit" : {
Expand All @@ -48,6 +107,36 @@
"state" : "translated",
"value" : "BTLB"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "BTLB"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "BTLB"
}
},
"ru" : {
"stringUnit" : {
"state" : "translated",
"value" : "BTLB"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "BTLB"
}
},
"uk" : {
"stringUnit" : {
"state" : "translated",
"value" : "BTLB"
}
}
}
}
Expand Down
148 changes: 148 additions & 0 deletions AppShortcuts.xcstrings
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
{
"sourceLanguage" : "en",
"strings" : {
"Renew with ${applicationName} |bɪtlɪb|" : {
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Verlängere mit ${applicationName} |bɪtlɪb|"
]
}
},
"en" : {
"stringSet" : {
"state" : "new",
"values" : [
"Renew with ${applicationName} |bɪtlɪb|",
"Renew using ${applicationName}",
"Renew Items with ${applicationName}",
"Renew Books with ${applicationName}",
"Renew Media with ${applicationName}",
"Prolong with ${applicationName}",
"Prolong using ${applicationName}",
"Extend books with ${applicationName}",
"Extend items with ${applicationName}",
"Renew Items with the ${applicationName} app",
"Renew Books with the ${applicationName} app",
"Renew Media with the ${applicationName} app",
"Renew with the ${applicationName} app",
"Prolong with the ${applicationName} app",
"Renew using the ${applicationName} app",
"Prolong using the ${applicationName} app",
"Extend books with the${applicationName} app",
"Extend items with the ${applicationName} app",
"Renew with the ${applicationName} app"
]
}
},
"es" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Renovar con ${applicationName} |bɪtlɪb|"
]
}
},
"fr" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Renouveler avec ${applicationName} |bɪtlɪb|"
]
}
},
"ru" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Продлить с ${applicationName} |bɪtlɪb|"
]
}
},
"tr" : {
"stringSet" : {
"state" : "translated",
"values" : [
"${applicationName} |bɪtlɪb| ile yenile"
]
}
},
"uk" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Продовжити з ${applicationName} |bɪtlɪb|"
]
}
}
}
},
"Search in ${applicationName} |bɪtlɪb|" : {
"extractionState" : "extracted_with_value",
"localizations" : {
"de" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Suche in ${applicationName} |bɪtlɪb|"
]
}
},
"en" : {
"stringSet" : {
"state" : "new",
"values" : [
"Search in ${applicationName} |bɪtlɪb|",
"Find in ${applicationName} |bɪtlɪb|",
"Look for something in ${applicationName} |bɪtlɪb|"
]
}
},
"es" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Buscar en ${applicationName} |bɪtlɪb|"
]
}
},
"fr" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Rechercher dans ${applicationName} |bɪtlɪb|"
]
}
},
"ru" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Поиск в ${applicationName} |bɪtlɪb|"
]
}
},
"tr" : {
"stringSet" : {
"state" : "translated",
"values" : [
"${applicationName} |bɪtlɪb| içinde ara"
]
}
},
"uk" : {
"stringSet" : {
"state" : "translated",
"values" : [
"Пошук у ${applicationName} |bɪtlɪb|"
]
}
}
}
}
},
"version" : "1.1"
}
29 changes: 8 additions & 21 deletions BTLB.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,6 @@
3B3EDF362D1F516E00B79D89 /* PaperMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B3EDF352D1F516300B79D89 /* PaperMapper.swift */; };
3B3EDF392D1F51CE00B79D89 /* Paper in Frameworks */ = {isa = PBXBuildFile; productRef = 3B3EDF382D1F51CE00B79D89 /* Paper */; };
3B3F89B629046D5700E9C9C1 /* ArchitectureX in Frameworks */ = {isa = PBXBuildFile; productRef = 3B3F89B529046D5700E9C9C1 /* ArchitectureX */; };
3B3FE1B32B8519F5002AB4B2 /* AppShortcuts.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B3FE1B52B8519F5002AB4B2 /* AppShortcuts.strings */; };
3B3FE1C42B852208002AB4B2 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3B3FE1C32B852208002AB4B2 /* Localizable.xcstrings */; };
3B3FEEF8213186B300335F6B /* generate-request-token.html in Resources */ = {isa = PBXBuildFile; fileRef = 3B3FEEF7213186B300335F6B /* generate-request-token.html */; };
3B41088D2B9E380D00B5E288 /* Logger+AppIntents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B4108892B9E380C00B5E288 /* Logger+AppIntents.swift */; };
3B41088E2B9E380D00B5E288 /* ItemEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B41088A2B9E380C00B5E288 /* ItemEntity.swift */; };
Expand Down Expand Up @@ -106,6 +104,8 @@
3BAF8FEC2B0A6C0900D5AF81 /* BTLBAppViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BAF8FEB2B0A6C0900D5AF81 /* BTLBAppViewModel.swift */; };
3BB33DED2BAE2B3F007FD132 /* Rorschach in Frameworks */ = {isa = PBXBuildFile; productRef = 3BB33DEC2BAE2B3F007FD132 /* Rorschach */; };
3BBA8CB023F2E8F000795358 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BBA8CAF23F2E8F000795358 /* AppDelegate.swift */; };
3BBD4C142E911FB500EC6A9A /* AppShortcuts.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3BBD4C132E911FB500EC6A9A /* AppShortcuts.xcstrings */; };
3BBD4C162E91243600EC6A9A /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3BBD4C152E91243600EC6A9A /* Localizable.xcstrings */; };
3BBFE8FA2C68E9E400C45819 /* Persistence in Frameworks */ = {isa = PBXBuildFile; productRef = 3BBFE8F92C68E9E400C45819 /* Persistence */; };
3BC1BC68294FA33B008A0090 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BC1BC67294FA33B008A0090 /* NotificationService.swift */; };
3BC1BC6C294FA33B008A0090 /* BTLBNotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3BC1BC65294FA33B008A0090 /* BTLBNotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
Expand Down Expand Up @@ -289,9 +289,6 @@
3B3D2EFC21370F9C00BCC6AD /* search-result-details.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "search-result-details.xml"; sourceTree = "<group>"; };
3B3ED2592BA6366C00C67380 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
3B3EDF352D1F516300B79D89 /* PaperMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaperMapper.swift; sourceTree = "<group>"; };
3B3FE1B42B8519F5002AB4B2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AppShortcuts.strings; sourceTree = "<group>"; };
3B3FE1B62B8519FA002AB4B2 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/AppShortcuts.strings; sourceTree = "<group>"; };
3B3FE1C32B852208002AB4B2 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
3B3FEEF7213186B300335F6B /* generate-request-token.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "generate-request-token.html"; sourceTree = "<group>"; };
3B4108832B9E37DB00B5E288 /* RenewIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenewIntent.swift; sourceTree = "<group>"; };
3B4108892B9E380C00B5E288 /* Logger+AppIntents.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Logger+AppIntents.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -323,6 +320,8 @@
3BB68ABA1FFFA3DF00A1F616 /* BTLBTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTLBTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3BB68ABE1FFFA3DF00A1F616 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3BBA8CAF23F2E8F000795358 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
3BBD4C132E911FB500EC6A9A /* AppShortcuts.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = AppShortcuts.xcstrings; sourceTree = "<group>"; };
3BBD4C152E91243600EC6A9A /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
3BBD79C3294CFE130006A165 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
3BBD79C4294CFE320006A165 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
3BC1BC65294FA33B008A0090 /* BTLBNotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = BTLBNotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -564,10 +563,10 @@
3B020A1B2D047AB200B8486C /* Loans.xcstrings */,
3B020A0F2D047AB100B8486C /* Tabbar.xcstrings */,
3B020A172D047AB200B8486C /* Catalogue.xcstrings */,
3B3FE1B52B8519F5002AB4B2 /* AppShortcuts.strings */,
3BBD4C152E91243600EC6A9A /* Localizable.xcstrings */,
3B020A052D047AB100B8486C /* AppIntents.xcstrings */,
3B3FE1C32B852208002AB4B2 /* Localizable.xcstrings */,
3B020A112D047AB200B8486C /* InfoPlist.xcstrings */,
3BBD4C132E911FB500EC6A9A /* AppShortcuts.xcstrings */,
);
name = Strings;
sourceTree = "<group>";
Expand Down Expand Up @@ -997,15 +996,15 @@
3B020A062D047AB100B8486C /* AppIntents.xcstrings in Resources */,
3B020A0C2D047AB100B8486C /* Summary.xcstrings in Resources */,
39F8D8C611ED28070009DE37 /* Credits.md in Resources */,
3BBD4C142E911FB500EC6A9A /* AppShortcuts.xcstrings in Resources */,
3B020A102D047AB200B8486C /* Tabbar.xcstrings in Resources */,
3B020A162D047AB200B8486C /* Favourites.xcstrings in Resources */,
3B3FE1B32B8519F5002AB4B2 /* AppShortcuts.strings in Resources */,
3B020A0A2D047AB100B8486C /* ActivityAndMessages.xcstrings in Resources */,
3B020A1A2D047AB200B8486C /* Imprint.xcstrings in Resources */,
3B020A082D047AB100B8486C /* Accessibles.xcstrings in Resources */,
3B3FE1C42B852208002AB4B2 /* Localizable.xcstrings in Resources */,
3BF799B72E181A2500F63075 /* Secrets.xcconfig in Resources */,
3B020A122D047AB200B8486C /* InfoPlist.xcstrings in Resources */,
3BBD4C162E91243600EC6A9A /* Localizable.xcstrings in Resources */,
3B3ED25A2BA63DFC00C67380 /* PrivacyInfo.xcprivacy in Resources */,
3B020A182D047AB200B8486C /* Catalogue.xcstrings in Resources */,
3B020A1C2D047AB200B8486C /* Loans.xcstrings in Resources */,
Expand Down Expand Up @@ -1219,18 +1218,6 @@
};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
3B3FE1B52B8519F5002AB4B2 /* AppShortcuts.strings */ = {
isa = PBXVariantGroup;
children = (
3B3FE1B42B8519F5002AB4B2 /* en */,
3B3FE1B62B8519FA002AB4B2 /* de */,
);
name = AppShortcuts.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
39DA496D11A2060200789D29 /* Debug */ = {
isa = XCBuildConfiguration;
Expand Down
29 changes: 29 additions & 0 deletions Documentation/AI Toolbox/localization-guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
name: localization-expert
description: Localization expert for iOS apps. Use proactively for localization tasks of specific files.
tools: Read, Edit, Bash, Grep, Glob
model: sonnet
---

You are a senior app localization expert fluent in many languages, ensuring the best possible translations for the library management app.

## General Guidelines

- Translations are for a **library management app** and must use domain-appropriate terminology.
- Do not use slang or informal expressions unless explicitly required.
- Do not remove any existing translations or keys.
- Always preserve placeholders and variables exactly as written (e.g., `%@`, `%d`, `{count}`), and ensure translations around them are grammatically correct.
- Handle pluralization and inflection properly; use `.stringsdict` format if needed.
- Check localization comments for semantic hints before translating.
- Ensure **consistency across files** for identical source strings. If different contexts require different translations, explain the differences.
- Follow conventions of the **target language** (formal/informal address, capitalization, punctuation spacing, etc.).
- If a string has no natural equivalent in the target language, provide both:
1. An English fallback
2. A descriptive translation option
…and ask which should be preferred.
- Always preserve valid `.xcstrings` JSON structure and `.strings` file formatting when editing.
- If a placeholder is surrounded by quotes like: `“%@“` us `“` instead of `"`. Otherwise the file formatting will become invalid.

## Ambiguity Resolution

- If two translations are equally valid, describe the differences (e.g., nuance, tone, or context) and ask which one should be used.
Loading