В принципе не большая разница mse или lazarus, язык то один и тот же. Еще зависит с какой целью вы это делаете
Я например заранее не зная какие контролы и сколько их будет на форме, для перевода Caption использую в Lazarus примерно такую конструкцию:
- Код: Выделить всё
- procedure LocalizeControl(Frm: TForm);
 //Локализует некотрые существующие контролы на форме
 var
 i: integer;
 begin
 for i := 0 to Frm.ControlCount - 1 do
 begin
 //Локализуем Caption'ы
 //TLabel
 if Frm.Controls[i] is TLabel then
 (Frm.Controls[i] as TLabel).Caption := Localize((Frm.Controls[i] as TLabel).Caption);
 //TButton
 if Frm.Controls[i] is TButton then
 (Frm.Controls[i] as TButton).Caption := Localize((Frm.Controls[i] as TButton).Caption);
 //Локализуем хинты
 if Frm.Controls[i] is TControl then
 (Frm.Controls[i] as TControl).Hint := Localize((Frm.Controls[i] as TControl).Hint);
 и т.д.
 end;
 end;
 
 procedure LocalizeMenu(Menu: TMenu);    //Локализует меню
 var
 i: integer;
 begin
 for i := 0 to Menu.Items.Count - 1 do
 begin
 Menu.Items[i].Caption := Localize(Menu.Items[i].Caption);
 end;
 end;
Caption для контролов назначаются в зависимости от английской caption, а не от имени компонента, хотя можно использовать и TComponent.Name...
Для самого перевода использую способ подсмотренный у 
alexs (за что ему отдельное спасибо)
LngList  - это TStringList куда загружается файл с переводом вида
EngCaption=РусПодпись
- Код: Выделить всё
- function Localize(const Caption: string): string;  //Локализует строку
 begin
 if not assigned(LngList) then
 begin
 Result := Caption;
 Exit;
 end;
 Result := LngList.Values[Caption];
 if Result = '' then
 Result := Caption;
 end;
 
В MSE можно сделать аналогично, если подобный вариант приемлем..