Skip to content

Commit 8ed5009

Browse files
authored
Merge pull request #51 from icerockdev/develop
Release 0.9.0
2 parents dbbdb13 + d6250f1 commit 8ed5009

29 files changed

Lines changed: 396 additions & 86 deletions

File tree

.github/workflows/compilation-check.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ jobs:
1515
uses: actions/setup-java@v1
1616
with:
1717
java-version: 1.8
18-
- name: Build and publish local
19-
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToMavenLocal :resources:publishToMavenLocal
18+
- name: Check plugin build
19+
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToMavenLocal
20+
- name: Check library build
21+
run: ./gradlew -PlibraryPublish :resources:publishToMavenLocal

.github/workflows/publish.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ jobs:
1414
uses: actions/setup-java@v1
1515
with:
1616
java-version: 1.8
17-
- name: Build and publish to Bintray
18-
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToBintrayRepository :resources:publishAllPublicationsToBintrayRepository -DBINTRAY_USER=${{ secrets.BINTRAY_USER }} -DBINTRAY_KEY=${{ secrets.BINTRAY_KEY }}
17+
- name: Publish plugin
18+
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToBintrayRepository -DBINTRAY_USER=${{ secrets.BINTRAY_USER }} -DBINTRAY_KEY=${{ secrets.BINTRAY_KEY }}
19+
- name: Publish library
20+
run: ./gradlew -PlibraryPublish :resources:publishAllPublicationsToBintrayRepository -DBINTRAY_USER=${{ secrets.BINTRAY_USER }} -DBINTRAY_KEY=${{ secrets.BINTRAY_KEY }}

.github/workflows/ui-tests-android-sample.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ jobs:
1212
steps:
1313
- name: Checkout
1414
uses: actions/checkout@v2
15-
- name: Build and publish local
16-
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToMavenLocal :resources:publishToMavenLocal
17-
- name: Sample unit-tests
15+
- name: Build plugin
16+
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToMavenLocal
17+
- name: Build library
18+
run: ./gradlew -PlibraryPublish :resources:publishToMavenLocal
19+
- name: Run android tests
1820
uses: reactivecircus/android-emulator-runner@v2
1921
with:
2022
api-level: 29

README.md

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
![moko-resources](img/logo.png)
2-
[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://api.bintray.com/packages/icerockdev/moko/moko-resources/images/download.svg) ](https://bintray.com/icerockdev/moko/moko-resources/_latestVersion) ![kotlin-version](https://img.shields.io/badge/kotlin-1.3.61-orange)
2+
[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://api.bintray.com/packages/icerockdev/moko/moko-resources/images/download.svg) ](https://bintray.com/icerockdev/moko/moko-resources/_latestVersion) ![kotlin-version](https://img.shields.io/badge/kotlin-1.3.70-orange)
33

44
# Mobile Kotlin resources
55
This is a Kotlin MultiPlatform library that provides access to the resources on iOS & Android with the support of the default system localization.
@@ -38,6 +38,8 @@ This is a Kotlin MultiPlatform library that provides access to the resources on
3838
- 0.6.2
3939
- 0.7.0
4040
- 0.8.0
41+
- kotlin 1.3.70
42+
- 0.9.0
4143

4244
## Installation
4345
root build.gradle
@@ -48,7 +50,7 @@ buildscript {
4850
}
4951
5052
dependencies {
51-
classpath "dev.icerock.moko:resources-generator:0.8.0"
53+
classpath "dev.icerock.moko:resources-generator:0.9.0"
5254
}
5355
}
5456
@@ -65,11 +67,13 @@ project build.gradle
6567
apply plugin: "dev.icerock.mobile.multiplatform-resources"
6668
6769
dependencies {
68-
commonMainApi("dev.icerock.moko:resources:0.8.0")
70+
commonMainApi("dev.icerock.moko:resources:0.9.0")
6971
}
7072
7173
multiplatformResources {
7274
multiplatformResourcesPackage = "org.example.library"
75+
iosBaseLocalizationRegion = "en" //optional, default "en"
76+
multiplatformResourcesSourceSet = "commonClientMain" // optional, default "commonMain"
7377
}
7478
```
7579

@@ -234,7 +238,17 @@ let string1 = getUserName(user: user).localized() // we got name from User model
234238
let string2 = getUserName(user: null).localized() // we got name_placeholder from resources
235239
```
236240

237-
### Example 6 - pass image
241+
### Example 6 - Select localization in runtime
242+
You can force `StringDesc` to use preferred localization in common code:
243+
```kotlin
244+
StringDesc.localeType = StringDesc.LocaleType.Custom("es")
245+
```
246+
and return to system behaviour (when localization depends on device settings):
247+
```kotlin
248+
StringDesc.localeType = StringDesc.LocaleType.System()
249+
```
250+
251+
### Example 7 - pass image
238252
Image resources directory is `commonMain/resources/MR/images` with support of nested directories.
239253
Image name should be end with one of:
240254
- `@0.75x` - android ldpi;
@@ -253,7 +267,7 @@ We got autogenerated `MR.images.home_black_18` `ImageResource` in code, that we
253267
- Android: `imageView.setImageResource(image.drawableResId)`
254268
- iOS: `imageView.image = image.toUIImage()`
255269

256-
### Example 7 - pass font
270+
### Example 8 - pass font
257271
Fonts resources directory is `commonMain/resources/MR/fonts`.
258272
Font name should be this pattern: `<fontFamily>-<fontStyle>` like:
259273
- `Raleway-Bold.ttf`

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ allprojects {
1919
}
2020

2121
tasks.register("clean", Delete::class).configure {
22+
group = "build"
2223
delete(rootProject.buildDir)
2324
}

buildSrc/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ repositories {
1212
}
1313

1414
dependencies {
15-
implementation("dev.icerock:mobile-multiplatform:0.4.0")
16-
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.60")
17-
implementation("com.android.tools.build:gradle:3.5.2")
15+
implementation("dev.icerock:mobile-multiplatform:0.6.0")
16+
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.70")
17+
implementation("com.android.tools.build:gradle:3.6.1")
1818
}
1919

2020
kotlinDslPluginOptions {

buildSrc/src/main/kotlin/Versions.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ object Versions {
99
const val minSdk = 16
1010
}
1111

12-
const val kotlin = "1.3.61"
12+
const val kotlin = "1.3.70"
1313

14-
private const val mokoResources = "0.8.0"
14+
private const val mokoResources = "0.9.0"
1515

1616
object Plugins {
17-
const val android = "3.5.2"
17+
const val android = "3.6.1"
1818

1919
const val kotlin = Versions.kotlin
2020
const val mokoResources = Versions.mokoResources

gradle-plugin/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
2828
val mrExtension =
2929
target.extensions.create<MultiplatformResourcesPluginExtension>("multiplatformResources")
3030

31-
mrExtension.onChange = {
31+
target.afterEvaluate {
3232
configureGenerators(
3333
target = target,
3434
mrExtension = mrExtension
@@ -45,8 +45,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
4545
target.extensions.getByType(KotlinMultiplatformExtension::class)
4646

4747
val sourceSets = multiplatformExtension.sourceSets
48-
val commonSourceSet =
49-
sourceSets.getByName(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
48+
val commonSourceSet = sourceSets.getByName(mrExtension.sourceSetName)
5049
val commonResources = commonSourceSet.resources
5150

5251
val androidExtension = target.extensions.getByType(LibraryExtension::class)
@@ -96,13 +95,14 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
9695
androidPackage
9796
)
9897
val features = listOf(
99-
StringsGeneratorFeature(sourceInfo),
100-
PluralsGeneratorFeature(sourceInfo),
98+
StringsGeneratorFeature(sourceInfo, extension.iosBaseLocalizationRegion),
99+
PluralsGeneratorFeature(sourceInfo, extension.iosBaseLocalizationRegion),
101100
ImagesGeneratorFeature(sourceInfo),
102101
FontsGeneratorFeature(sourceInfo)
103102
)
104103
val generator = createGenerator(
105104
multiplatformExtension = multiplatformExtension,
105+
extension = extension,
106106
info = sourceInfo,
107107
features = features
108108
) ?: return@forEach
@@ -113,16 +113,19 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
113113

114114
private fun createGenerator(
115115
multiplatformExtension: KotlinMultiplatformExtension,
116+
extension: MultiplatformResourcesPluginExtension,
116117
info: SourceInfo,
117118
features: List<ResourceGeneratorFeature>
118119
): MRGenerator? {
119-
if (info.sourceSet.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) {
120+
if (info.sourceSet.name == extension.sourceSetName) {
120121
return CommonMRGenerator(
121122
info.generatedDir,
122123
info.sourceSet,
123124
info.mrClassPackage,
124125
generators = features.map { it.createCommonGenerator() }
125126
)
127+
} else if (info.sourceSet.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) {
128+
return null
126129
}
127130

128131
val target = multiplatformExtension.targets.firstOrNull { target ->

gradle-plugin/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPluginExtension.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44

55
package dev.icerock.gradle
66

7+
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
8+
79
open class MultiplatformResourcesPluginExtension {
810
var multiplatformResourcesPackage: String? = null
9-
set(value) {
10-
field = value
11-
onChange?.invoke()
12-
}
13-
14-
internal var onChange: (() -> Unit)? = null
11+
var multiplatformResourcesSourceSet: String? = null
12+
var iosBaseLocalizationRegion: String = "en"
13+
val sourceSetName: String get() = multiplatformResourcesSourceSet ?: KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME
1514
}

gradle-plugin/src/main/kotlin/dev/icerock/gradle/generator/plurals/IosPluralsGenerator.kt

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import java.io.File
1414

1515
class IosPluralsGenerator(
1616
sourceSet: KotlinSourceSet,
17-
pluralsFileTree: FileTree
17+
pluralsFileTree: FileTree,
18+
private val baseLocalizationRegion: String
1819
) : PluralsGenerator(
1920
sourceSet = sourceSet,
2021
pluralsFileTree = pluralsFileTree
@@ -30,20 +31,7 @@ class IosPluralsGenerator(
3031
)
3132
}
3233

33-
override fun generateResources(
34-
resourcesGenerationDir: File,
35-
language: String?,
36-
strings: Map<KeyType, PluralMap>
37-
) {
38-
val resDirName = when (language) {
39-
null -> "Base.lproj"
40-
else -> "$language.lproj"
41-
}
42-
43-
val resDir = File(resourcesGenerationDir, resDirName)
44-
val localizableFile = File(resDir, "Localizable.stringsdict")
45-
resDir.mkdirs()
46-
34+
private fun writeStringsFile(file: File, strings: Map<KeyType, PluralMap>) {
4735
val head = """<?xml version="1.0" encoding="UTF-8"?>
4836
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4937
<plist version="1.0">
@@ -79,8 +67,31 @@ class IosPluralsGenerator(
7967
</dict>
8068
</plist>"""
8169

82-
localizableFile.writeText(head)
83-
localizableFile.appendText(content)
84-
localizableFile.appendText(footer)
70+
file.writeText(head)
71+
file.appendText(content)
72+
file.appendText(footer)
73+
}
74+
75+
override fun generateResources(
76+
resourcesGenerationDir: File,
77+
language: String?,
78+
strings: Map<KeyType, PluralMap>
79+
) {
80+
val resDirName = when (language) {
81+
null -> "Base.lproj"
82+
else -> "$language.lproj"
83+
}
84+
85+
val resDir = File(resourcesGenerationDir, resDirName)
86+
val localizableFile = File(resDir, "Localizable.stringsdict")
87+
resDir.mkdirs()
88+
writeStringsFile(localizableFile, strings)
89+
90+
if (language == null) {
91+
val regionDir = File(resourcesGenerationDir, "$baseLocalizationRegion.lproj")
92+
regionDir.mkdirs()
93+
val regionFile = File(regionDir, "Localizable.stringsdict")
94+
writeStringsFile(regionFile, strings)
95+
}
8596
}
8697
}

0 commit comments

Comments
 (0)