Add xcstrings support#865
Conversation
Beer-Koala
left a comment
There was a problem hiding this comment.
It algorithm has a problem if in xcstrings file have few diffeerents formats. For example:
{
"sourceLanguage" : "en",
"strings" : {
"continue" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Continue"
}
}
}
},
"Diagnose" : {
"extractionState" : "manual"
},
"Explore" : {
"extractionState" : "manual"
},
"Garden" : {
"extractionState" : "manual"
},
"Home" : {
"extractionState" : "manual"
},
"noLocationLabel" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Get customized planting plan for your zone"
}
}
}
},
......
|
Any updates on this? Let's merge mb? |
|
Bump |
|
Sorry I couldn't read this PR for a long time. @Beer-Koala On my code I assumed that each key to have a localizations object, which contains a key for "sourceLanguage". However, my assumption is wrong. Just after a new key is created, it does not have any localization object until a value is entered. I am using my own breach since November, and I didn't encounter this problem, because I immediately enter an English value. I will update my branch. |
|
Any updates about merging this PR? |
I did a simple development for xcstrings support.
It is backward compatible for for
.xcstringsfiles converted from.stringsfiles. It means the same R.string codes will be generated.However, it is not backward compatible for
.xcstringsfiles converted from.stringsdictfiles, because of named arguments.About named arguments
My implementation strips names of substitutions from generated arguments. I found using them problematic on some cases.
In my opinion, named arguments does not worth the implementation. Xcode generates substituons only if there are more than one pluralable parameter on new xcstrings files. The most of the string values will not be have any information to generate named arguments.
Problematic case 1
Some key information is lost on the xcstring convertion of stringsdict files.
Original stringsdict content.
Generated xcstrings content
R.swift creates .x_users(users: Int) for stringsdict file. However, xcstrings file does not have the argument name information any more.
If string value of the original content is
<string>Add %#@users@</string>, generated xcstrings would keep the substitution information.Problematic case 2
This strings value is "1 iPhone and 10 touches" on iPhones and "1 Mac and 10 keys" on Mac.
There are 2 substitutions for each device variation.
Which signature should we use?
.example(device_iphone: Int, input_iphone: Int)
.example(device_mac: Int, input_mac: Int)
.example(_ arg1: Int, _ arg2: Int)
.example(device Int, input: Int) //With some extra coding to detect shared parts of the names.
About algorithm
The alghorithm tries to convert localization of source language to single string with basic format parameters, then it uses FormatPart.formatParts(formatString:)` on this string to extract parameters.
This convertion works like that:
Substitutions replacement works like that:
Example 1
Example 2
Example 3
%#@books@ and %#@pens@%arg book%1$lld book%1$lld book and %#@pens@%arg pen%2$lld pen%1$lld book and%2$lld pen%1$lld book and %2$lld pen. [%lld, %lld]