danger-localizationlinter 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +167 -0
  6. data/Guardfile +21 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +62 -0
  9. data/Rakefile +25 -0
  10. data/danger-localizationlinter.gemspec +60 -0
  11. data/ext/localizationlinter/helper/validate_wording_cli.rb +21 -0
  12. data/ext/localizationlinter/localizationlinter.rb +331 -0
  13. data/ext/localizationlinter/swiftgen_localizables_check.stencil +36 -0
  14. data/lib/danger_localizationlinter.rb +3 -0
  15. data/lib/danger_plugin.rb +3 -0
  16. data/lib/localizationlinter/gem_version.rb +5 -0
  17. data/lib/localizationlinter/plugin.rb +96 -0
  18. data/spec/Test/Podfile +6 -0
  19. data/spec/Test/Podfile.lock +16 -0
  20. data/spec/Test/Pods/SwiftGen/CHANGELOG.md +1357 -0
  21. data/spec/Test/Pods/SwiftGen/LICENCE +21 -0
  22. data/spec/Test/Pods/SwiftGen/README.md +892 -0
  23. data/spec/Test/Pods/SwiftGen/bin/swiftgen +0 -0
  24. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Commander +0 -0
  25. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Resources/Info.plist +48 -0
  26. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Versions/A/Commander +0 -0
  27. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Versions/A/Resources/Info.plist +48 -0
  28. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  29. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Versions/Current/Commander +0 -0
  30. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Versions/Current/Resources/Info.plist +48 -0
  31. data/spec/Test/Pods/SwiftGen/lib/Commander.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  32. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Kanna +0 -0
  33. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Resources/Info.plist +48 -0
  34. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Versions/A/Kanna +0 -0
  35. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Versions/A/Resources/Info.plist +48 -0
  36. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  37. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Versions/Current/Kanna +0 -0
  38. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Versions/Current/Resources/Info.plist +48 -0
  39. data/spec/Test/Pods/SwiftGen/lib/Kanna.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  40. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/PathKit +0 -0
  41. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Resources/Info.plist +48 -0
  42. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Versions/A/PathKit +0 -0
  43. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Versions/A/Resources/Info.plist +48 -0
  44. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  45. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Versions/Current/PathKit +0 -0
  46. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Versions/Current/Resources/Info.plist +48 -0
  47. data/spec/Test/Pods/SwiftGen/lib/PathKit.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  48. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Resources/Info.plist +48 -0
  49. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Stencil +0 -0
  50. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Versions/A/Resources/Info.plist +48 -0
  51. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Versions/A/Stencil +0 -0
  52. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  53. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Versions/Current/Resources/Info.plist +48 -0
  54. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Versions/Current/Stencil +0 -0
  55. data/spec/Test/Pods/SwiftGen/lib/Stencil.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  56. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Resources/Info.plist +48 -0
  57. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/StencilSwiftKit +0 -0
  58. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Versions/A/Resources/Info.plist +48 -0
  59. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Versions/A/StencilSwiftKit +0 -0
  60. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  61. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Versions/Current/Resources/Info.plist +48 -0
  62. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Versions/Current/StencilSwiftKit +0 -0
  63. data/spec/Test/Pods/SwiftGen/lib/StencilSwiftKit.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  64. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Resources/Info.plist +48 -0
  65. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/SwiftGenKit +0 -0
  66. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Versions/A/Resources/Info.plist +48 -0
  67. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Versions/A/SwiftGenKit +0 -0
  68. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  69. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Versions/Current/Resources/Info.plist +48 -0
  70. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Versions/Current/SwiftGenKit +0 -0
  71. data/spec/Test/Pods/SwiftGen/lib/SwiftGenKit.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  72. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Resources/Info.plist +48 -0
  73. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Versions/A/Resources/Info.plist +48 -0
  74. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Versions/A/Yams +0 -0
  75. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Versions/A/_CodeSignature/CodeResources +132 -0
  76. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Versions/Current/Resources/Info.plist +48 -0
  77. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Versions/Current/Yams +0 -0
  78. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Versions/Current/_CodeSignature/CodeResources +132 -0
  79. data/spec/Test/Pods/SwiftGen/lib/Yams.framework/Yams +0 -0
  80. data/spec/Test/Pods/SwiftGen/templates/colors/literals-swift4.stencil +43 -0
  81. data/spec/Test/Pods/SwiftGen/templates/colors/literals-swift5.stencil +43 -0
  82. data/spec/Test/Pods/SwiftGen/templates/colors/swift4.stencil +84 -0
  83. data/spec/Test/Pods/SwiftGen/templates/colors/swift5.stencil +84 -0
  84. data/spec/Test/Pods/SwiftGen/templates/coredata/swift4.stencil +211 -0
  85. data/spec/Test/Pods/SwiftGen/templates/coredata/swift5.stencil +211 -0
  86. data/spec/Test/Pods/SwiftGen/templates/fonts/swift4.stencil +110 -0
  87. data/spec/Test/Pods/SwiftGen/templates/fonts/swift5.stencil +113 -0
  88. data/spec/Test/Pods/SwiftGen/templates/ib/scenes-swift4.stencil +157 -0
  89. data/spec/Test/Pods/SwiftGen/templates/ib/scenes-swift5.stencil +159 -0
  90. data/spec/Test/Pods/SwiftGen/templates/ib/segues-swift4.stencil +60 -0
  91. data/spec/Test/Pods/SwiftGen/templates/ib/segues-swift5.stencil +60 -0
  92. data/spec/Test/Pods/SwiftGen/templates/json/inline-swift4.stencil +82 -0
  93. data/spec/Test/Pods/SwiftGen/templates/json/inline-swift5.stencil +82 -0
  94. data/spec/Test/Pods/SwiftGen/templates/json/runtime-swift4.stencil +112 -0
  95. data/spec/Test/Pods/SwiftGen/templates/json/runtime-swift5.stencil +112 -0
  96. data/spec/Test/Pods/SwiftGen/templates/plist/inline-swift4.stencil +82 -0
  97. data/spec/Test/Pods/SwiftGen/templates/plist/inline-swift5.stencil +82 -0
  98. data/spec/Test/Pods/SwiftGen/templates/plist/runtime-swift4.stencil +117 -0
  99. data/spec/Test/Pods/SwiftGen/templates/plist/runtime-swift5.stencil +117 -0
  100. data/spec/Test/Pods/SwiftGen/templates/strings/flat-swift4.stencil +97 -0
  101. data/spec/Test/Pods/SwiftGen/templates/strings/flat-swift5.stencil +97 -0
  102. data/spec/Test/Pods/SwiftGen/templates/strings/objc-h.stencil +66 -0
  103. data/spec/Test/Pods/SwiftGen/templates/strings/objc-m.stencil +90 -0
  104. data/spec/Test/Pods/SwiftGen/templates/strings/structured-swift4.stencil +102 -0
  105. data/spec/Test/Pods/SwiftGen/templates/strings/structured-swift5.stencil +102 -0
  106. data/spec/Test/Pods/SwiftGen/templates/xcassets/swift4.stencil +266 -0
  107. data/spec/Test/Pods/SwiftGen/templates/xcassets/swift5.stencil +274 -0
  108. data/spec/Test/Pods/SwiftGen/templates/yaml/inline-swift4.stencil +92 -0
  109. data/spec/Test/Pods/SwiftGen/templates/yaml/inline-swift5.stencil +92 -0
  110. data/spec/Test/Test.xcodeproj/project.pbxproj +406 -0
  111. data/spec/Test/Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  112. data/spec/Test/Test.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  113. data/spec/Test/Test.xcworkspace/contents.xcworkspacedata +10 -0
  114. data/spec/Test/Test.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  115. data/spec/Test/Test/AppDelegate.swift +36 -0
  116. data/spec/Test/Test/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  117. data/spec/Test/Test/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  118. data/spec/Test/Test/Assets.xcassets/Contents.json +6 -0
  119. data/spec/Test/Test/ContentView.swift +21 -0
  120. data/spec/Test/Test/Info.plist +62 -0
  121. data/spec/Test/Test/SceneDelegate.swift +63 -0
  122. data/spec/Test/Test/all_target_main_language.yml +1 -0
  123. data/spec/Test/Test/en.lproj/LaunchScreen.storyboard +25 -0
  124. data/spec/Test/Test/en.lproj/localizable.strings +3 -0
  125. data/spec/Test/Test/fr.lproj/LaunchScreen.storyboard +25 -0
  126. data/spec/Test/Test/fr.lproj/localizable.strings +3 -0
  127. data/spec/localizationofficer_spec.rb +116 -0
  128. data/spec/spec_helper.rb +67 -0
  129. data/spec/support/fixtures/all_target_main_language.yml +1 -0
  130. data/spec/support/fixtures/resources/TEST/en.lproj/Localizable.strings +8 -0
  131. data/spec/support/fixtures/resources/TEST/en.lproj/Localizable.stringsdict +30 -0
  132. data/spec/support/fixtures/resources/TEST_KO/en.lproj/Localizable.strings +11 -0
  133. data/spec/support/fixtures/resources/TEST_KO/en.lproj/Localizable.stringsdict +30 -0
  134. data/spec/support/fixtures/resources/TEST_KO/fr.lproj/Localizable.strings +11 -0
  135. data/spec/support/fixtures/resources/TEST_KO/fr.lproj/Localizable.stringsdict +30 -0
  136. metadata +491 -0
@@ -0,0 +1,97 @@
1
+ // swiftlint:disable all
2
+ // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
3
+
4
+ {% if tables.count > 0 %}
5
+ {% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
6
+ import Foundation
7
+
8
+ // swiftlint:disable superfluous_disable_command file_length implicit_return
9
+
10
+ // MARK: - Strings
11
+
12
+ {% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
13
+ {% for type in types %}
14
+ {% if type == "String" %}
15
+ _ p{{forloop.counter}}: Any
16
+ {% else %}
17
+ _ p{{forloop.counter}}: {{type}}
18
+ {% endif %}
19
+ {{ ", " if not forloop.last }}
20
+ {% endfor %}
21
+ {% endfilter %}{% endmacro %}
22
+ {% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
23
+ {% for type in types %}
24
+ {% if type == "String" %}
25
+ String(describing: p{{forloop.counter}})
26
+ {% elif type == "UnsafeRawPointer" %}
27
+ Int(bitPattern: p{{forloop.counter}})
28
+ {% else %}
29
+ p{{forloop.counter}}
30
+ {% endif %}
31
+ {{ ", " if not forloop.last }}
32
+ {% endfor %}
33
+ {% endfilter %}{% endmacro %}
34
+ {% macro recursiveBlock table item %}
35
+ {% for string in item.strings %}
36
+ {% if not param.noComments %}
37
+ /// {{string.translation}}
38
+ {% endif %}
39
+ {% if string.types %}
40
+ {{accessModifier}} static func {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
41
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
42
+ }
43
+ {% elif param.lookupFunction %}
44
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
45
+ {{accessModifier}} static var {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
46
+ {% else %}
47
+ {{accessModifier}} static let {{string.key|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
48
+ {% endif %}
49
+ {% endfor %}
50
+ {% for child in item.children %}
51
+ {% call recursiveBlock table child %}
52
+ {% endfor %}
53
+ {% endmacro %}
54
+ // swiftlint:disable function_parameter_count identifier_name line_length type_body_length
55
+ {% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
56
+ {{accessModifier}} enum {{enumName}} {
57
+ {% if tables.count > 1 or param.forceFileNameEnum %}
58
+ {% for table in tables %}
59
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
60
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
61
+ }
62
+ {% endfor %}
63
+ {% else %}
64
+ {% call recursiveBlock tables.first.name tables.first.levels %}
65
+ {% endif %}
66
+ }
67
+ // swiftlint:enable function_parameter_count identifier_name line_length type_body_length
68
+
69
+ // MARK: - Implementation Details
70
+
71
+ extension {{enumName}} {
72
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
73
+ {% if param.lookupFunction %}
74
+ let format = {{ param.lookupFunction }}(key, table)
75
+ {% else %}
76
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
77
+ {% endif %}
78
+ return String(format: format, locale: Locale.current, arguments: args)
79
+ }
80
+ }
81
+ {% if not param.bundle and not param.lookupFunction %}
82
+
83
+ // swiftlint:disable convenience_type
84
+ private final class BundleToken {
85
+ static let bundle: Bundle = {
86
+ #if SWIFT_PACKAGE
87
+ return Bundle.module
88
+ #else
89
+ return Bundle(for: BundleToken.self)
90
+ #endif
91
+ }()
92
+ }
93
+ // swiftlint:enable convenience_type
94
+ {% endif %}
95
+ {% else %}
96
+ // No string found
97
+ {% endif %}
@@ -0,0 +1,66 @@
1
+ // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
2
+
3
+ {% if tables.count > 0 %}
4
+ #import <Foundation/Foundation.h>
5
+
6
+ NS_ASSUME_NONNULL_BEGIN
7
+
8
+ {% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
9
+ {% for type in types %}
10
+ ({% call paramTranslate type %})p{{ forloop.counter }}{{ " :" if not forloop.last }}
11
+ {% endfor %}
12
+ {% endfilter %}{% endmacro %}
13
+ {% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
14
+ {% for type in types %}
15
+ p{{forloop.counter}}{{ ", " if not forloop.last }}
16
+ {% endfor %}
17
+ {% endfilter %}{% endmacro %}
18
+ {% macro paramTranslate swiftType %}
19
+ {% if swiftType == "Any" %}
20
+ id
21
+ {% elif swiftType == "CChar" %}
22
+ char
23
+ {% elif swiftType == "Float" %}
24
+ float
25
+ {% elif swiftType == "Int" %}
26
+ NSInteger
27
+ {% elif swiftType == "String" %}
28
+ id
29
+ {% elif swiftType == "UnsafePointer<CChar>" %}
30
+ char*
31
+ {% elif swiftType == "UnsafeRawPointer" %}
32
+ void*
33
+ {% else %}
34
+ objc-h.stencil is missing '{{swiftType}}'
35
+ {% endif %}
36
+ {% endmacro %}
37
+ {% macro emitOneMethod table item %}
38
+ {% for string in item.strings %}
39
+ {% if not param.noComments %}
40
+ // {{string.key}} --> "{{string.translation}}"
41
+ {% endif %}
42
+ {% if string.types %}
43
+ {% if string.types.count == 1 %}
44
+ + (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValue:{% call parametersBlock string.types %};
45
+ {% else %}
46
+ + (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValues:{% call parametersBlock string.types %};
47
+ {% endif %}
48
+ {% else %}
49
+ + (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}};
50
+ {% endif %}
51
+ {% endfor %}
52
+ {% for child in item.children %}
53
+ {% call emitOneMethod table child %}
54
+ {% endfor %}
55
+ {% endmacro %}
56
+ {% for table in tables %}
57
+ @interface {{ table.name }} : NSObject
58
+ {% call emitOneMethod table.name table.levels %}
59
+ @end
60
+
61
+ {% endfor %}
62
+
63
+ NS_ASSUME_NONNULL_END
64
+ {% else %}
65
+ // No strings found
66
+ {% endif %}
@@ -0,0 +1,90 @@
1
+ // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
2
+
3
+ {% if tables.count > 0 %}
4
+ #import "{{ param.headerName|default:"Localizable.h" }}"
5
+ {% if not param.bundle %}
6
+
7
+ @interface BundleToken : NSObject
8
+ @end
9
+
10
+ @implementation BundleToken
11
+ @end
12
+ {% endif %}
13
+
14
+ #pragma clang diagnostic push
15
+ #pragma clang diagnostic ignored "-Wformat-security"
16
+
17
+ static NSString* tr(NSString *tableName, NSString *key, ...) {
18
+ NSBundle *bundle = {{param.bundle|default:"[NSBundle bundleForClass:BundleToken.class]"}};
19
+ NSString *format = [bundle localizedStringForKey:key value:nil table:tableName];
20
+ NSLocale *locale = [NSLocale currentLocale];
21
+
22
+ va_list args;
23
+ va_start(args, key);
24
+ NSString *result = [[NSString alloc] initWithFormat:format locale:locale arguments:args];
25
+ va_end(args);
26
+
27
+ return result;
28
+ };
29
+ #pragma clang diagnostic pop
30
+
31
+ {% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
32
+ {% for type in types %}
33
+ ({% call paramTranslate type %})p{{ forloop.counter }}{{ " :" if not forloop.last }}
34
+ {% endfor %}
35
+ {% endfilter %}{% endmacro %}
36
+ {% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
37
+ {% for type in types %}
38
+ p{{forloop.counter}}{{ ", " if not forloop.last }}
39
+ {% endfor %}
40
+ {% endfilter %}{% endmacro %}
41
+ {% macro paramTranslate swiftType %}
42
+ {% if swiftType == "Any" %}
43
+ id
44
+ {% elif swiftType == "CChar" %}
45
+ char
46
+ {% elif swiftType == "Float" %}
47
+ float
48
+ {% elif swiftType == "Int" %}
49
+ NSInteger
50
+ {% elif swiftType == "String" %}
51
+ id
52
+ {% elif swiftType == "UnsafePointer<CChar>" %}
53
+ char*
54
+ {% elif swiftType == "UnsafeRawPointer" %}
55
+ void*
56
+ {% else %}
57
+ objc-m.stencil is missing '{{swiftType}}'
58
+ {% endif %}
59
+ {% endmacro %}
60
+ {% macro tableContents table item %}
61
+ {% for string in item.strings %}
62
+ {% if string.types %}
63
+ {% if string.types.count == 1 %}
64
+ + (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValue:{% call parametersBlock string.types %}
65
+ {% else %}
66
+ + (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}}WithValues:{% call parametersBlock string.types %}
67
+ {% endif %}
68
+ {
69
+ return tr(@"{{table}}", @"{{string.key}}", {% call argumentsBlock string.types %});
70
+ }
71
+ {% else %}
72
+ + (NSString*){{string.key|swiftIdentifier:"pretty"|lowerFirstWord}} {
73
+ return tr(@"{{table}}", @"{{string.key}}");
74
+ }
75
+ {% endif %}
76
+ {% endfor %}
77
+ {% for child in item.children %}
78
+ {% call tableContents table child %}
79
+ {% endfor %}
80
+ {% endmacro %}
81
+ {% for table in tables %}
82
+ {% set tableName %}{{table.name|default:"Localized"}}{% endset %}
83
+ @implementation {{ tableName }} : NSObject
84
+ {% call tableContents table.name table.levels %}
85
+ @end
86
+
87
+ {% endfor %}
88
+ {% else %}
89
+ // No strings found
90
+ {% endif %}
@@ -0,0 +1,102 @@
1
+ // swiftlint:disable all
2
+ // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
3
+
4
+ {% if tables.count > 0 %}
5
+ {% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
6
+ import Foundation
7
+
8
+ // swiftlint:disable superfluous_disable_command file_length implicit_return
9
+
10
+ // MARK: - Strings
11
+
12
+ {% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
13
+ {% for type in types %}
14
+ {% if type == "String" %}
15
+ _ p{{forloop.counter}}: Any
16
+ {% else %}
17
+ _ p{{forloop.counter}}: {{type}}
18
+ {% endif %}
19
+ {{ ", " if not forloop.last }}
20
+ {% endfor %}
21
+ {% endfilter %}{% endmacro %}
22
+ {% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
23
+ {% for type in types %}
24
+ {% if type == "String" %}
25
+ String(describing: p{{forloop.counter}})
26
+ {% elif type == "UnsafeRawPointer" %}
27
+ Int(bitPattern: p{{forloop.counter}})
28
+ {% else %}
29
+ p{{forloop.counter}}
30
+ {% endif %}
31
+ {{ ", " if not forloop.last }}
32
+ {% endfor %}
33
+ {% endfilter %}{% endmacro %}
34
+ {% macro recursiveBlock table item %}
35
+ {% for string in item.strings %}
36
+ {% if not param.noComments %}
37
+ /// {{string.translation}}
38
+ {% endif %}
39
+ {% if string.types %}
40
+ {{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
41
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
42
+ }
43
+ {% elif param.lookupFunction %}
44
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
45
+ {{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
46
+ {% else %}
47
+ {{accessModifier}} static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
48
+ {% endif %}
49
+ {% endfor %}
50
+ {% for child in item.children %}
51
+
52
+ {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
53
+ {% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
54
+ }
55
+ {% endfor %}
56
+ {% endmacro %}
57
+ // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
58
+ // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
59
+ {% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
60
+ {{accessModifier}} enum {{enumName}} {
61
+ {% if tables.count > 1 or param.forceFileNameEnum %}
62
+ {% for table in tables %}
63
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
64
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
65
+ }
66
+ {% endfor %}
67
+ {% else %}
68
+ {% call recursiveBlock tables.first.name tables.first.levels %}
69
+ {% endif %}
70
+ }
71
+ // swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
72
+ // swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
73
+
74
+ // MARK: - Implementation Details
75
+
76
+ extension {{enumName}} {
77
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
78
+ {% if param.lookupFunction %}
79
+ let format = {{ param.lookupFunction }}(key, table)
80
+ {% else %}
81
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
82
+ {% endif %}
83
+ return String(format: format, locale: Locale.current, arguments: args)
84
+ }
85
+ }
86
+ {% if not param.bundle and not param.lookupFunction %}
87
+
88
+ // swiftlint:disable convenience_type
89
+ private final class BundleToken {
90
+ static let bundle: Bundle = {
91
+ #if SWIFT_PACKAGE
92
+ return Bundle.module
93
+ #else
94
+ return Bundle(for: BundleToken.self)
95
+ #endif
96
+ }()
97
+ }
98
+ // swiftlint:enable convenience_type
99
+ {% endif %}
100
+ {% else %}
101
+ // No string found
102
+ {% endif %}
@@ -0,0 +1,102 @@
1
+ // swiftlint:disable all
2
+ // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen
3
+
4
+ {% if tables.count > 0 %}
5
+ {% set accessModifier %}{% if param.publicAccess %}public{% else %}internal{% endif %}{% endset %}
6
+ import Foundation
7
+
8
+ // swiftlint:disable superfluous_disable_command file_length implicit_return
9
+
10
+ // MARK: - Strings
11
+
12
+ {% macro parametersBlock types %}{% filter removeNewlines:"leading" %}
13
+ {% for type in types %}
14
+ {% if type == "String" %}
15
+ _ p{{forloop.counter}}: Any
16
+ {% else %}
17
+ _ p{{forloop.counter}}: {{type}}
18
+ {% endif %}
19
+ {{ ", " if not forloop.last }}
20
+ {% endfor %}
21
+ {% endfilter %}{% endmacro %}
22
+ {% macro argumentsBlock types %}{% filter removeNewlines:"leading" %}
23
+ {% for type in types %}
24
+ {% if type == "String" %}
25
+ String(describing: p{{forloop.counter}})
26
+ {% elif type == "UnsafeRawPointer" %}
27
+ Int(bitPattern: p{{forloop.counter}})
28
+ {% else %}
29
+ p{{forloop.counter}}
30
+ {% endif %}
31
+ {{ ", " if not forloop.last }}
32
+ {% endfor %}
33
+ {% endfilter %}{% endmacro %}
34
+ {% macro recursiveBlock table item %}
35
+ {% for string in item.strings %}
36
+ {% if not param.noComments %}
37
+ /// {{string.translation}}
38
+ {% endif %}
39
+ {% if string.types %}
40
+ {{accessModifier}} static func {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}({% call parametersBlock string.types %}) -> String {
41
+ return {{enumName}}.tr("{{table}}", "{{string.key}}", {% call argumentsBlock string.types %})
42
+ }
43
+ {% elif param.lookupFunction %}
44
+ {# custom localization function is mostly used for in-app lang selection, so we want the loc to be recomputed at each call for those (hence the computed var) #}
45
+ {{accessModifier}} static var {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}}: String { return {{enumName}}.tr("{{table}}", "{{string.key}}") }
46
+ {% else %}
47
+ {{accessModifier}} static let {{string.name|swiftIdentifier:"pretty"|lowerFirstWord|escapeReservedKeywords}} = {{enumName}}.tr("{{table}}", "{{string.key}}")
48
+ {% endif %}
49
+ {% endfor %}
50
+ {% for child in item.children %}
51
+
52
+ {{accessModifier}} enum {{child.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
53
+ {% filter indent:2 %}{% call recursiveBlock table child %}{% endfilter %}
54
+ }
55
+ {% endfor %}
56
+ {% endmacro %}
57
+ // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length
58
+ // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces
59
+ {% set enumName %}{{param.enumName|default:"L10n"}}{% endset %}
60
+ {{accessModifier}} enum {{enumName}} {
61
+ {% if tables.count > 1 or param.forceFileNameEnum %}
62
+ {% for table in tables %}
63
+ {{accessModifier}} enum {{table.name|swiftIdentifier:"pretty"|escapeReservedKeywords}} {
64
+ {% filter indent:2 %}{% call recursiveBlock table.name table.levels %}{% endfilter %}
65
+ }
66
+ {% endfor %}
67
+ {% else %}
68
+ {% call recursiveBlock tables.first.name tables.first.levels %}
69
+ {% endif %}
70
+ }
71
+ // swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
72
+ // swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces
73
+
74
+ // MARK: - Implementation Details
75
+
76
+ extension {{enumName}} {
77
+ private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
78
+ {% if param.lookupFunction %}
79
+ let format = {{ param.lookupFunction }}(key, table)
80
+ {% else %}
81
+ let format = {{param.bundle|default:"BundleToken.bundle"}}.localizedString(forKey: key, value: nil, table: table)
82
+ {% endif %}
83
+ return String(format: format, locale: Locale.current, arguments: args)
84
+ }
85
+ }
86
+ {% if not param.bundle and not param.lookupFunction %}
87
+
88
+ // swiftlint:disable convenience_type
89
+ private final class BundleToken {
90
+ static let bundle: Bundle = {
91
+ #if SWIFT_PACKAGE
92
+ return Bundle.module
93
+ #else
94
+ return Bundle(for: BundleToken.self)
95
+ #endif
96
+ }()
97
+ }
98
+ // swiftlint:enable convenience_type
99
+ {% endif %}
100
+ {% else %}
101
+ // No string found
102
+ {% endif %}