Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions src/i18n/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import en from "./locales/en";
import tr from "./locales/tr";

type LocaleData = typeof en;
type DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] };

const locales: Record<string, DeepPartial<LocaleData>> = { en, tr };

function getNestedValue(obj: Record<string, unknown>, path: string): string | undefined {
const parts = path.split(".");
let current: unknown = obj;
for (const part of parts) {
if (current == null || typeof current !== "object") return undefined;
current = (current as Record<string, unknown>)[part];
}
return typeof current === "string" ? current : undefined;
}

function interpolate(template: string, params: string[]): string {
return template.replace(/\{(\d+)\}/g, (_, i: string) => params[parseInt(i)] ?? "");
}

let currentLocaleData: DeepPartial<LocaleData> = en;

/** Initialize i18n. Call this on plugin load with the detected locale. */
export function setLocale(locale: string) {
const lang = locale.split("-")[0].toLowerCase();
currentLocaleData = locales[lang] ?? locales[locale] ?? en;
}

/** Register a new locale. */
export function addLocale(locale: string, data: DeepPartial<LocaleData>) {
locales[locale] = data;
}

/** Translate a dot-notation key with optional {0}, {1}, ... interpolation. */
export function t(key: string, ...params: string[]): string {
const value =
getNestedValue(currentLocaleData as Record<string, unknown>, key) ??
getNestedValue(en as Record<string, unknown>, key);
if (value === undefined) {
console.warn(`[dataview] Missing i18n key: ${key}`);
return key;
}
return params.length > 0 ? interpolate(value, params) : value;
}
140 changes: 140 additions & 0 deletions src/i18n/locales/en.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
const en = {
settings: {
enableInlineQueries: {
name: "Enable inline queries",
desc: "Enable or disable executing regular inline Dataview queries.",
},
enableJsQueries: {
name: "Enable JavaScript queries",
desc: "Enable or disable executing DataviewJS queries.",
},
enableInlineJsQueries: {
name: "Enable inline JavaScript queries",
desc: "Enable or disable executing inline DataviewJS queries. Requires that DataviewJS queries are enabled.",
},
enableInlineFieldHighlightingReadingView: {
name: "Enable inline field highlighting in reading view",
desc: "Enables or disables visual highlighting / pretty rendering for inline fields in reading view.",
},
enableInlineFieldHighlightingLivePreview: {
name: "Enable inline field highlighting in Live Preview",
desc: "Enables or disables visual highlighting / pretty rendering for inline fields in Live Preview.",
},
codeblocks: {
heading: "Codeblocks",
},
dataviewJsKeyword: {
name: "DataviewJS keyword",
desc: "Keyword for DataviewJS blocks. Defaults to 'dataviewjs'. Reload required for changes to take effect.",
},
inlineQueryPrefix: {
name: "Inline query prefix",
desc: "The prefix to inline queries (to mark them as Dataview queries). Defaults to '='.",
},
inlineJsQueryPrefix: {
name: "JavaScript inline query prefix",
desc: "The prefix to JavaScript inline queries (to mark them as DataviewJS queries). Defaults to '$='.",
},
inlineQueriesInCodeblocks: {
name: "Code block inline queries",
desc: "If enabled, inline queries will also be evaluated inside full code blocks.",
},
view: {
heading: "View",
},
showResultCount: {
name: "Display result count",
desc: "If toggled off, the small number in the result header of TASK and TABLE queries will be hidden.",
},
warnOnEmptyResult: {
name: "Warn on empty result",
desc: "If set, queries which return 0 results will render a warning message.",
},
renderNullAs: {
name: "Render null as",
desc: "What null/non-existent should show up as in tables, by default. This supports Markdown notation.",
},
refreshEnabled: {
name: "Automatic view refreshing",
desc: "If enabled, views will automatically refresh when files in your vault change; this can negatively affect some functionality like embeds in views, so turn it off if such functionality is not working.",
},
refreshInterval: {
name: "Refresh interval",
desc: "How long to wait (in milliseconds) for files to stop changing before updating views.",
},
defaultDateFormat: {
name: "Date format",
desc: "The default date format (see Luxon date format options). Currently: {0}",
},
defaultDateTimeFormat: {
name: "Date + time format",
desc: "The default date and time format (see Luxon date format options). Currently: {0}",
},
tables: {
heading: "Tables",
},
tableIdColumnName: {
name: "Primary column name",
desc: "The name of the default ID column in tables; this is the auto-generated first column that links to the source file.",
},
tableGroupColumnName: {
name: "Grouped column name",
desc: "The name of the default ID column in tables, when the table is on grouped data; this is the auto-generated first column that links to the source file/group.",
},
tasks: {
heading: "Tasks",
},
taskCompletionTracking: {
name: "Automatic task completion tracking",
desc1: "If enabled, Dataview will automatically append tasks with their completion date when they are checked in Dataview views.",
desc2: "Example with default field name and date format: - [x] my task [completion:: 2022-01-01]",
},
taskCompletionUseEmojiShorthand: {
name: "Use emoji shorthand for completion",
desc1: 'If enabled, will use emoji shorthand instead of inline field formatting to fill out implicit task field "completion".',
desc2: "Example: - [x] my task ✅ 2022-01-01",
desc3: "Disable this to customize the completion date format or field name, or to use Dataview inline field formatting.",
desc4: 'Only available when "automatic task completion tracking" is enabled.',
descDisabled: 'Only available when "automatic task completion tracking" is enabled.',
},
taskCompletionText: {
name: "Completion field name",
desc1: "Text used as inline field key for task completion date when toggling a task's checkbox in a Dataview view.",
desc2: 'Only available when "automatic task completion tracking" is enabled and "use emoji shorthand for completion" is disabled.',
descDisabled:
'Only available when "automatic task completion tracking" is enabled and "use emoji shorthand for completion" is disabled.',
},
taskCompletionDateFormat: {
name: "Completion date format",
desc1: "Date-time format for task completion date when toggling a task's checkbox in a Dataview view (see Luxon date format options).",
desc2: 'Only available when "automatic task completion tracking" is enabled and "use emoji shorthand for completion" is disabled.',
desc3: "Currently: {0}",
descDisabled:
'Only available when "automatic task completion tracking" is enabled and "use emoji shorthand for completion" is disabled.',
},
recursiveSubTaskCompletion: {
name: "Recursive sub-task completion",
desc: "If enabled, completing a task in a Dataview will automatically complete its subtasks too.",
},
},
views: {
loading: "Loading...",
jsDisabled: "Dataview JS queries are disabled. You can enable them in the Dataview settings.",
inlineJsDisabled: "(disabled; enable in settings)",
evaluationError: "Evaluation Error: {0}",
noResultsList: "Dataview: No results to show for list query.",
noResultsTable: "Dataview: No results to show for table query.",
noResultsTask: "Dataview: No results to show for task query.",
noResultsCalendar: "Dataview: Query returned 0 results.",
inlineQueryError: "Dataview (for inline query '{0}'): {1}",
inlineJsQueryError: "Dataview (for inline JS query '{0}'): {1}",
unrecognizedValue: "Unrecognized: {0}",
calendarError: "Dataview: {0}",
},
query: {
limitError: "Failed to execute 'limit' statement: {0}",
unrecognizedOperation: "Unrecognized query operation '{0}'",
},
};

export default en;
140 changes: 140 additions & 0 deletions src/i18n/locales/tr.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
const tr = {
settings: {
enableInlineQueries: {
name: "Satır içi sorguları etkinleştir",
desc: "Normal satır içi Dataview sorgularının çalıştırılmasını etkinleştirir veya devre dışı bırakır.",
},
enableJsQueries: {
name: "JavaScript sorgularını etkinleştir",
desc: "DataviewJS sorgularının çalıştırılmasını etkinleştirir veya devre dışı bırakır.",
},
enableInlineJsQueries: {
name: "Satır içi JavaScript sorgularını etkinleştir",
desc: "Satır içi DataviewJS sorgularının çalıştırılmasını etkinleştirir veya devre dışı bırakır. DataviewJS sorgularının etkin olmasını gerektirir.",
},
enableInlineFieldHighlightingReadingView: {
name: "Okuma görünümünde satır içi alan vurgulamayı etkinleştir",
desc: "Okuma görünümünde satır içi alanlar için görsel vurgulamayı / güzel görünümü etkinleştirir veya devre dışı bırakır.",
},
enableInlineFieldHighlightingLivePreview: {
name: "Canlı Önizlemede satır içi alan vurgulamayı etkinleştir",
desc: "Canlı Önizlemede satır içi alanlar için görsel vurgulamayı / güzel görünümü etkinleştirir veya devre dışı bırakır.",
},
codeblocks: {
heading: "Kod Blokları",
},
dataviewJsKeyword: {
name: "DataviewJS anahtar kelimesi",
desc: "DataviewJS blokları için anahtar kelime. Varsayılan: 'dataviewjs'. Değişikliklerin geçerli olması için yeniden yükleme gerekir.",
},
inlineQueryPrefix: {
name: "Satır içi sorgu ön eki",
desc: "Satır içi sorguların ön eki (Dataview sorgusu olarak işaretlemek için). Varsayılan: '='.",
},
inlineJsQueryPrefix: {
name: "JavaScript satır içi sorgu ön eki",
desc: "JavaScript satır içi sorgularının ön eki (DataviewJS sorgusu olarak işaretlemek için). Varsayılan: '$='.",
},
inlineQueriesInCodeblocks: {
name: "Kod bloğu satır içi sorguları",
desc: "Etkinleştirilirse, satır içi sorgular tam kod bloklarının içinde de değerlendirilir.",
},
view: {
heading: "Görünüm",
},
showResultCount: {
name: "Sonuç sayısını göster",
desc: "Kapatılırsa, TASK ve TABLE sorgularının sonuç başlığındaki küçük sayı gizlenir.",
},
warnOnEmptyResult: {
name: "Boş sonuçta uyar",
desc: "Ayarlandığında, 0 sonuç döndüren sorgular bir uyarı mesajı gösterir.",
},
renderNullAs: {
name: "Null değerini şu şekilde göster",
desc: "Tablolarda varsayılan olarak null/var olmayan değerlerin nasıl görüneceği. Markdown gösterimini destekler.",
},
refreshEnabled: {
name: "Otomatik görünüm yenileme",
desc: "Etkinleştirilirse, kasanızdaki dosyalar değiştiğinde görünümler otomatik olarak yenilenir; bu, görünümlerdeki gömülü içerikler gibi bazı işlevleri olumsuz etkileyebilir, bu nedenle söz konusu işlevler çalışmıyorsa kapatın.",
},
refreshInterval: {
name: "Yenileme aralığı",
desc: "Görünümleri güncellemeden önce dosyaların değişmeyi bırakmasını bekleme süresi (milisaniye).",
},
defaultDateFormat: {
name: "Tarih biçimi",
desc: "Varsayılan tarih biçimi (Luxon tarih biçimi seçeneklerine bakın). Şu an: {0}",
},
defaultDateTimeFormat: {
name: "Tarih + saat biçimi",
desc: "Varsayılan tarih ve saat biçimi (Luxon tarih biçimi seçeneklerine bakın). Şu an: {0}",
},
tables: {
heading: "Tablolar",
},
tableIdColumnName: {
name: "Birincil sütun adı",
desc: "Tablolardaki varsayılan kimlik sütununun adı; kaynak dosyaya bağlantı veren otomatik oluşturulan ilk sütundur.",
},
tableGroupColumnName: {
name: "Gruplandırılmış sütun adı",
desc: "Gruplandırılmış verilerde tablolardaki varsayılan kimlik sütununun adı; kaynak dosyaya/gruba bağlantı veren otomatik oluşturulan ilk sütundur.",
},
tasks: {
heading: "Görevler",
},
taskCompletionTracking: {
name: "Otomatik görev tamamlama takibi",
desc1: "Etkinleştirilirse, Dataview görünümlerinde işaretlenen görevlere tamamlanma tarihi otomatik olarak eklenir.",
desc2: "Varsayılan alan adı ve tarih biçimiyle örnek: - [x] görevim [completion:: 2022-01-01]",
},
taskCompletionUseEmojiShorthand: {
name: "Tamamlama için emoji kısayolu kullan",
desc1: 'Etkinleştirilirse, örtük "completion" görev alanını doldurmak için satır içi alan biçimi yerine emoji kısayolu kullanılır.',
desc2: "Örnek: - [x] görevim ✅ 2022-01-01",
desc3: "Tamamlama tarihi biçimini veya alan adını özelleştirmek ya da Dataview satır içi alan biçimlendirmesini kullanmak için bunu devre dışı bırakın.",
desc4: '"Otomatik görev tamamlama takibi" etkinken kullanılabilir.',
descDisabled: '"Otomatik görev tamamlama takibi" etkinken kullanılabilir.',
},
taskCompletionText: {
name: "Tamamlama alanı adı",
desc1: "Dataview görünümünde görev onay kutusu işaretlenirken tamamlanma tarihi için satır içi alan anahtarı olarak kullanılan metin.",
desc2: '"Otomatik görev tamamlama takibi" etkin ve "tamamlama için emoji kısayolu kullan" devre dışıyken kullanılabilir.',
descDisabled:
'"Otomatik görev tamamlama takibi" etkin ve "tamamlama için emoji kısayolu kullan" devre dışıyken kullanılabilir.',
},
taskCompletionDateFormat: {
name: "Tamamlama tarihi biçimi",
desc1: "Dataview görünümünde görev onay kutusu işaretlenirken tamamlanma tarihi için tarih-saat biçimi (Luxon tarih biçimi seçeneklerine bakın).",
desc2: '"Otomatik görev tamamlama takibi" etkin ve "tamamlama için emoji kısayolu kullan" devre dışıyken kullanılabilir.',
desc3: "Şu an: {0}",
descDisabled:
'"Otomatik görev tamamlama takibi" etkin ve "tamamlama için emoji kısayolu kullan" devre dışıyken kullanılabilir.',
},
recursiveSubTaskCompletion: {
name: "Özyinelemeli alt görev tamamlama",
desc: "Etkinleştirilirse, Dataview'de bir görevi tamamlamak alt görevlerini de otomatik olarak tamamlar.",
},
},
views: {
loading: "Yükleniyor...",
jsDisabled: "Dataview JS sorguları devre dışı. Dataview ayarlarından etkinleştirebilirsiniz.",
inlineJsDisabled: "(devre dışı; ayarlardan etkinleştirin)",
evaluationError: "Değerlendirme Hatası: {0}",
noResultsList: "Dataview: Liste sorgusu için gösterilecek sonuç yok.",
noResultsTable: "Dataview: Tablo sorgusu için gösterilecek sonuç yok.",
noResultsTask: "Dataview: Görev sorgusu için gösterilecek sonuç yok.",
noResultsCalendar: "Dataview: Sorgu 0 sonuç döndürdü.",
inlineQueryError: "Dataview ('{0}' satır içi sorgusu için): {1}",
inlineJsQueryError: "Dataview ('{0}' satır içi JS sorgusu için): {1}",
unrecognizedValue: "Tanınmayan: {0}",
calendarError: "Dataview: {0}",
},
query: {
limitError: "'limit' ifadesi çalıştırılamadı: {0}",
unrecognizedOperation: "Tanınmayan sorgu işlemi '{0}'",
},
};

export default tr;
Loading