Issue #945

The default SwiftGen generate generated strings L10n file like this

extension L10n {
  private static func tr(_ table: String, _ key: String, _ args: CVarArg..., fallback value: String) -> String {
    let format = BundleToken.bundle.localizedString(forKey: key, value: value, table: table)
    return String(format: format, locale: Locale.current, arguments: args)
  }
}

// swiftlint:disable convenience_type
private final class BundleToken {
  static let bundle: Bundle = {
    #if SWIFT_PACKAGE
    return Bundle.module
    #else
    return Bundle(for: BundleToken.self)
    #endif
  }()
}

It use the system-wide settings locale. In case we want to force a specific locale, we can write a custom method that find our selected language lproj bundle

When compiled, the localizable files will be under Resources folder, for example

MyApp.app/Contents/Resources/nb.lproj
extension L10n {
    private class BundleToken {}

    private static var bundle: Bundle {
        let language = Settings.language
        switch language {
        case .system:
            return Bundle(for: BundleToken.self)
            
        default:
            let path = Bundle.main.path(forResource: language.rawValue, ofType: "lproj")
            return Bundle(path: path ?? "") ?? .main
        }
    }

    static func tr(_ table: String, _ key: String, _ args: CVarArg..., fallback value: String) -> String {
        let format = bundle.localizedString(forKey: key, value: value, table: table)
        return String(format: format, locale: Locale.current, arguments: args)
    }
}