Salesforce Apex获取翻译工作台中自定义对象的字段翻译内容

495 阅读2分钟

继上篇文章的业务需求及提出的其他思路,找到了从翻译工作台获取的方法。

上篇文章《Salesfroce 获取自定义标签翻译的内容》

1.首先到设置,搜索翻译,找到用户界面-翻译工作台-翻译,选择语言等设置,对相应的字段标签文本填写翻译文本。我在这里选择对“配置清单”对象的“客户”和“版本号”进行了英语翻译。

image.png

2.上篇文章有提到,翻译后的文本会被存储在ConfigurationList__c-en_US.objectTranslation文件中,参考官方文档,如果要看到具体存储的文件,可以在objectTranslations文件夹中找。我想要获取的是自定义对象的字段翻译,按照文档可以知道它是在CustomObjectTranslation下的fields字段,类型是CustomObjectTranslation.CustomFieldTranslation[],在这个CustomObjectTranslation对象中还能获取到其他的类别翻译,比如说记录类型,详细看官方文档(这里只解决字段标签的翻译,其它的也是类似的)。

image.png

3.因为在官方找不到Apex获取元数据的例子,Java倒是有,不过网上有人就读取Salesforce的Metadata封装好了一个类(Github地址),下载MetadataService.cls,项目还有对应的测试类还有调用示例,也可以下载下来。在项目中创建MetadataService.cls后,继续创建调用的方法,我自己只对翻译标签做了一个封装,代码如下。

public class CustomObjectFieldTranslation {
   /**
    * @Description: 获取翻译工作台,自定义对象标签的翻译
    * @Author: Zaki
    * @CreateDate: 2022-06-13 15:14
    * @UpdateDate: 2022-06-13 15:14
    * @Param fieldLabel 传入的是字段标签
    */
   public static String getFieldTranslation(String objectName, String lan, String fieldLabel) {
      // 将传入的字段标签转为API名称
      Map<String, SObjectField> stringSObjectFieldMap = Schema.getGlobalDescribe().get(objectName).getDescribe().fields.getMap();
      Map<String, String> fieldAndLabel = new Map<String, String>();
      List<SObjectField> sObjectFieldList = stringSObjectFieldMap.values();
      for (SObjectField sObjectField: sObjectFieldList) {
         fieldAndLabel.put(sObjectField.getDescribe().getLabel(), sObjectField.getDescribe().getName());
      }
      String fieldName = fieldAndLabel.get(fieldLabel);

      String[] objectList = new String[]{objectName+'-'+lan};
      MetadataService.MetadataPort service = new MetadataService.MetadataPort();
      service.SessionHeader = new MetadataService.SessionHeader_element();
      service.SessionHeader.sessionId = UserInfo.getSessionId();
      MetadataService.CustomObjectTranslation customObjectTranslation = (MetadataService.CustomObjectTranslation) service.readMetadata('CustomObjectTranslation', objectList).getRecords()[0];
      for(MetadataService.CustomFieldTranslation aField: customObjectTranslation.fields) {
         if (aField.name.equals(fieldName)) {
            return aField.label;
         }
      }
      return null;
   }
}

调用示例

// 参数:对象名称、语言、对象字段的标签
CustomObjectFieldTranslation.getFieldTranslation('ConfigurationList__c', 'en_US', '版本号');

输出结果

image.png

注:封装的方法没有进行异常处理等诸多小毛病,而且还可以继续封装更多的方法,这里就不一一展示了,但可以根据这个小例子举一反三,更多探索还得参考官方文档

附录:翻译语言的值参考,主要看Salesforce支持的语言。

最后:在看翻译语言的文档时,发现翻译自定义标签也可以通过该文档实现,于是对上篇文章的实现增加多一个方法。

/** 
 * @Description: 获取自定义的翻译内容 
 * @Author: Zaki
 * @CreateDate: 2022-06-13 16:08
 * @UpdateDate: 2022-06-13 16:08
 * @Param: label 自定义标签的名称,lan 指定翻译的语言
 */
public static String getCustomLabelTranslation(String label, String lan) {
   MetadataService.MetadataPort service = new MetadataService.MetadataPort();
   service.SessionHeader = new MetadataService.SessionHeader_element();
   service.SessionHeader.sessionId = UserInfo.getSessionId();
   MetadataService.Translations[] translations = (MetadataService.Translations[]) service.readMetadata('Translations', new String[] {lan}).getRecords();
   for (MetadataService.Translations translation : translations) {
      for (MetadataService.CustomLabelTranslation customLabelTranslation : translation.customLabels) {
        if (customLabelTranslation.name.equals(label)) {
           return customLabelTranslation.label;
        }
      }
   }
   return null;
}