A linter for Swift Localizations

73
2
Swift

"Logo"

Loco

Loco is an extremly fast CLI linter for Localization.strings and swift files.

What does it check?

  • Semicolons

  • Untranslated strings in your swift files

  • Empty values

  • Duplicate keys

  • Unused keys

  • Missing keys in one or more languages

  • Missing a translation file for a whole language

  • Works with swiftgen generated localizations.

New features:

  • Doesnt lint empty strings inside normally checked objects.
  • It doesnt check commented out strings that normally would be checked (Single line comments.)

Output format

  • Loco will output its result in a compiler error log format so it can easily be integrated in third party apps (like Xcode, Emacs, Vim)
Limitation
  • Loco builds two separate sets of data for each source file, one is for known localization pattern, such as NSLocalizedString, etc. The other one is for all the strings. Loco will then check if any of those are in a .strings file for silent warnings about unused translation keys. But it wont discover if a such key is untranslated.
  • Does not lint Localization.dict
  • Does not lint Storyboards
  • Will have false positive / true negatives
  • Needs a bit code clean up. (imperative coding mixed with tons of functional. Sorry purists)
  • Only some unit tests (more will come)

Installation

Compile the project using terminal (or Xcode)

Release
swift build -c release
Debug
swift build

Copy the loco binary from either .build/release or .build/debug to

/usr/local/bin

How to use

Integrate with Xcode

"Xcode"

In build phases. Add run script (+)

if which loco > /dev/null; then
	loco
else 
	echo "warning: Loco is not installed. Compile from https://github.com/konrad1977/loco"
fi

Make sure you run loco before compile sources to get info where you are missing a semicolon

From terminal

Just run loco from your project root.

$ loco

Arguments

Lint individual swift files (check for missing translations only)

$ loco -f "/myProject/Sources/Subfolder/somefile.swift"

Enable colored output

$ loco --color

With color
"Example2"

Without color
"Example"