Я б применил паттерн "Strategy", на C# это выглядит так.
// это в одном модуле
interface IText
{
string GetText(int id);
}
// Пусть это будет в russian.dll
class Text : IText
{
public string GetText(int id)
{
if (id == 1) return "Сообщение"; // главное вернуть строку, а как — это вопрос реализации ;)
}
}
// Пусть это будет в english.dll
class Text : IText
{
public string GetText(int id)
{
if (id == 1) return "Message";
}
}
// Пусть это будет ещё где-нибудь
class B
{
private IText text;
public B(IText _text)
{
text = _text;
}
public void DoSomething()
{
MessageBox.Show(text.GetText(1));
}
}
class MainClass
{
public void MainProc()
{
Assembly a = Assembly.LoadFrom("Russian.dll"); // путь можно считать откуда-нибудь, из реестра например
IText text = (IText)Activator.CreateInstance(a.GetType("Text"));
B b = new B(text);
b.DoSomething();
}
}
Теперь, если надо поменять язык — "Russian.dll" меняем на "English.dll" при загрузке assembly. Всё очень просто, не так ли? ;)