codecamp

IntelliJ IDEA硬编码字符串

IntelliJ IDEA 提取硬编码字符串文字

启用代码检查以突出显示硬编码字符串文字后,您可以继续将这些文字解压缩到属性文件中。为此,IntelliJ IDEA 提供特殊意图行为 i18nize 硬编码字符串文本。

本节考虑两种访问资源包的可能方法:

  • 使用 java.util.ResourceBundle 实用程序类
  • 使用自定义实用工具类

使用 java.util.ResourceBundle 提取硬编码字符串文字

tip:您可以跳过此步骤,并在 I18nize 硬编码字符串对话框中立即指定所需的资源包表达式。
  1. 指定将用于存储提取的文字的资源包。特别地,您可以将以下语句添加到您的源代码中:

    private static ResourceBundle <field name> =
    getBundle("<bundle name>");

    例如:

    private static ResourceBundle myBundle =
    getBundle("com.intellij.fontChooser.FontChooser");
  2. 单击突出显示的字符串,按 Alt+Enter,并在意图行为列表中选择 i18nize 硬编码字符串:
    使用java.util.ResourceBundle提取硬编码字符串文字
  3. 在"I18nize 硬编码字符串"对话框中指定目标属性文件、属性键和值以及资源包表达式。

    如果 ResourceBundle 字段已在源代码中声明(如步骤1所示),则 IntelliJ IDEA 在默认情况下建议它的名称。如果您尚未在源代码中声明此字段,您仍然可以在对话框中立即定义所需的表达式。为此,请在 "资源包表达式" 字段中输入 ResourceBundle 类型的有效表达式。

    注意:基本代码完成在该字段中工作。键入类名,并按下 Ctrl+Space ,选择方法:

    使用java.util.ResourceBundle提取硬编码字符串文字

    从建议列表中选择所需的方法,然后再按 Ctrl+Space 一次以填写括号:

    使用java.util.ResourceBundle提取硬编码字符串文字

    之后,在引号中键入包和资源包名称:

    使用java.util.ResourceBundle提取硬编码字符串文字
  4. 点击“确定”。具有硬编码字符串文字的行被替换。例如,如果源代码中已经声明了资源包,则将创建以下行:
    使用java.util.ResourceBundle提取硬编码字符串文字

    如果在对话框中定义了资源包,结果将是:

    使用java.util.ResourceBundle提取硬编码字符串文字

使用自定义资源包类提取字符串文字

  1. 请确保 IntelliJ IDEA 安装下的redist/annotations.jar归档文件被添加到模块依赖关系中。
  2. 在项目中创建一个新类,并键入以下代码:
    import org.jetbrains.annotations.PropertyKey;
    import org.jetbrains.annotations.NonNls;
    import java.util.ResourceBundle;
    import java.text.MessageFormat;
    public class I18nSupport {
                   @NonNls
                   private static final ResourceBundle bundle = ResourceBundle.getBundle ("com.intellij.FontChooser");
                   public static String i18n_str
                    (@PropertyKey(resourceBundle ="com.intellij.FontChooser")
                    String key,Object... params){
                    String value =bundle.getString(key);
                    if (params.length >0) return MessageFormat.format(value, params);
                    return value;
        }
    }
  3. 在包含硬编码字符串的类中,单击突出显示的字符串,按 Alt+Enter,并在意图行为列表中选择 i18nize 硬编码字符串文本。该 I18n-ize 字符串文字对话框显示缺少资源包表达式:
    使用自定义资源包类提取字符串文字
  4. 点击 "编辑 i18n 模板链接"。在 "文件模板" 对话框中,将 I18nized 表达式更改为指向自定义资源包类的方法:

    这个更改是全局性的,并且会影响所有项目!
    使用自定义资源包类提取字符串文字

    点击“确定”,保存更新的模板并关闭对话框。

  5. 在"I18n-ize 字符串文本" 对话框的 "预览" 部分中,请参阅建议的替换,然后单击 "确定"。源代码更改:
    使用自定义资源包类提取字符串文字

隐藏硬编码字符串

有时你可能想隐藏硬编码的文字。要这样做,使用不需要国际化注释。

  1. 按 Alt+Enter 显示字符串文字的意图行为:
    IntelliJ IDEA忽略硬编码字符串
  2. 从"建议"列表中选择注释为 @NonNls。
  3. 在打开的“选择路径”对话框中,指定annotations.xml 文件将被存储的位置 。

或者,您可以添加 @NonNls 注释:

IntelliJ IDEA忽略硬编码字符串

如果您选中该复选框以后不显示此对话框,则您仍然可以在“设置”对话框中选择注释样式(代码样式 |Java 代码生成)。

识别硬编码字符串

您的源代码可以包含您想要识别的硬编码字符串,并进一步提取到属性。要在编辑器中突出显示硬编码的文字,请使用国际化代码检查。

  1. 打开 "设置" 对话框。
  2. 在项目设置,选择 编辑|检查(Editor | Inspections),打开 检查对话框。
  3. 选择所需的配置文件,并找到节点国际化问题。
  4. 请注意,您可以配置此检查的严重性,并指定何时应识别硬编码的字符串。例如,您可以选择跳过toString() 方法的内容,或没有字母字符的文字。

    检查硬编码字符串选项,这将导致硬编码字符串文字在编辑器中突出显示。
  5. 应用更改并关闭对话框。现在编辑器将突出显示硬编码的字符串文字,如下所示:
    IntelliJ IDEA识别硬编码字符串
使用ResourceBundle
IntelliJ IDEA如何使用书签进行导航
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

IntelliJ IDEA的一般准则

什么是IntelliJ IDEA项目

使用IntelliJ IDEA的意图行为

IntelliJ IDEA使用运行/调试配置

特定于VCS的程序

IntelliJ IDEA语言和特定框架指南

IntelliJ IDEA的数据库和SQL功能

IntelliJ IDEA使用之JavaServer Faces(JSF)

IntelliJ IDEA:分析PHP应用程序的性能

IntelliJ IDEA:调试PHP应用程序

IntelliJ IDEA:适用于PHP的Google App Engine

IntelliJ IDEA更多内容

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }