From 07861fdc6fe63f3dbef25d5674e4668d96eca1b2 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 3 Mar 2020 20:59:45 +0700 Subject: [PATCH] i18n: add bundle for idea/quickfix/* --- .../messages/KotlinBundle.properties | 59 ++++++++++++++++++- .../callableBuilder/CallableBuilder.kt | 2 +- .../CreateCallableFromUsageFix.kt | 20 ++++--- .../createClass/CreateClassFromUsageFix.kt | 33 +++++++---- .../createClass/createClassUtils.kt | 2 +- .../CreateTypeParameterFromUsageFix.kt | 15 ++--- .../CreateParameterFromUsageFix.kt | 6 +- .../KotlinElementActionsFactory.kt | 34 ++++++----- .../KotlinElementActionsFactory.kt.191 | 34 +++++------ .../quickfix/expectactual/CreateActualFix.kt | 9 ++- .../expectactual/CreateExpectedFix.kt | 11 ++-- .../expectactual/ExpectActualUtils.kt | 42 +++++++------ .../migration/MigrateExternalExtensionFix.kt | 3 +- .../migration/MigrateTypeParameterListFix.kt | 3 +- .../replaceWith/DeprecatedSymbolUsageFix.kt | 5 +- .../DeprecatedSymbolUsageFixBase.kt | 7 ++- .../DeprecatedSymbolUsageInWholeProjectFix.kt | 11 +++- .../ReplaceProtectedToPublishedApiCallFix.kt | 8 ++- .../ConvertSealedSubClassToObjectFix.kt | 3 +- .../GenerateIdentityEqualsFix.kt | 3 +- 20 files changed, 205 insertions(+), 105 deletions(-) diff --git a/idea/idea-analysis/resources/messages/KotlinBundle.properties b/idea/idea-analysis/resources/messages/KotlinBundle.properties index 83e169c2256..7c368eab7e8 100644 --- a/idea/idea-analysis/resources/messages/KotlinBundle.properties +++ b/idea/idea-analysis/resources/messages/KotlinBundle.properties @@ -1016,4 +1016,61 @@ delete.with.usage.search=delete (with usage search) destination.not.found.for.package.0=Destination not found for package ''{0}'' leave.in.same.source.root=Leave in same source root test.root.is.selected.while.the.source.root.is.expected=Test root is selected while the source root is expected -source.root.is.selected.while.the.test.root.is.expected=Source root is selected while the test root is expected \ No newline at end of file +source.root.is.selected.while.the.test.root.is.expected=Source root is selected while the test root is expected +premature.end.of.template=Premature end of template +choose.target.class.or.interface=Choose target class or interface +text.abstract=abstract +text.secondary.constructor=secondary constructor +text.create=Create +text.member=member +text.extension=extension +text.object=object +text.interface=interface +text.enum.constant=enum constant +text.enum=enum +text.annotation=annotation +create.0.1=Create {0} ''{1}'' +choose.class.container=Choose class container +file.0.already.exists.but.does.not.correspond.to.kotlin.file=File {0} already exists but does not correspond to Kotlin file +create.file=Create file +create.0=Create {0} +create.package.0=Create package ''{0}'' +text.type.parameter=type {0, choice, 0#parameter|2#parameters} +create.0.in.1=Create {0} in {1} +searching.0=Searching {0}... +create.property.0.as.constructor.parameter=Create property ''{0}'' as constructor parameter +create.parameter.0=Create parameter ''{0}'' +add.property=Add property +text.add=Add ' +property.0.to.1=' property ''{0}'' to ''{1}'' +add.method=Add method +add.0.constructor.to.1=Add {0} constructor to ''{1}'' +text.secondary=secondary +text.primary=primary +add.method.0.to.1=Add method ''{0}'' to ''{1}'' +create.actual.0.for.module.1.2=Create actual {0} for module {1} ({2}) +create.expected.0.in.common.module.1=Create expected {0} in common module {1} +repair.actual.members=Repair actual members +these.declarations.cannot.be.transformed=These declarations cannot be transformed: +unknown.types=Unknown types +choose.actual.members=Choose actual members +text.annotation.class=annotation class +text.enum.class=enum class +text.class=class +type.0.1.is.not.accessible.from.target.module={0, choice, 0#Type|2#Types} {1} is not accessible from target module +the.function.declaration.shouldn.t.have.a.default.implementation=The function declaration shouldn't have a default implementation +some.types.are.not.accessible.from.0.1=Some types are not accessible from {0}:\n{1} +the.declaration.has.0.modifier=The declaration has `'{0}`' modifier +inaccessible.declaration=Inaccessible declaration +fix.with.asdynamic=Fix with 'asDynamic' +migrate.type.parameter.list.syntax=Migrate type parameter list syntax +replace.deprecated.symbol.usage=Replace deprecated symbol usage +replace.with.0=Replace with ''{0}'' +there.is.own.replacewith.on.0.that.is.used.through.this.alias.please.replace.usages.first=There is own ''ReplaceWith'' on ''{0}'' that is used through this alias. Please replace usages first. +replace.deprecated.symbol.usage.in.whole.project=Replace deprecated symbol usage in whole project +applying.0=Applying ''{0}'' +replace.usages.of.0.in.whole.project=Replace usages of ''{0}'' in whole project +replace.with.publishedapi.bridge.call=Replace with @PublishedApi bridge call +replace.with.generated.publishedapi.bridge.call.0=Replace with generated @PublishedApi bridge call ''{0}'' +convert.sealed.sub.class.to.object.fix.family.name=Convert sealed sub-class to object +generate.identity.equals.fix.family.name=Generate equals & hashCode by identity \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index be4cb950355..48eeed099bf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -277,7 +277,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { } else { val dialog = object : DialogWithEditor(project, KotlinBundle.message("fix.create.from.usage.dialog.title"), "") { override fun doOKAction() { - project.executeWriteCommand("Premature end of template") { + project.executeWriteCommand(KotlinBundle.message("premature.end.of.template")) { TemplateManagerImpl.getTemplateState(editor)?.gotoEnd(false) } super.doOKAction() diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt index c555ad8b60e..83bf3a206b4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromUsageFix.kt @@ -90,13 +90,14 @@ abstract class CreateCallableFromUsageFixBase( val renderedCallables = callableInfos.map { buildString { if (it.isAbstract) { - append("abstract ") + append(KotlinBundle.message("text.abstract")) + append(' ') } val kind = when (it.kind) { - CallableKind.FUNCTION -> "function" - CallableKind.PROPERTY -> "property" - CallableKind.CONSTRUCTOR -> "secondary constructor" + CallableKind.FUNCTION -> KotlinBundle.message("text.function") + CallableKind.PROPERTY -> KotlinBundle.message("text.property") + CallableKind.CONSTRUCTOR -> KotlinBundle.message("text.secondary.constructor") else -> throw AssertionError("Unexpected callable info: $it") } append(kind) @@ -130,13 +131,16 @@ abstract class CreateCallableFromUsageFixBase( } return StringBuilder().apply { - append("Create ") + append(KotlinBundle.message("text.create")) + append(' ') if (!callableInfos.any { it.isAbstract }) { if (isExtension) { - append("extension ") + append(KotlinBundle.message("text.extension")) + append(' ') } else if (receiverTypeInfo != TypeInfo.Empty) { - append("member ") + append(KotlinBundle.message("text.member")) + append(' ') } } @@ -200,7 +204,7 @@ abstract class CreateCallableFromUsageFixBase( return } - val popupTitle = "Choose target class or interface" + val popupTitle = KotlinBundle.message("choose.target.class.or.interface") val receiverTypeInfo = callableInfo.receiverTypeInfo val receiverTypeCandidates = callableBuilder.computeTypeCandidates(receiverTypeInfo).let { if (callableInfo.isAbstract) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt index d47e85108ea..3537e7f5325 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt @@ -14,6 +14,9 @@ import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project import com.intellij.openapi.ui.DialogWrapper import com.intellij.psi.* +import org.jetbrains.annotations.Nls +import org.jetbrains.annotations.NonNls +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefix import org.jetbrains.kotlin.idea.core.quoteIfNeeded @@ -42,13 +45,13 @@ import org.jetbrains.kotlin.utils.SmartList import java.util.* import com.intellij.codeInsight.daemon.impl.quickfix.ClassKind as IdeaClassKind -enum class ClassKind(val keyword: String, val description: String) { - PLAIN_CLASS("class", "class"), - ENUM_CLASS("enum class", "enum"), - ENUM_ENTRY("", "enum constant"), - ANNOTATION_CLASS("annotation class", "annotation"), - INTERFACE("interface", "interface"), - OBJECT("object", "object"), +enum class ClassKind(@NonNls val keyword: String, @Nls val description: String) { + PLAIN_CLASS("class", KotlinBundle.message("find.usages.class")), + ENUM_CLASS("enum class", KotlinBundle.message("text.enum")), + ENUM_ENTRY("", KotlinBundle.message("text.enum.constant")), + ANNOTATION_CLASS("annotation class", KotlinBundle.message("text.annotation")), + INTERFACE("interface", KotlinBundle.message("text.interface")), + OBJECT("object", KotlinBundle.message("text.object")), DEFAULT("", "") // Used as a placeholder and must be replaced with one of the kinds above } @@ -79,7 +82,7 @@ open class CreateClassFromUsageFix protected constructor( element: E, private val classInfo: ClassInfo ) : CreateFromUsageFixBase(element) { - override fun getText() = "Create ${classInfo.kind.description} '${classInfo.name}'" + override fun getText() = KotlinBundle.message("create.0.1", classInfo.kind.description, classInfo.name) override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean { with(classInfo) { @@ -124,7 +127,13 @@ open class CreateClassFromUsageFix protected constructor( return doInvoke(targetParent, editor, file) } - chooseContainerElementIfNecessary(applicableParents.reversed(), editor, "Choose class container", true, { it }) { + chooseContainerElementIfNecessary( + applicableParents.reversed(), + editor, + KotlinBundle.message("choose.class.container"), + true, + { it } + ) { doInvoke(it, editor, file) } } @@ -155,8 +164,8 @@ open class CreateClassFromUsageFix protected constructor( CodeInsightUtils.showErrorHint( targetDirectory.project, editor, - "File $filePath already exists but does not correspond to Kotlin file", - "Create file", + KotlinBundle.message("file.0.already.exists.but.does.not.correspond.to.kotlin.file", filePath), + KotlinBundle.message("create.file"), null ) } @@ -175,7 +184,7 @@ open class CreateClassFromUsageFix protected constructor( val defaultPackageFqName = file.packageFqName val dialog = object : CreateKotlinClassDialog( file.project, - "Create ${ideaClassKind.description.capitalize()}", + KotlinBundle.message("create.0", ideaClassKind.description.capitalize()), className, defaultPackageFqName.asString(), ideaClassKind, diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt index 312a1cab6e7..84ac2e50ee2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/createClassUtils.kt @@ -137,7 +137,7 @@ internal fun KtSimpleNameExpression.getCreatePackageFixIfApplicable(targetParent return object : DelegatingIntentionAction(javaFix) { override fun getFamilyName(): String = KotlinBundle.message("fix.create.from.usage.family") - override fun getText(): String = "Create package '$fullName'" + override fun getText(): String = KotlinBundle.message("create.package.0", fullName) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterFromUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterFromUsageFix.kt index eda6dfc470d..e57b74ab6a7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterFromUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createTypeParameter/CreateTypeParameterFromUsageFix.kt @@ -12,6 +12,7 @@ import com.intellij.psi.ElementDescriptionUtil import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.usageView.UsageViewTypeLocation import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.addTypeParameter @@ -38,11 +39,11 @@ class CreateTypeParameterFromUsageFix( private val presentTypeParameterNames: Boolean ) : CreateFromUsageFixBase(originalElement) { override fun getText(): String { - val prefix = "type parameter".let { if (data.typeParameters.size > 1) StringUtil.pluralize(it) else it } + val prefix = KotlinBundle.message("text.type.parameter", data.typeParameters.size) val typeParametersText = if (presentTypeParameterNames) data.typeParameters.joinToString(prefix = " ") { "'${it.name}'" } else "" val containerText = ElementDescriptionUtil.getElementDescription(data.declaration, UsageViewTypeLocation.INSTANCE) + " '${data.declaration.name}'" - return "Create $prefix$typeParametersText in $containerText" + return KotlinBundle.message("create.0.in.1", prefix + typeParametersText, containerText) } override fun startInWriteAction() = false @@ -55,7 +56,7 @@ class CreateTypeParameterFromUsageFix( val declaration = data.declaration if (!declaration.isWritable) return emptyList() val project = declaration.project - val usages = project.runSynchronouslyWithProgress("Searching ${declaration.name}...", true) { + val usages = project.runSynchronouslyWithProgress(KotlinBundle.message("searching.0", declaration.name.toString()), true) { runReadAction { val expectedTypeArgumentCount = declaration.typeParameters.size + data.typeParameters.size ReferencesSearch @@ -98,12 +99,12 @@ class CreateTypeParameterFromUsageFix( ) val anonymizedUpperBoundText = upperBoundType?.let { TypeSubstitutor.create( - mapOf( - typeParameter.fakeTypeParameter.typeConstructor to TypeProjectionImpl( - anonymizedTypeParameter.defaultType + mapOf( + typeParameter.fakeTypeParameter.typeConstructor to TypeProjectionImpl( + anonymizedTypeParameter.defaultType + ) ) ) - ) .substitute(upperBoundType, Variance.INVARIANT) }?.let { IdeDescriptorRenderers.SOURCE_CODE.renderType(it) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFix.kt index 1d780601cc0..d909c78b4c8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFix.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.quickfix.createFromUsage.CreateFromUsageFixBase import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.CallableBuilderConfiguration @@ -28,7 +29,10 @@ open class CreateParameterFromUsageFix( ) : CreateFromUsageFixBase(data.originalExpression) { override fun getText(): String { return with(data.parameterInfo) { - if (valOrVar != KotlinValVar.None) "Create property '$name' as constructor parameter" else "Create parameter '$name'" + if (valOrVar != KotlinValVar.None) + KotlinBundle.message("create.property.0.as.constructor.parameter", name) + else + KotlinBundle.message("create.parameter.0", name) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt index c99dd7b254d..fa7ec39b38f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny @@ -140,28 +141,25 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { propertyInfo: PropertyInfo, private val classOrFileName: String? ) : CreateCallableFromUsageFix(contextElement, listOf(propertyInfo)) { - override fun getFamilyName() = "Add property" + override fun getFamilyName() = KotlinBundle.message("add.property") override fun getText(): String { val info = callableInfos.first() as PropertyInfo return buildString { - append("Add '") + append(KotlinBundle.message("text.add")) if (info.isLateinitPreferred || info.modifierList?.hasModifier(KtTokens.LATEINIT_KEYWORD) == true) { append("lateinit ") } append(if (info.writable) "var" else "val") - append("' property '${info.name}' to '$classOrFileName'") + append(KotlinBundle.message("property.0.to.1", info.name, classOrFileName.toString())) } } } - private fun JvmClass.toKtClassOrFile(): KtElement? { - val psi = sourceElement - return when (psi) { - is KtClassOrObject -> psi - is KtLightClassForSourceDeclaration -> psi.kotlinOrigin - is KtLightClassForFacade -> psi.files.firstOrNull() - else -> null - } + private fun JvmClass.toKtClassOrFile(): KtElement? = when (val psi = sourceElement) { + is KtClassOrObject -> psi + is KtLightClassForSourceDeclaration -> psi.kotlinOrigin + is KtLightClassForFacade -> psi.files.firstOrNull() + else -> null } private inline fun JvmElement.toKtElement() = sourceElement?.unwrapped as? T @@ -246,8 +244,12 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { ) val targetClassName = targetClass.name val addConstructorAction = object : CreateCallableFromUsageFix(targetKtClass, listOf(constructorInfo)) { - override fun getFamilyName() = "Add method" - override fun getText() = "Add ${if (needPrimary) "primary" else "secondary"} constructor to '$targetClassName'" + override fun getFamilyName() = KotlinBundle.message("add.method") + override fun getText() = KotlinBundle.message( + "add.0.constructor.to.1", + if (needPrimary) KotlinBundle.message("text.primary") else KotlinBundle.message("text.secondary"), + targetClassName.toString() + ) } val changePrimaryConstructorAction = run { @@ -361,8 +363,8 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { ) val targetClassName = targetClass.name val action = object : CreateCallableFromUsageFix(targetContainer, listOf(functionInfo)) { - override fun getFamilyName() = "Add method" - override fun getText() = "Add method '$methodName' to '$targetClassName'" + override fun getFamilyName() = KotlinBundle.message("add.method") + override fun getText() = KotlinBundle.message("add.method.0.to.1", methodName, targetClassName.toString()) } val nameAndKind = PropertyUtilBase.getPropertyNameAndKind(methodName) ?: return listOf(action) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.191 b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.191 index 1979d79ffa7..a669434e61b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.191 +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.191 @@ -1,17 +1,6 @@ /* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.idea.quickfix.crossLanguage @@ -42,6 +31,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny @@ -152,16 +142,16 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { propertyInfo: PropertyInfo, private val classOrFileName: String? ) : CreateCallableFromUsageFix(contextElement, listOf(propertyInfo)) { - override fun getFamilyName() = "Add property" + override fun getFamilyName() = KotlinBundle.message("add.property") override fun getText(): String { val info = callableInfos.first() as PropertyInfo return buildString { - append("Add '") + append(KotlinBundle.message("text.add")) if (info.isLateinitPreferred || info.modifierList?.hasModifier(KtTokens.LATEINIT_KEYWORD) == true) { append("lateinit ") } append(if (info.writable) "var" else "val") - append("' property '${info.name}' to '$classOrFileName'") + append(KotlinBundle.message("property.0.to.1", info.name, classOrFileName.toString())) } } } @@ -258,8 +248,12 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { ) val targetClassName = targetClass.name val addConstructorAction = object : CreateCallableFromUsageFix(targetKtClass, listOf(constructorInfo)) { - override fun getFamilyName() = "Add method" - override fun getText() = "Add ${if (needPrimary) "primary" else "secondary"} constructor to '$targetClassName'" + override fun getFamilyName() = KotlinBundle.message("add.method") + override fun getText() = KotlinBundle.message( + "add.0.constructor.to.1", + if (needPrimary) KotlinBundle.message("text.primary") else KotlinBundle.message("text.secondary"), + targetClassName.toString() + ) } val changePrimaryConstructorAction = run { @@ -384,8 +378,8 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { ) val targetClassName = targetClass.name val action = object : CreateCallableFromUsageFix(targetContainer, listOf(functionInfo)) { - override fun getFamilyName() = "Add method" - override fun getText() = "Add method '$methodName' to '$targetClassName'" + override fun getFamilyName() = KotlinBundle.message("add.method") + override fun getText() = KotlinBundle.message("add.method.0.to.1", methodName, targetClassName.toString()) } val nameAndKind = PropertyUtilBase.getPropertyNameAndKind(methodName) ?: return listOf(action) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt index 76b1c68d569..7373300ccce 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory @@ -41,8 +42,12 @@ sealed class CreateActualFix( generateIt: KtPsiFactory.(Project, TypeAccessibilityChecker, D) -> D? ) : AbstractCreateDeclarationFix(declaration, actualModule, generateIt) { - override fun getText() = - "Create actual $elementType for module ${module.name} (${actualPlatform.singleOrNull()?.platformName ?: actualPlatform})" + override fun getText() = KotlinBundle.message( + "create.actual.0.for.module.1.2", + elementType, + module.name, + actualPlatform.singleOrNull()?.platformName ?: actualPlatform + ) final override fun invoke(project: Project, editor: Editor?, file: KtFile) { val actualFile = getOrCreateImplementationFile() ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt index 626390842c1..78f59ca004a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.project.implementedModules import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.overrideImplement.makeActual @@ -46,7 +47,7 @@ sealed class CreateExpectedFix( private val targetExpectedClassPointer = targetExpectedClass?.createSmartPointer() - override fun getText() = "Create expected $elementType in common module ${module.name}" + override fun getText() = KotlinBundle.message("create.expected.0.in.common.module.1", elementType, module.name) final override fun invoke(project: Project, editor: Editor?, file: KtFile) { val targetExpectedClass = targetExpectedClassPointer?.element @@ -148,7 +149,7 @@ class CreateExpectedClassFix( } else selectedElements - project.executeWriteCommand("Repair actual members") { + project.executeWriteCommand(KotlinBundle.message("repair.actual.members")) { repairActualModifiers(originalElements + klass, resultDeclarations.toSet()) } @@ -162,7 +163,7 @@ private fun showUnknownTypeInDeclarationDialog( if (declarationsWithNonExistentClasses.isEmpty()) return true val message = escapeXml( declarationsWithNonExistentClasses.joinToString( - prefix = "These declarations cannot be transformed:\n", + prefix = "${KotlinBundle.message("these.declarations.cannot.be.transformed")}\n", separator = "\n", transform = ::getExpressionShortText ) @@ -170,7 +171,7 @@ private fun showUnknownTypeInDeclarationDialog( TypeAccessibilityChecker.testLog?.append("$message\n") return ApplicationManager.getApplication().isUnitTestMode || showOkNoDialog( - "Unknown types", + KotlinBundle.message("unknown.types"), message, project ) @@ -200,7 +201,7 @@ private fun chooseMembers(project: Project, collection: Collection "object" + is KtObjectDeclaration -> KotlinBundle.message("text.object") is KtClass -> when { - isInterface() -> "interface" - isEnum() -> "enum class" - isAnnotation() -> "annotation class" - else -> "class" + isInterface() -> KotlinBundle.message("text.interface") + isEnum() -> KotlinBundle.message("text.enum.class") + isAnnotation() -> KotlinBundle.message("text.annotation.class") + else -> KotlinBundle.message("text.class") } - is KtProperty, is KtParameter -> "property" - is KtFunction -> "function" - else -> "declaration" + is KtProperty, is KtParameter -> KotlinBundle.message("text.property") + is KtFunction -> KotlinBundle.message("text.function") + else -> KotlinBundle.message("text.declaration") } internal fun KtPsiFactory.generateClassOrObject( @@ -381,10 +381,11 @@ private fun AnnotationDescriptor.isValidInModule(checker: TypeAccessibilityCheck } class KotlinTypeInaccessibleException(fqNames: Collection) : Exception() { - override val message: String = "${StringUtil.pluralize( - "Type", - fqNames.size - )} ${TypeAccessibilityChecker.typesToString(fqNames)} is not accessible from target module" + override val message: String = KotlinBundle.message( + "type.0.1.is.not.accessible.from.target.module", + fqNames.size, + TypeAccessibilityChecker.typesToString(fqNames) + ) } fun KtNamedDeclaration.isAlwaysActual(): Boolean = safeAs()?.parent?.parent?.safeAs() @@ -395,7 +396,10 @@ fun TypeAccessibilityChecker.isCorrectAndHaveAccessibleModifiers(declaration: Kt if (declaration.anyInaccessibleModifier(INACCESSIBLE_MODIFIERS, showErrorHint)) return false if (declaration is KtFunction && declaration.hasBody() && declaration.containingClassOrObject?.isInterfaceClass() == true) { - if (showErrorHint) showInaccessibleDeclarationError(declaration, "The function declaration shouldn't have a default implementation") + if (showErrorHint) showInaccessibleDeclarationError( + declaration, + KotlinBundle.message("the.function.declaration.shouldn.t.have.a.default.implementation") + ) return false } @@ -404,8 +408,10 @@ fun TypeAccessibilityChecker.isCorrectAndHaveAccessibleModifiers(declaration: Kt val types = incorrectTypes(declaration).ifEmpty { return true } showInaccessibleDeclarationError( declaration, - "Some types are not accessible from ${targetModule.name}:\n" + TypeAccessibilityChecker.typesToString( - types + KotlinBundle.message( + "some.types.are.not.accessible.from.0.1", + targetModule.name, + TypeAccessibilityChecker.typesToString(types) ) ) @@ -417,7 +423,7 @@ private val INACCESSIBLE_MODIFIERS = listOf(KtTokens.PRIVATE_KEYWORD, KtTokens.C private fun KtModifierListOwner.anyInaccessibleModifier(modifiers: Collection, showErrorHint: Boolean): Boolean { for (modifier in modifiers) { if (hasModifier(modifier)) { - if (showErrorHint) showInaccessibleDeclarationError(this, "The declaration has `$modifier` modifier") + if (showErrorHint) showInaccessibleDeclarationError(this, KotlinBundle.message("the.declaration.has.0.modifier", modifier)) return true } } @@ -426,7 +432,7 @@ private fun KtModifierListOwner.anyInaccessibleModifier(modifiers: Collection(declaration), CleanupFix { - override fun getText() = "Fix with 'asDynamic'" + override fun getText() = KotlinBundle.message("fix.with.asdynamic") override fun getFamilyName() = text override fun invoke(project: Project, editor: Editor?, file: KtFile) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt index 593e099e9eb..46838834544 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt @@ -9,6 +9,7 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.quickfix.CleanupFix import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory @@ -20,7 +21,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType class MigrateTypeParameterListFix(typeParameterList: KtTypeParameterList) : KotlinQuickFixAction(typeParameterList), CleanupFix { - override fun getFamilyName(): String = "Migrate type parameter list syntax" + override fun getFamilyName(): String = KotlinBundle.message("migrate.type.parameter.list.syntax") override fun getText(): String = familyName override fun invoke(project: Project, editor: Editor?, file: KtFile) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt index 3a715bc5f90..ebe372c1be6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt @@ -21,6 +21,7 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.codeInliner.UsageReplacementStrategy import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.core.targetDescriptors @@ -35,9 +36,9 @@ class DeprecatedSymbolUsageFix( replaceWith: ReplaceWith ) : DeprecatedSymbolUsageFixBase(element, replaceWith), CleanupFix, HighPriorityAction { - override fun getFamilyName() = "Replace deprecated symbol usage" + override fun getFamilyName() = KotlinBundle.message("replace.deprecated.symbol.usage") - override fun getText() = "Replace with '${replaceWith.pattern}'" + override fun getText() = KotlinBundle.message("replace.with.0", replaceWith.pattern) override fun invoke(replacementStrategy: UsageReplacementStrategy, project: Project, editor: Editor?) { val element = element ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt index 64cdc7b3d71..c43e89c983c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.KotlinShortNamesCache import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -232,8 +233,10 @@ abstract class DeprecatedSymbolUsageFixBase( ) HintManager.getInstance().showErrorHint( editor, - "There is own 'ReplaceWith' on '$constructorStr' that is used through this alias. " + - "Please replace usages first." + KotlinBundle.message( + "there.is.own.replacewith.on.0.that.is.used.through.this.alias.please.replace.usages.first", + constructorStr + ) ) return null } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt index ce168c28c59..8143dd5db55 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt @@ -9,6 +9,7 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.codeInliner.UsageReplacementStrategy import org.jetbrains.kotlin.idea.codeInliner.replaceUsagesInWholeProject import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory @@ -24,7 +25,7 @@ class DeprecatedSymbolUsageInWholeProjectFix( private val text: String ) : DeprecatedSymbolUsageFixBase(element, replaceWith) { - override fun getFamilyName() = "Replace deprecated symbol usage in whole project" + override fun getFamilyName() = KotlinBundle.message("replace.deprecated.symbol.usage.in.whole.project") override fun getText() = text @@ -37,7 +38,11 @@ class DeprecatedSymbolUsageInWholeProjectFix( override fun invoke(replacementStrategy: UsageReplacementStrategy, project: Project, editor: Editor?) { val psiElement = targetPsiElement()!! - replacementStrategy.replaceUsagesInWholeProject(psiElement, progressTitle = "Applying '$text'", commandName = text) + replacementStrategy.replaceUsagesInWholeProject( + psiElement, + progressTitle = KotlinBundle.message("applying.0", text), + commandName = text + ) } private fun targetPsiElement(): KtDeclaration? = when (val referenceTarget = element?.mainReference?.resolve()) { @@ -68,7 +73,7 @@ class DeprecatedSymbolUsageInWholeProjectFix( return DeprecatedSymbolUsageInWholeProjectFix( nameExpression, replacement, - "Replace usages of '$descriptorName' in whole project" + KotlinBundle.message("replace.usages.of.0.in.whole.project", descriptorName) ) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceProtectedToPublishedApiCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceProtectedToPublishedApiCallFix.kt index 55121bceb1a..b95eee446f4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceProtectedToPublishedApiCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceProtectedToPublishedApiCallFix.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory @@ -49,10 +50,13 @@ class ReplaceProtectedToPublishedApiCallFix( val isPublishedMemberAlreadyExists: Boolean ) : KotlinQuickFixAction(element) { - override fun getFamilyName() = "Replace with @PublishedApi bridge call" + override fun getFamilyName() = KotlinBundle.message("replace.with.publishedapi.bridge.call") override fun getText() = - "Replace with generated @PublishedApi bridge call '${originalName.newNameQuoted}${if (!isProperty) "(...)" else ""}'" + KotlinBundle.message( + "replace.with.generated.publishedapi.bridge.call.0", + originalName.newNameQuoted + if (!isProperty) "(...)" else "" + ) override fun invoke(project: Project, editor: Editor?, file: KtFile) { val element = element ?: return diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/ConvertSealedSubClassToObjectFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/ConvertSealedSubClassToObjectFix.kt index aafd48b75ab..7a1dab4119d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/ConvertSealedSubClassToObjectFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/ConvertSealedSubClassToObjectFix.kt @@ -14,6 +14,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.impl.source.tree.JavaElementType import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.intentions.ConvertSecondaryConstructorToPrimaryIntention import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtClass @@ -23,7 +24,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfType class ConvertSealedSubClassToObjectFix : LocalQuickFix { - override fun getFamilyName() = "Convert sealed sub-class to object" + override fun getFamilyName() = KotlinBundle.message("convert.sealed.sub.class.to.object.fix.family.name") companion object { val JAVA_LANG = Language.findLanguageByID("JAVA") diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/GenerateIdentityEqualsFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/GenerateIdentityEqualsFix.kt index d1fe659ad8f..bfbda044fc1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/GenerateIdentityEqualsFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/sealedSubClassToObject/GenerateIdentityEqualsFix.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.quickfix.sealedSubClassToObject import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemDescriptor import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtPsiFactory @@ -44,5 +45,5 @@ class GenerateIdentityEqualsFix : LocalQuickFix { klass.addDeclaration(hashCodeFunction) } - override fun getFamilyName() = "Generate equals & hashCode by identity" + override fun getFamilyName() = KotlinBundle.message("generate.identity.equals.fix.family.name") } \ No newline at end of file