在 JavaScript 中自动化演示文稿本地化

概述

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

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

为文本设置校对语言

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

const aspose = { slides: require("aspose.slides.via.java") };

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

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

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

为新文本设置默认语言

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

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

const aspose = { slides: require("aspose.slides.via.java") };

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

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

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

在同一段落中使用多种语言

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

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

const aspose = { slides: require("aspose.slides.via.java") };

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

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

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

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

为单独段落启用或抑制拼写检查

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

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

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

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

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

const aspose = { slides: require("aspose.slides.via.java") };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

常见问题

语言 ID 会翻译文本吗?

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

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

不会。语言标识符仅用于校对。文本渲染和布局主要取决于可用的字体、书写系统和文本框设置。为获得可靠的渲染,请提供所需字体,配置字体替换,或在演示文稿中嵌入字体

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

可以。按照多语言段落示例,将每种语言分配给单独的段落。

应该使用 setDefaultTextLanguage 还是 setLanguageId

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