在 Android 上自动化演示文稿本地化

概述

Aspose.Slides for Android via Java 允许您为各个文本段落配置校对元数据。使用IBasePortionFormat.setLanguageId来标识校对语言,使用IBasePortionFormat.setSpellCheck来允许或抑制拼写检查,并使用IBasePortionFormat.setProofDisabled来控制更广泛的“禁止校对”状态。由于这些设置在段落级别应用,一个段落可以包含多种语言和不同的校对规则。

本文档说明了如何为特定文本分配语言,如何使用LoadOptions.setDefaultTextLanguage为新文本设置默认语言,如何构建多语言段落,如何在 SpellCheckProofDisabled 之间进行选择,以及在使用Presentation.joinPortionsWithSameFormatting时如何保留预期的设置。这些属性仅存储演示文稿应用程序使用的元数据;它们不会翻译文本、执行基于词典的拼写检查或返回拼写错误的单词。

为文本设置校对语言

创建或加载一个Presentation,通过IPortion.getPortionFormat获取所需的文本段落,并为其分配语言标识符。以下示例创建一个形状,将校对语言设置为英式英语,并使用Presentation.save保存结果:

import com.aspose.slides.IAutoShape;
import com.aspose.slides.IPortion;
import com.aspose.slides.ISlide;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import com.aspose.slides.ShapeType;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 320, 80);
    shape.getTextFrame().setText("Set the proofing language for this text.");

    IPortion portion = shape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
    portion.getPortionFormat().setLanguageId("en-GB");

    presentation.save("proofing_language.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

为新文本设置默认语言

使用LoadOptions.setDefaultTextLanguage指定 Aspose.Slides 为新创建的文本分配的校对语言。当演示文稿中的大部分或全部新文本使用相同语言时,此设置非常有用。它不会更改已经显式设置语言的文本的语言元数据。

以下示例创建一个演示文稿,其新文本使用德语校对规则:

import com.aspose.slides.IAutoShape;
import com.aspose.slides.ISlide;
import com.aspose.slides.LoadOptions;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import com.aspose.slides.ShapeType;

LoadOptions loadOptions = new LoadOptions();
loadOptions.setDefaultTextLanguage("de-DE");

Presentation presentation = new Presentation(loadOptions);
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 320, 80);
    shape.getTextFrame().setText("Willkommen zur Präsentation");

    presentation.save("default_text_language.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

在单段落中使用多种语言

IParagraph 包含一个文本段落集合。为每种语言创建单独的Portion,并独立设置其 LanguageId

此示例创建一个包含英文和法文段落的段落:

import com.aspose.slides.IAutoShape;
import com.aspose.slides.IParagraph;
import com.aspose.slides.ISlide;
import com.aspose.slides.Portion;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import com.aspose.slides.ShapeType;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 420, 80);
    IParagraph paragraph = shape.getTextFrame().getParagraphs().get_Item(0);
    paragraph.getPortions().clear();

    Portion englishPortion = new Portion("Welcome");
    englishPortion.getPortionFormat().setLanguageId("en-US");
    paragraph.getPortions().add(englishPortion);

    Portion frenchPortion = new Portion(" — Bienvenue");
    frenchPortion.getPortionFormat().setLanguageId("fr-FR");
    paragraph.getPortions().add(frenchPortion);

    presentation.save("multilingual_text.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

为单个部分启用或抑制拼写检查

IPortionFormat 继承了由IBasePortionFormat 定义的通用文本属性。通过IPortion.getPortionFormat获取段落的格式,并使用IBasePortionFormat.setSpellCheck来控制演示文稿应用程序是否检查该段落的拼写。默认值为 falsetrue 允许拼写检查,false 则抑制检查。

该设置适用于各个文本段落。同一段落中的不同段落因此可以使用不同的值。IBasePortionFormat.setLanguageIdsetSpellCheck 具有互补作用:setLanguageId 标识校对语言,而 setSpellCheck 决定是否允许对该段落进行拼写检查。

IBasePortionFormat.setProofDisabled 亦可控制校对,但它以 NullableBool 表示更广泛的“禁止校对”状态。当您仅需要针对拼写检查的布尔开关时,请使用 setSpellCheck。当您需要保留或显式控制演示文稿的“无校对”元数据(包括其 NotDefined 状态)时,请使用 setProofDisabled。如果同时设置这两个属性,请保持它们的值一致;不要将 setSpellCheck(true)setProofDisabled(NullableBool.True) 组合使用。

这些属性配置 PowerPoint 等演示文稿应用程序使用的校对元数据。Aspose.Slides 不会利用它们执行基于词典的拼写检查或返回拼写错误单词的列表。

以下完整示例创建一个输入演示文稿,加载它,为同一段落中的两个段落分配不同的拼写检查设置和校对语言,保存结果后重新打开,并验证已存储的值:

import com.aspose.slides.IAutoShape;
import com.aspose.slides.IParagraph;
import com.aspose.slides.IPortion;
import com.aspose.slides.IPortionCollection;
import com.aspose.slides.ISlide;
import com.aspose.slides.Portion;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import com.aspose.slides.ShapeType;

String inputFile = "spell_check_input.pptx";
String outputFile = "spell_check_settings.pptx";

Presentation sourcePresentation = new Presentation();
try {
    ISlide sourceSlide = sourcePresentation.getSlides().get_Item(0);
    IAutoShape sourceShape = sourceSlide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 420, 80);
    IParagraph sourceParagraph = sourceShape.getTextFrame().getParagraphs().get_Item(0);
    sourceParagraph.getPortions().clear();

    Portion sourceEnglishPortion = new Portion("Check this text. ");
    sourceEnglishPortion.getPortionFormat().setLanguageId("en-US");
    sourceParagraph.getPortions().add(sourceEnglishPortion);

    Portion sourceFrenchPortion = new Portion("Ignorer ce code : ZX-81.");
    sourceFrenchPortion.getPortionFormat().setLanguageId("fr-FR");
    sourceParagraph.getPortions().add(sourceFrenchPortion);

    sourcePresentation.save(inputFile, SaveFormat.Pptx);
} finally {
    sourcePresentation.dispose();
}

Presentation presentation = new Presentation(inputFile);
try {
    IAutoShape shape = (IAutoShape) presentation.getSlides().get_Item(0).getShapes().get_Item(0);
    IPortionCollection portions = shape.getTextFrame().getParagraphs().get_Item(0).getPortions();

    IPortion checkedPortion = portions.get_Item(0);
    checkedPortion.getPortionFormat().setLanguageId("en-US");
    checkedPortion.getPortionFormat().setSpellCheck(true);

    IPortion suppressedPortion = portions.get_Item(1);
    suppressedPortion.getPortionFormat().setLanguageId("fr-FR");
    suppressedPortion.getPortionFormat().setSpellCheck(false);

    presentation.save(outputFile, SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Presentation reopenedPresentation = new Presentation(outputFile);
try {
    IAutoShape reopenedShape = (IAutoShape) reopenedPresentation.getSlides().get_Item(0).getShapes().get_Item(0);
    IPortionCollection storedPortions = reopenedShape.getTextFrame().getParagraphs().get_Item(0).getPortions();

    boolean firstPortionStored = storedPortions.getCount() == 2 &&
            "en-US".equals(storedPortions.get_Item(0).getPortionFormat().getLanguageId()) &&
            storedPortions.get_Item(0).getPortionFormat().getSpellCheck();

    boolean secondPortionStored = storedPortions.getCount() == 2 &&
            "fr-FR".equals(storedPortions.get_Item(1).getPortionFormat().getLanguageId()) &&
            !storedPortions.get_Item(1).getPortionFormat().getSpellCheck();

    if (firstPortionStored && secondPortionStored) {
        System.out.println("The proofing settings were stored correctly.");
    } else {
        System.out.println("The proofing settings could not be verified.");
    }
} finally {
    reopenedPresentation.dispose();
}

Presentation.joinPortionsWithSameFormatting 会合并具有相同格式的相邻段落。仅 SpellCheck 差异并不能保持这些段落分离;合并后,产生的段落保留首个段落的 SpellCheck 值。如果段落需要不同的拼写检查设置,请在分配这些设置之前调用 joinPortionsWithSameFormatting,或者在合并后检查产生的段落边界并重新应用设置。具有不同 LanguageId 值的段落会保持分离,因为它们的校对语言格式不同。

常见问题

语言 ID 会翻译文本吗?

不会。IBasePortionFormat.setLanguageId 仅存储用于拼写和语法校对的元数据;它不会改变文本内容。请单独翻译文本,然后为每个已翻译的段落设置相应的语言标识符。

校对语言会控制字体、断字或换行吗?

不会。语言标识符仅用于校对。文本的渲染和布局主要取决于可用的fonts、书写系统以及文本框设置。为确保可靠渲染,请提供所需字体,配置font substitution,或在演示文稿中embed fonts

一个段落可以使用多种校对语言吗?

可以。如多语言段落示例所示,为每种语言创建单独的段落即可。

我应该使用 setDefaultTextLanguage 还是 setLanguageId

当您希望为新创建的文本提供默认语言时,请使用LoadOptions.setDefaultTextLanguage。当特定段落需要显式的校对语言,或段落中包含多种语言时,请使用IBasePortionFormat.setLanguageId