02.08.2016, 09:22
|
|
Sir Richard Abramson
|
|
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
|
|
Кароче, мне лень графоманить статью о том, как можно переводить интерфейс firemonkey, поэтому вот как я сделал:
Код:
unit language;
interface
uses
System.Types, System.Classes, System.SysUtils, System.Generics.Collections,
System.JSON,
FMX.Types, FMX.Styles;
type
TLang = class sealed
private
class var FLangs: TDictionary<string, string>;
class var FCurrentLang: string;
class constructor ClassCreate;
class destructor ClassDestroy;
class procedure SetCurrentLang(const Value: string); static; inline;
public
class procedure LoadLanguages;
class function Languages: TArray<string>; inline;
class property CurrentLang: string read FCurrentLang write SetCurrentLang;
end;
implementation
{ TLang }
function TranslateEx(const AText: string): string;
begin
if not TLang.FLangs.TryGetValue(TLang.FCurrentLang + AText, Result) then
Result := AText
end;
class constructor TLang.ClassCreate;
begin
TLang.FLangs := TDictionary<string, string>.Create;
CustomTranslateProc := TranslateEx;
end;
class destructor TLang.ClassDestroy;
begin
CustomTranslateProc := nil;
TLang.FLangs.Free;
end;
class function TLang.Languages: TArray<string>;
begin
Result := TLang.FLangs.Keys.ToArray;
end;
class procedure TLang.LoadLanguages;
const
html_ret: string = '<br>';
text_ret: string = #13#10;
var
rs: TResourceStream;
ss: TStringStream;
base: TJSONValue;
it: TJSONValue;
jdict: TJSONObject;
i: Integer;
begin
rs := TResourceStream.Create(HInstance, 'langs', 'LOCAL');
try
ss := TStringStream.Create;
try
ss.LoadFromStream(rs);
base := TJSONObject.ParseJSONValue(ss.DataString);
try
for it in base.GetValue<TJSONArray>('langs') do
begin
jdict := base.GetValue<TJSONObject>(it.Value);
for i := 0 to jdict.Count - 1 do
with jdict.Pairs[i] do
TLang.FLangs.Add(it.Value +
JsonString.Value.Replace(html_ret, text_ret),
JsonValue.Value.Replace(html_ret, text_ret));
end;
finally
base.Free;
end;
finally
ss.Free;
end;
finally
rs.Free;
end;
end;
class procedure TLang.SetCurrentLang(const Value: string);
begin
FCurrentLang := Value;
TStyleManager.UpdateScenes;
end;
end.
В коде, где есть чето типа label1.text := 'привет', надо использовать ф-ю translate:
Код:
label1.text := translate('привет, мир');
Привер JSON словаря:
Код:
{
"langs":[
"EN"
],
"EN":{
"привет":"Hello",
"пока":"Byte, die"
}
}
|