In a previous post, we saw how to programmatically search for text in a PowerPoint slide, by iterating over the Shapes contained in a slide, finding the ones that have a TextFrame, and accessing their TextRange property. TextRange exposes a Text property, which “represents the text contained in the specified object”.
Our goal is to translate a slide from a language to another, which means translating every chunk of text we find. However, the Text property contains a bit more than just text. Suppose you were working with a slide like the one below, which contains multiple bullet points, with various indentations:
If you inspect the Text for the content area, you’ll see that it looks like this:
Work It\rMake It\rDo It\rMakes Us\rHarder\rBetter\rFaster\rStronger
At the end of each bullet point, we have a \r, which indicates a line break. If we want to maintain the formatting of our slide when we translate it, we’ll have to deal with it.
We’ll worry about the actual translation later – for the moment we will use a fake method, which will show us what chunk of text has been translated:
public static string Translate(string text)
return "Translated [" + text + "]";
A crude approach
A first approach would be to simply take the entire Text we find in the TextRange, manually separate it into chunks by splitting it around the carriage return character, translating the chunk, and re-composing the text, re-inserting the carriage returns.
Starting where we left off last time, let’s loop over the Shapes in the slide:
private void TranslateSlide()
var powerpoint = Globals.ThisAddIn.Application;
var presentation = powerpoint.ActivePresentation;
var slide = (PowerPoint.Slide)powerpoint.ActiveWindow.View.Slide;
foreach (PowerPoint.Shape shape in slide.Shapes)
if (shape.HasTextFrame == Microsoft.Office.Core.MsoTriState.msoTrue)
var textFrame = shape.TextFrame;
var textRange = textFrame.TextRange;
var text = textRange.Text;
textRange.Text = CrudeApproach(text);