flinedev / bartycrouch Goto Github PK
View Code? Open in Web Editor NEWLocalization/I18n: Incrementally update/translate your Strings files from .swift, .h, .m(m), .storyboard or .xib files.
License: MIT License
Localization/I18n: Incrementally update/translate your Strings files from .swift, .h, .m(m), .storyboard or .xib files.
License: MIT License
Hey, I'd love to see this lib available in Swift 3 so I can implement it in my project.
Thanks 😄
A linter like https://github.com/realm/SwiftLint should be added to help complying to code conventions.
Currently it is only possible to pass output file paths, choose all or choose all with some excluded paths. When passing output file paths OR the excluded paths there should be an option to simply specify the locale code like so and it should use the paths found by -a
to determine the full paths:
bartycrouch -i "path/to/Main.storyboard" -o en de ja zh-Hans
bartycrouch -i "path/to/Main.storyboard" -e en-GB es zh-Hant
This can be done by using a regex like this one: /\A[a-z]{2}[-]{0,1}\w*\z/
BartyCrouch isn't doing anything if any of the Storyboard files is missing a translation. For example if English, Polish and Russian are specified as the projects supported languages, and there are Main.storyboard
and LaunchScreen.storyboard
, both base-internationalized but only for Russian and Polish, not for English, then BartyCrouch currently fails completely with "Error! No input files found." which is too general.
We could do one of the following:
Hello,
Why am i getting "Error! No Localizable.strings
file found for output." ?
I use
if which bartycrouch > /dev/null; then
# Incrementally update all Storyboards/XIBs strings files
bartycrouch interfaces -p "$PROJECT_DIR"
# Add new keys to Localizable.strings files from NSLocalizedString in code
bartycrouch code -p "$PROJECT_DIR" -l "$PROJECT_DIR" -a
else
echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi
Incrementally updated keys of file '/Users/utkudalmaz/Developer/Jemiyet/Jemiyett/tr-TR.lproj/LaunchScreen.strings'.
BartyCrouch: Successfully updated strings file(s) of Storyboard or XIB file.
Incrementally updated keys of file '/Users/utkudalmaz/Developer/Jemiyet/Jemiyett/tr-TR.lproj/Main.strings'.
BartyCrouch: Successfully updated strings file(s) of Storyboard or XIB file.
Error! No Localizable.strings
file found for output.
Command /bin/sh failed with exit code 64
If I have the following code:
let s1 = NSLocalizedString("test", comment: "test comment containing ()")
The generated .strings file becomes:
"test" = "";
There seems to be a bug in the comment matching pattern in the recent multiline comment support. I took the solution from http://blog.ostermiller.org/find-comment and adapted it a bit (removed newline characters thanks to .dotMatchesLineSeparators and added extra brackets to keep the third last capture group pointing to the comment), now it seems to work fine:
let translationRegexString = "(?:\\s*/\\*(((?:[^*]|(?:\\*+(?:[^*/])))*))\\*+/\\s*)?\\s*(?:^\\s*\"([\\S ]*)\"\\s*=\\s*\"([\\S ]*)\"\\s*;\\s*$)"
hello,
When I run BartyCrouch it nicely adds new UIElements in interface files to the strings file, but the title is always empty. For example, when I add a new label and run BartyCrouch the strings file reads
/* Class = "UILabel"; text = "New Label"; ObjectID = "6F2-Kl-Hfp"; */
"6F2-Kl-Hfp.text" = "";
The same happens with new buttons. What could be the reason for this?
Thanks and regards,
Sebastian Mecklenburg
I'm honestly having a hard time understanding why I have this error. I have a Storyboard localized in base + 1 language, Then I have a Localizable.strings file for the NSLocalizedString(s) in code (which I performed using in swift a ".localized" extension to String).
Here's the storyboard with its .strings file localized in italian
here some other xib localized (some using .strings some using localized .xib)
I have this error:
$ nowr-ios (master) $ bartycrouch interfaces -p .
BartyCrouch: Successfully updated strings file(s) of Storyboard or XIB file.
Error! No file exists at output path './nowr-ios/Code/it.lproj/LoginViewController.strings'.
Am I missing something obvious or is there a bug?
I have a UILabel in a storyboard with 😀
as the text. I added a new locale through Xcode which gives me in the .strings file:
/* Class = "UILabel"; text = "😀"; ObjectID = "hi9-mx-Y1T"; */
"hi9-mx-Y1T.text" = "😀";
However, when I run BartyCrouch, it removes those two lines.
Example
Command: bartycrouch interfaces -p ./
Several translations, all with newlines, are affected. The original has \n but the translations contain actual newlines, which BartyCrouch does not seem to like very much.
Example:
-/* Class = "UILabel"; text = "LIVE RECORDING\n00:00:00"; ObjectID = "y9M-C2-74f"; */
-"y9M-C2-74f.text" = "实时录制
-00:00:00";
-
******* some other translations ***********
+/* Class = "UILabel"; text = "LIVE RECORDING\n00:00:00"; ObjectID = "y9M-C2-74f"; */
+"y9M-C2-74f.text" = "";
So the problem is two-fold:
How do I handle this properly?
For example, there is one generated comment:
/* Class = "UITableViewSection"; headerTitle = "Foo"; ObjectID = "HQs-Z9-d7P"; */
"HQs-Z9-d7P.headerTitle" = "Foo";
If the base localization "Foo" was changed to "Bar" in the base Main.storyboard
, can .strings
files be also updated to reflect the change? To become:
/* Class = "UITableViewSection"; headerTitle = "Bar"; ObjectID = "HQs-Z9-d7P"; */
"HQs-Z9-d7P.headerTitle" = "Bar"; /* gets the update too if it wasn't a translated value */
First, thank you for creating this great tool!
In our workflow we usually add the default localization in comments, there is a possibility to add keys as a default value to the localized files. I think option -c
or --default-to-comment
to add comments as default values for code sub-command would be a great complement to the --default-to-keys
option.
What do you think about it?
addNewValuesAsEmpty
is set to true by default. It would be good if there was an option to turn it off.
Suppose I have the following code:
let s1 = NSLocalizedString("test", comment: "test comment 1")
let s2 = NSLocalizedString("test", comment: "test comment 2")
BC generated .strings file becomes:
"test" = "test";
However, with the original genstrings, the generated file would become:
/* test comment 1
test comment 2 */
"test" = "test";
In my project I have the following String extension which I use to localize strings:
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
Could something like this be supported by BartyCrouch?
The Microsoft Translator translates some Strings that contain a single quoted substring so that the result replaces the single quoted substrings with double quotes. This happens for some languages like Hungarian or Slovakian.
BartyCrouch could try prevent issues in these cases by simply adding a backslash in front of each double quoted translation result. It could also be that the right place to tackle this is in the Polyglot dependency, but it needs to be solved.
Example:
An english sentence like "She said: 'Stop!'" becomes "She said: "Stop"" for some languages. BartyCrouch should automatically escape the double quotes so that the result looks like this: "She said: "Stop!"".
Fails with an error "Command /bin/sh failed with exit code 139" when the Localizable.strings file is empty.
While using UNUserNotifications and the proposed Method of using [NSString localizedUserNotificationStringForKey:key arguments:arguments] for building notifications, I discovered that bartycrouch does not recognize those localisations and thus removes them from my Localizable.strings files.
Consider communicating with the command line using CommandLine. That would both provide handy features like help and make the code cleaner and more manageable.
The genstrings
command line tool which BartyCrouch uses also accepts an alternative function name than NSLocalizedString
. There was a first attempt in #14 to support this feature in BartyCrouch, too.
This should be implement sooner or later. Currently I'm waiting for @crystalstorm to write a simple test to ensure this feature continues to work in the future.
Projects with whitespace in name or path don't seem to be recognized.
Is it possible to exclude NSLocalizedStrings that have #bc-ignore!
in comment? The use case is that when we use .stringsdict to handle pluralization, we don't need to add these keys into Localizable.strings file.
Example
String.localizedStringWithFormat(NSLocalizedString("%d minute(s) ago", comment: "x minute(s) ago"), components.minute)
The %d minute(s) ago
key will be taken from Localizable.stringsdict file, not from Localizable.strings.
Another possible solution is to scan Localizable.stringsdict file for keys and exclude them from Localizable.strings file.
Would be great to have --exclude path option, to avoid picking up localisation from Pods and imported libraries
For example project has this structure:
running bartycrouch code -p .
will include localization from Pods or any third party libraries happen to be relative to project root. It mixes those 3rd party strings into your Localizable.strings.
Yes, the sources can be organized under something like /src in root of project, but that never happens. Sources are never in their own separate subtree.
As workaround paths can be included by running command multiple times. bartycrouch code -p Module1
, bartycrouch code -p Module2
etc. but that is not sustainable.
Currently when a Strings file is saved the order of the translations isn't changed, new translations are simply added at the end of the list. There should be an option to sort them by keys which is especially useful for the code
sub command when using structured keys like 'SETTINGS.USER_SECTION.LOGOUT'.
Hello,
Is it possible to use BartyCrouch in order to localize the Info.plist file?
If not, do you have any plan to support this?
Relevant error:
xcodebuild: error: invalid option '-O'
More information about the failed installation:
https://gist.github.com/anonymous/94d069976cd75423c6d0bd6da84e8927
Thank you for creating a great tool 👍
Is it possible to install via CocoaPods like SwiftLint?
By version control via CocoaPods, it makes it easier for multiple people to develop, oss development and more.
Hi,
I don't want incrementally updates localizable.string but this code return "Command /bin/sh failed with exit code 78"
if which bartycrouch > /dev/null; then bartycrouch interfaces -p "$PROJECT_DIR" -b else echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch" fi
What's wrong ?
Thanks in advance :D
According to https://openradar.appspot.com/22133811 and my personal experience, genstrings doesn't add strings with more than 2 arguments (key and comment) and ignores such strings with (unfortunately not helpful) error message.
The solution would be to switch to extractLocString (http://stackoverflow.com/a/38143845/2305175).
Hello,
i am trying to use BartyCrouch, but i always get the error 260 while domain is NSCocoaErrorDomain.
I am using this command (all my subfolders like en.lproj with the Localizable.strings files are in the subfolder Localizable. And Beatsnap is the root folder where all code is structures (also subfolders here)
bartycrouch code -p Beatsnap/ -l Beatsnap/Localizable -a -v
and getting this response
Error Domain=NSCocoaErrorDomain Code=260 "The file “Localizable.strings” couldn’t be opened because there is no such file." UserInfo={NSFilePath=Beatsnap//tmpstrings/Localizable.strings, NSUnderlyingError=0x7f92a2600af0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
Incrementally updated keys of file 'Beatsnap/Localizable/Base.lproj/Localizable.strings'.
Error Domain=NSCocoaErrorDomain Code=260 "The file “Localizable.strings” couldn’t be opened because there is no such file." UserInfo={NSFilePath=Beatsnap//tmpstrings/Localizable.strings, NSUnderlyingError=0x7f92a251ea10 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
Incrementally updated keys of file 'Beatsnap/Localizable/de.lproj/Localizable.strings'.
Error Domain=NSCocoaErrorDomain Code=260 "The file “Localizable.strings” couldn’t be opened because there is no such file." UserInfo={NSFilePath=Beatsnap//tmpstrings/Localizable.strings, NSUnderlyingError=0x7f92a2700ec0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
Incrementally updated keys of file 'Beatsnap/Localizable/en.lproj/Localizable.strings'.
BartyCrouch: Successfully updated strings file(s) of Code files.
And even though i added another NSLocalizedString
and says "Successfully updated..." the file Beatsnap/Localizable/en.lproj/Localizable.strings
is not changed
In 3.9, w/ changing of the order of reading the standard output/error, /usr/bin/find
is now hanging indefinitely for me.
If I swap the order so standardOutput
is read first, it works as expected with ~1000 files found and 0 errors:
(lldb) po errdata.isEmpty
true
The magic number (on my machine, at least. macOS 10.12.6, Xcode 9.0 9A235
) seems to be 983 files, anything over that and it seems to hang. I've attached a zip file with a file hierarchy that reproduced the bug on my machine. It is just a bunch of empty .swift/h/m
files in folders.
Today when updating homebrew repositories I receive the following:
> brew up
fatal: could not read Username for 'https://github.com': terminal prompts disabled
Error: Fetching /usr/local/Homebrew/Library/Taps/flinesoft/homebrew-bartycrouch failed!
Hello,
I tried my project with the new xcode 9 GM today, the BartyCrouch script never stops.
So I tried launching command :
bartycrouch interfaces -p [My Project Path] -v
The script is working for some files and then stops for one.
I tried launching with the source file and found that the problem comes from the file : Commander.swift
, the line let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
never stops.
I reproduced the same issue with a second project.
My XCode version is : 9.0 (9A235).
Currently paths to the Storyboard or XIB files need to be specified explicitly. This is bad in terms of adding the script once and not thinking about it any more when new Interface Builder files are added over time. Currently the script would need to be updated each time a new files was created.
When there is no input file specified BartyCrouch could assume that all localized Storyboard and XIB files are meant and find them recursively in the current directory. The recommended build script would then also become much shorter.
I have 11 languages in my project and I added the bartycrouch to my build phases and get the following error when building:
BartyCrouch: Successfully updated strings file(s) of Storyboard or XIB file.
2016-06-21 15:04:01.669 genstrings[26695:5181041] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString characterAtIndex:]: Range or index out of bounds'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff93f904f2 __exceptionPreprocess + 178
1 libobjc.A.dylib 0x00007fff8f111f7e objc_exception_throw + 48
2 CoreFoundation 0x00007fff93ff74bd +[NSException raise:format:] + 205
3 CoreFoundation 0x00007fff93f05cf6 -[__NSCFString characterAtIndex:] + 102
4 genstrings 0x0000000104d3296b genstrings + 10603
5 genstrings 0x0000000104d318d1 genstrings + 6353
6 genstrings 0x0000000104d3150c genstrings + 5388
7 libdyld.dylib 0x00007fff882125ad start + 1
8 ??? 0x000000000000024f 0x0 + 591
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Error! Could not extract strings from Code in directory '/Users/Arie/Developer/multilock-ios'.
Command /bin/sh failed with exit code 69
Please help
Instead of
$ brew tap flinesoft/bartycrouch
$ brew install flinesoft/bartycrouch/bartycrouch
it should look something like this:
$ brew tap flinesoft/formulae
$ brew install bartycrouch
Currently using the combination of BartyCrouch and PhraseApp results to some issues with newlines. The problem is that PhraseApp keeps no newline at the top of the file and two newlines instead at the bottom of it. BartyCrouch currently keeps each one newline at the top and bottom.
The requested feature would be a new command line option to keep the surrounding newlines (and other whitespace characters) the the top and bottom of the file. It could be called unstripped
or -u
as strip
is typically a method on Strings that removes whitespaces from the beginning and end.
BartyCrouch currently recognizes changes in Storyboards and XIBs and updates their localization strings appropriately. Adding basic support for Code files (written in Swift or ObjC) using the NSLocalizedString
macro shouldn't be too hard so an addition should be considered.
The details could be more complicated of course, so maybe an alternative to NSLocalizedString may be introduced simplifying an automated update of the strings files.
Microsoft retired it - can't create new accounts: https://datamarket.azure.com/account/applications
Hello, could you enable support for "mm" files?
When using the full automatic build style builds with unchanged IB files can take 5-10 seconds longer than without BartyCrouch even when nothing is changed with many files (say thousand translation target files) to check. This should be fixed, for example by using a build artifact file that keeps track of the last time BartyCrouch was run and skip files that didn't change since then.
Help, latest xcode keep getting this no matter what I do. Runs fine if i disable the script?
BartyCrouch: Successfully updated strings file(s) of Storyboard or XIB file.
2016-10-30 21:21:49.855 bartycrouch[32900:1074407] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't posix_spawn: error 7'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff7d0e952b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fff917c1cad objc_exception_throw + 48
2 CoreFoundation 0x00007fff7d167a0d +[NSException raise:format:] + 205
3 Foundation 0x00007fff7eafcc7e -[NSConcreteTask launchWithDictionary:] + 3134
4 bartycrouch 0x000000010f5c504b bartycrouch + 192587
5 bartycrouch 0x000000010f5ccb57 bartycrouch + 224087
6 bartycrouch 0x000000010f5c6e77 bartycrouch + 200311
7 bartycrouch 0x000000010f5c7a8d bartycrouch + 203405
8 bartycrouch 0x000000010f5ca365 bartycrouch + 213861
9 bartycrouch 0x000000010f5ae54c bartycrouch + 99660
10 bartycrouch 0x000000010f597ef9 bartycrouch + 7929
11 libdyld.dylib 0x00007fff9209f255 start + 1
12 ??? 0x0000000000000007 0x0 + 7
)
libc++abi.dylib: terminating with uncaught exception of type NSException
I'd like to use #bc-ignore!
in Interface Builder. For mostly personal preference, I'd rather put it in the comment section, rather then the actual value of a label.
This works, and looking at StringsFileUpdater.swift, it doesn't seem to make a difference between keys and comments when looking for the special ignore strings.
I just want to confirm this is expected behavior. I don't want to depend on anything undocumented that might break in the future.
Thanks for all the work on this library, it is exactly what we needed.
Looking for a video tutorial. Anybody wanna take a shot at this? I'm confused on how to set bartycrouch up with Xcode 8.3 with the default preexisting localized procedures.
Installing bartycrouch isn't the problem. Its integrating bartycrouch with current existing Xcode project with a prior Localized strings.
Also I've also been arriving at a Sementation fault: 11 but it doesn't show where the fault is coming from when I run the following command.
bartycrouch code -p "localization1" -l "localization1/" -a
Also, does BartyCrouch allow or enable user to switch between languages of the user choosing without through device settings?
Thanks!
Given that I have fully translated app with code
String files
And I have String let sample = NSLocalizedString("category.sample", comment: "Sample")
When I change a comment for sample
String to comment: "New Sample"
Then comment is not updated in Strings file.
Are you going to implement that feature in future?
Btw. super useful tool! Thanks
Hi, thanks for releasing this tool, it's very helpful.
At present, when running the code
command, BartyCrouch adds blank strings to the target locale files, which results in blank strings in the app until translations are provided. It would be nice if it provided a --default-to-base
options (like the interface
command provides), that copies the base language string to the target files instead, so the UI at lease has some text. Is there a specific reason why this option is only available for interface
?
Many thanks.
I have multiple string files in my project and I use them using
NSLocalizedString("Please add description.", tableName: "SellForm", bundle: NSBundle.mainBundle(), value: "", comment: "")
but BC doesn't seem to recognize my SellForm.strings file
Hi,
i cannot make "code" command work.
I tried both from build script and from terminal.
Code from build script gives me no error but code is not working (while interface works properly):
if which bartycrouch > /dev/null; then
bartycrouch interfaces -p "$PROJECT_DIR"
bartycrouch code -p "$PROJECT_DIR" -l "$PROJECT_DIR" -a
else
echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi
and from terminal I open a new terminal inside the folder containing my code files and my *.lproj folders and write:
bartycrouch code -p "/" -l "/" -a
here terminal writes
Error! No
Localizable.strings
file found for output.
The only way to make "code" working is open a new terminal inside one of my *lproj folder and then bartycrouch code -p "../" -l "../" -a
Thank's for Your help
Currently when the machine translation feature is used each Storyboard or Strings file needs to be listed explicitly even when the goal is to list all existing Storyboards, XIBs and Strings files. For that case there should be an automatic finding algorithm with only a source language specified.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.