mirror of
https://github.com/asyouplz/SpeechNote.git
synced 2026-07-22 06:43:33 +00:00
fix(settings): normalize review bot sentence case text
This commit is contained in:
parent
a23361fce1
commit
90e5026386
10 changed files with 109 additions and 107 deletions
|
|
@ -32,32 +32,32 @@ export const UI_CONSTANTS = {
|
|||
|
||||
// 텍스트 메시지
|
||||
MESSAGES: {
|
||||
HEADER: 'Deepgram configuration',
|
||||
HEADER: 'Fast provider configuration',
|
||||
DESCRIPTION:
|
||||
'Configure Deepgram for advanced speech recognition with multiple language support and AI features.',
|
||||
REGISTRY_WARNING: '⚠️ Model registry not available. Using default configuration.',
|
||||
API_KEY_LABEL: 'Deepgram API key',
|
||||
API_KEY_DESC: 'Enter your Deepgram API key for transcription',
|
||||
'Configure the fast transcription provider with multilingual support and advanced processing features.',
|
||||
REGISTRY_WARNING: 'Model registry is not available. Using the default configuration.',
|
||||
API_KEY_LABEL: 'Fast provider API key',
|
||||
API_KEY_DESC: 'Enter your API key for transcription',
|
||||
API_KEY_PLACEHOLDER: 'Enter API key...',
|
||||
API_KEY_SAVED: 'Deepgram API key saved',
|
||||
API_KEY_REQUIRED: 'Please enter your Deepgram API key first',
|
||||
MODEL_LABEL: 'Deepgram model',
|
||||
MODEL_DESC: 'Select the Deepgram model for transcription',
|
||||
API_KEY_SAVED: 'API key saved.',
|
||||
API_KEY_REQUIRED: 'Enter your API key first.',
|
||||
MODEL_LABEL: 'Fast model',
|
||||
MODEL_DESC: 'Select the model for transcription',
|
||||
MODEL_PLACEHOLDER: 'Select a model...',
|
||||
FEATURES_HEADER: 'Features',
|
||||
ADVANCED_HEADER: 'Advanced settings',
|
||||
COST_HEADER: 'Cost estimation',
|
||||
VALIDATION_LABEL: 'Validate configuration',
|
||||
VALIDATION_DESC: 'Test your Deepgram API key and settings',
|
||||
VALIDATION_DESC: 'Test your API key and settings',
|
||||
VALIDATION_BUTTON: 'Validate',
|
||||
VALIDATING: 'Validating...',
|
||||
VALIDATION_SUCCESS: '✅ Deepgram configuration is valid',
|
||||
VALIDATION_ERROR: '❌ Invalid Deepgram API key or configuration',
|
||||
FALLBACK_ERROR_TITLE: '⚠️ Deepgram settings error',
|
||||
VALIDATION_SUCCESS: 'Configuration is valid.',
|
||||
VALIDATION_ERROR: 'Invalid API key or configuration.',
|
||||
FALLBACK_ERROR_TITLE: 'Provider settings error',
|
||||
FALLBACK_ERROR_DESC:
|
||||
'Unable to load full configuration. Basic settings are available below.',
|
||||
CRITICAL_ERROR:
|
||||
'Deepgram settings could not be loaded. Please check the console for errors.',
|
||||
'Provider settings could not be loaded. Please check the console for errors.',
|
||||
},
|
||||
|
||||
// 스타일
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
containerEl.addClass('speech-to-text-settings');
|
||||
|
||||
// Add main title
|
||||
new Setting(containerEl).setName('Speech Note').setHeading();
|
||||
new Setting(containerEl).setName('Speech to text').setHeading();
|
||||
this.debug('Title setting created');
|
||||
|
||||
// Add debug info section at the top
|
||||
|
|
@ -153,8 +153,8 @@ export class SettingsTab extends PluginSettingTab {
|
|||
|
||||
dropdown
|
||||
.addOption('auto', 'Automatic (recommended)')
|
||||
.addOption('whisper', 'OpenAI Whisper')
|
||||
.addOption('deepgram', 'Deepgram')
|
||||
.addOption('whisper', 'General transcription')
|
||||
.addOption('deepgram', 'Fast transcription')
|
||||
.setValue(this.plugin.settings.provider || 'auto')
|
||||
.onChange(async (value) => {
|
||||
this.debug('Provider dropdown changed to:', value);
|
||||
|
|
@ -263,7 +263,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
.addOption('performance_optimized', 'Performance-optimized')
|
||||
.addOption('quality_optimized', 'Quality-optimized')
|
||||
.addOption('round_robin', 'Round-robin')
|
||||
.addOption('ab_test', 'A/B tests')
|
||||
.addOption('ab_test', 'Split testing')
|
||||
.setValue(
|
||||
this.plugin.settings.selectionStrategy ||
|
||||
SelectionStrategy.PERFORMANCE_OPTIMIZED
|
||||
|
|
@ -309,7 +309,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
}
|
||||
|
||||
private renderWhisperSettings(containerEl: HTMLElement): void {
|
||||
new Setting(containerEl).setName('Whisper').setHeading();
|
||||
new Setting(containerEl).setName('General transcription').setHeading();
|
||||
|
||||
// Whisper API Key
|
||||
this.renderWhisperApiKey(containerEl);
|
||||
|
|
@ -317,7 +317,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
// API Endpoint
|
||||
new Setting(containerEl)
|
||||
.setName('API endpoint')
|
||||
.setDesc('OpenAI API endpoint (leave the default unless using a custom endpoint)')
|
||||
.setDesc('API endpoint (leave the default unless using a custom endpoint)')
|
||||
.addText((text) =>
|
||||
text
|
||||
.setPlaceholder('https://api.openai.com/v1')
|
||||
|
|
@ -366,10 +366,10 @@ export class SettingsTab extends PluginSettingTab {
|
|||
|
||||
private renderWhisperApiKey(containerEl: HTMLElement): void {
|
||||
new Setting(containerEl)
|
||||
.setName('API key for OpenAI')
|
||||
.setDesc('Enter your API key for OpenAI Whisper transcription')
|
||||
.setName('General provider API key')
|
||||
.setDesc('Enter your API key for transcription')
|
||||
.addText((text) => {
|
||||
text.setPlaceholder('sk-...')
|
||||
text.setPlaceholder('Enter sk-...')
|
||||
.setValue(this.maskApiKey(this.plugin.settings.apiKey || ''))
|
||||
.onChange(async (value) => {
|
||||
if (value && !value.includes('*')) {
|
||||
|
|
@ -378,7 +378,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
await this.plugin.saveSettings();
|
||||
|
||||
text.setValue(this.maskApiKey(value));
|
||||
new Notice('Saved the API key for OpenAI.');
|
||||
new Notice('Saved the API key.');
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -400,10 +400,10 @@ export class SettingsTab extends PluginSettingTab {
|
|||
|
||||
private renderDeepgramApiKey(containerEl: HTMLElement): void {
|
||||
new Setting(containerEl)
|
||||
.setName('Deepgram API key')
|
||||
.setDesc('Enter your deepgram API key for transcription')
|
||||
.setName('Fast provider API key')
|
||||
.setDesc('Enter your API key for transcription')
|
||||
.addText((text) => {
|
||||
text.setPlaceholder('Enter deepgram API key...')
|
||||
text.setPlaceholder('Enter your API key...')
|
||||
.setValue(this.maskApiKey(this.plugin.settings.deepgramApiKey || ''))
|
||||
.onChange(async (value) => {
|
||||
if (value && !value.includes('*')) {
|
||||
|
|
@ -411,7 +411,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
await this.plugin.saveSettings();
|
||||
|
||||
text.setValue(this.maskApiKey(value));
|
||||
new Notice('Deepgram API key saved.');
|
||||
new Notice('Saved the API key.');
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -438,11 +438,11 @@ export class SettingsTab extends PluginSettingTab {
|
|||
infoEl.empty();
|
||||
|
||||
const descriptions = {
|
||||
auto: '🤖 intelligent selection between providers based on your configured strategy. Automatically chooses the best provider for each request.',
|
||||
auto: 'Intelligent selection between providers based on your configured strategy. Automatically chooses the best provider for each request.',
|
||||
whisper:
|
||||
'🎯 OpenAI Whisper - high-quality transcription with support for multiple languages. Best for general-purpose transcription.',
|
||||
'Balanced transcription with broad language support. Best for general-purpose transcription.',
|
||||
deepgram:
|
||||
'⚡ Deepgram - fast, accurate transcription with advanced AI features. Best for real-time processing and speaker diarization.',
|
||||
'Fast transcription with advanced processing features. Best for real-time processing and speaker labeling.',
|
||||
};
|
||||
|
||||
infoEl.createEl('p', { text: descriptions[provider] });
|
||||
|
|
@ -524,11 +524,11 @@ export class SettingsTab extends PluginSettingTab {
|
|||
const provider = this.plugin.settings.provider || 'auto';
|
||||
if (provider === 'whisper' || provider === 'auto') {
|
||||
new Setting(containerEl)
|
||||
.setName('Whisper model')
|
||||
.setDesc('Select the Whisper model to use')
|
||||
.setName('General model')
|
||||
.setDesc('Select the model to use')
|
||||
.addDropdown((dropdown) =>
|
||||
dropdown
|
||||
.addOption('whisper-1', 'Whisper v1 (default)')
|
||||
.addOption('whisper-1', 'Default model (v1)')
|
||||
.setValue(this.plugin.settings.model || 'whisper-1')
|
||||
.onChange(async (value) => {
|
||||
this.plugin.settings.model = value;
|
||||
|
|
@ -649,7 +649,7 @@ export class SettingsTab extends PluginSettingTab {
|
|||
.setDesc('If you find this plugin helpful, consider buying me a coffee ☕')
|
||||
.addButton((button) =>
|
||||
button
|
||||
.setButtonText('☕ Buy me a coffee')
|
||||
.setButtonText('Buy me a coffee')
|
||||
.setCta()
|
||||
.onClick(() => {
|
||||
window.open('https://buymeacoffee.com/asyouplz', '_blank');
|
||||
|
|
@ -664,9 +664,9 @@ export class SettingsTab extends PluginSettingTab {
|
|||
private getProviderLabel(provider: 'auto' | 'whisper' | 'deepgram'): string {
|
||||
switch (provider) {
|
||||
case 'whisper':
|
||||
return 'OpenAI Whisper';
|
||||
return 'General transcription';
|
||||
case 'deepgram':
|
||||
return 'Deepgram';
|
||||
return 'Fast transcription';
|
||||
case 'auto':
|
||||
default:
|
||||
return 'Automatic';
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ export class SimpleSettingsTab extends PluginSettingTab {
|
|||
this.debug('Adding options to dropdown...');
|
||||
dropdown
|
||||
.addOption('auto', 'Automatic (recommended)')
|
||||
.addOption('whisper', 'OpenAI Whisper')
|
||||
.addOption('deepgram', 'Deepgram')
|
||||
.addOption('whisper', 'General transcription')
|
||||
.addOption('deepgram', 'Fast transcription')
|
||||
.setValue(this.plugin.settings.provider || 'auto')
|
||||
.onChange(async (value) => {
|
||||
this.debug('Provider changed to:', value);
|
||||
|
|
@ -61,11 +61,11 @@ export class SimpleSettingsTab extends PluginSettingTab {
|
|||
// Auto 모드일 때는 양쪽 API 키 모두 표시
|
||||
if (provider === 'auto' || provider === 'whisper') {
|
||||
new Setting(containerEl)
|
||||
.setName('API key for OpenAI')
|
||||
.setDesc('Enter your API key for OpenAI Whisper')
|
||||
.setName('General provider API key')
|
||||
.setDesc('Enter your API key for transcription')
|
||||
.addText((text) =>
|
||||
text
|
||||
.setPlaceholder('sk-...')
|
||||
.setPlaceholder('Enter sk-...')
|
||||
.setValue(this.plugin.settings.apiKey || '')
|
||||
.onChange(async (value) => {
|
||||
this.plugin.settings.apiKey = value;
|
||||
|
|
@ -77,11 +77,11 @@ export class SimpleSettingsTab extends PluginSettingTab {
|
|||
|
||||
if (provider === 'auto' || provider === 'deepgram') {
|
||||
new Setting(containerEl)
|
||||
.setName('Deepgram API key')
|
||||
.setDesc('Enter your deepgram API key')
|
||||
.setName('Fast provider API key')
|
||||
.setDesc('Enter your API key')
|
||||
.addText((text) =>
|
||||
text
|
||||
.setPlaceholder('Enter deepgram API key...')
|
||||
.setPlaceholder('Enter your API key...')
|
||||
.setValue(this.plugin.settings.deepgramApiKey || '')
|
||||
.onChange(async (value) => {
|
||||
this.plugin.settings.deepgramApiKey = value;
|
||||
|
|
@ -92,8 +92,8 @@ export class SimpleSettingsTab extends PluginSettingTab {
|
|||
// Deepgram 모델 선택
|
||||
if (provider === 'deepgram') {
|
||||
new Setting(containerEl)
|
||||
.setName('Deepgram model')
|
||||
.setDesc('Select the deepgram model to use')
|
||||
.setName('Fast model')
|
||||
.setDesc('Select the model to use')
|
||||
.addDropdown((dropdown) =>
|
||||
dropdown
|
||||
.addOption('nova-2', 'Nova 2 (premium)')
|
||||
|
|
|
|||
|
|
@ -70,7 +70,9 @@ export class ApiKeyValidator {
|
|||
);
|
||||
|
||||
if (!hasWhisper) {
|
||||
new Notice('The API key is valid, but it may not have access to Whisper.');
|
||||
new Notice(
|
||||
'The API key is valid, but it may not have access to the whisper model.'
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -37,11 +37,11 @@ export class AudioSettings {
|
|||
|
||||
// Whisper 모델 선택
|
||||
new Setting(containerEl)
|
||||
.setName('Whisper model')
|
||||
.setDesc('Choose which Whisper model to use')
|
||||
.setName('General model')
|
||||
.setDesc('Choose which model to use')
|
||||
.addDropdown((dropdown) =>
|
||||
dropdown
|
||||
.addOption('whisper-1', 'Whisper-1 default model')
|
||||
.addOption('whisper-1', 'Default model')
|
||||
.setValue(this.plugin.settings.model)
|
||||
.onChange(async (value: string) => {
|
||||
if (value === 'whisper-1') {
|
||||
|
|
@ -61,8 +61,8 @@ export class AudioSettings {
|
|||
.addOption('json', 'JSON (structured data)')
|
||||
.addOption('text', 'Text (plain text)')
|
||||
.addOption('verbose_json', 'Detailed JSON output')
|
||||
.addOption('srt', 'Subtitle format (SRT)')
|
||||
.addOption('vtt', 'WebVTT format (VTT)')
|
||||
.addOption('srt', 'Subtitle format (.srt)')
|
||||
.addOption('vtt', 'Caption format (.vtt)')
|
||||
.setValue(
|
||||
typeof this.plugin.settings['responseFormat'] === 'string'
|
||||
? this.plugin.settings['responseFormat']
|
||||
|
|
@ -111,11 +111,11 @@ export class AudioSettings {
|
|||
// 파일 크기 제한
|
||||
const fileSizeSetting = new Setting(containerEl)
|
||||
.setName('Maximum file size')
|
||||
.setDesc('Maximum upload size in MB');
|
||||
.setDesc('Maximum upload size in megabytes');
|
||||
|
||||
const sizeValue = containerEl.createDiv({ cls: 'filesize-value' });
|
||||
const currentSize = Math.round(this.plugin.settings.maxFileSize / (1024 * 1024));
|
||||
sizeValue.setText(`${currentSize} MB`);
|
||||
sizeValue.setText(`${currentSize} megabytes`);
|
||||
|
||||
fileSizeSetting.addSlider((slider) =>
|
||||
slider
|
||||
|
|
@ -123,7 +123,7 @@ export class AudioSettings {
|
|||
.setValue(currentSize)
|
||||
.onChange(async (value) => {
|
||||
this.plugin.settings.maxFileSize = value * 1024 * 1024;
|
||||
sizeValue.setText(`${value} MB`);
|
||||
sizeValue.setText(`${value} megabytes`);
|
||||
await this.plugin.saveSettings();
|
||||
})
|
||||
.setDynamicTooltip()
|
||||
|
|
@ -179,7 +179,7 @@ export class AudioSettings {
|
|||
|
||||
const limitList = limitations.createEl('ul');
|
||||
const limits = [
|
||||
'Maximum file size: 25 MB',
|
||||
'Maximum file size: 25 megabytes',
|
||||
'Maximum audio length: unlimited (large files are split automatically)',
|
||||
'Concurrent processing: 1 file',
|
||||
'API request limit: 50 requests per minute',
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ export class DeepgramSettings {
|
|||
this.updateUIAfterModelChange();
|
||||
|
||||
if (this.selectedModel) {
|
||||
new Notice(`Selected model: ${this.selectedModel.name}`);
|
||||
new Notice('Model selected.');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -606,7 +606,7 @@ export class DeepgramSettings {
|
|||
|
||||
const primaryList = noteEl.createEl('ul');
|
||||
[
|
||||
'Files larger than 50MB may experience timeout errors',
|
||||
'Files larger than 50 megabytes may experience timeout errors',
|
||||
'Auto-chunking splits files into manageable pieces',
|
||||
'Each chunk is processed separately and results are merged',
|
||||
].forEach((item) => {
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ export class DeepgramUIBuilder {
|
|||
const warningEl =
|
||||
container.querySelector(`.budget-warning`) ||
|
||||
container.createEl('p', { cls: 'budget-warning' });
|
||||
warningEl.textContent = `⚠️ Exceeds monthly budget of $${budget}`;
|
||||
warningEl.textContent = `Exceeds monthly budget of $${budget}`;
|
||||
warningEl.classList.add(UI_CONSTANTS.CLASSES.WARNING);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,9 +80,9 @@ export class ProviderSettings {
|
|||
.setDesc('Choose a specific provider or use automatic selection')
|
||||
.addDropdown((dropdown) => {
|
||||
dropdown
|
||||
.addOption('auto', '🤖 Automatic (recommended)')
|
||||
.addOption('whisper', '🎯 OpenAI Whisper')
|
||||
.addOption('deepgram', '🚀 Deepgram')
|
||||
.addOption('auto', 'Automatic (recommended)')
|
||||
.addOption('whisper', 'General transcription')
|
||||
.addOption('deepgram', 'Fast transcription')
|
||||
.setValue(this.currentProvider)
|
||||
.onChange(async (value) => {
|
||||
if (this.isProviderValue(value)) {
|
||||
|
|
@ -111,18 +111,18 @@ export class ProviderSettings {
|
|||
this.renderSingleApiKey(
|
||||
apiKeysContainer,
|
||||
'whisper',
|
||||
'API key for OpenAI',
|
||||
'Enter your API key for OpenAI (starts with sk-)',
|
||||
'sk-...'
|
||||
'General provider API key',
|
||||
'Enter your API key (starts with sk-)',
|
||||
'Enter sk-...'
|
||||
);
|
||||
|
||||
// Deepgram API Key
|
||||
this.renderSingleApiKey(
|
||||
apiKeysContainer,
|
||||
'deepgram',
|
||||
'Deepgram API key',
|
||||
'Enter your deepgram API key',
|
||||
'your-deepgram-api-key'
|
||||
'Fast provider API key',
|
||||
'Enter your API key',
|
||||
'Enter your API key...'
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -219,11 +219,11 @@ export class ProviderSettings {
|
|||
.setDesc('How should the system choose between providers?')
|
||||
.addDropdown((dropdown) => {
|
||||
dropdown
|
||||
.addOption(SelectionStrategy.COST_OPTIMIZED, '💰 Cost-optimized')
|
||||
.addOption(SelectionStrategy.PERFORMANCE_OPTIMIZED, '⚡ Performance-optimized')
|
||||
.addOption(SelectionStrategy.QUALITY_OPTIMIZED, '✨ Quality-optimized')
|
||||
.addOption(SelectionStrategy.ROUND_ROBIN, '🔄 Round-robin')
|
||||
.addOption(SelectionStrategy.AB_TEST, '🧪 A/B tests')
|
||||
.addOption(SelectionStrategy.COST_OPTIMIZED, 'Cost-optimized')
|
||||
.addOption(SelectionStrategy.PERFORMANCE_OPTIMIZED, 'Performance-optimized')
|
||||
.addOption(SelectionStrategy.QUALITY_OPTIMIZED, 'Quality-optimized')
|
||||
.addOption(SelectionStrategy.ROUND_ROBIN, 'Round-robin')
|
||||
.addOption(SelectionStrategy.AB_TEST, 'Split testing')
|
||||
.setValue(
|
||||
this.plugin.settings.selectionStrategy ||
|
||||
SelectionStrategy.PERFORMANCE_OPTIMIZED
|
||||
|
|
@ -282,7 +282,7 @@ export class ProviderSettings {
|
|||
const abTestEl = containerEl.createDiv({ cls: 'sn-ab-test-settings' });
|
||||
|
||||
new Setting(abTestEl)
|
||||
.setName('Enable A/B tests')
|
||||
.setName('Enable split testing')
|
||||
.setDesc('Compare providers to find the best one for your use case')
|
||||
.addToggle((toggle) => {
|
||||
toggle
|
||||
|
|
@ -320,8 +320,8 @@ export class ProviderSettings {
|
|||
|
||||
// 분할 비율 표시
|
||||
const displayEl = containerEl.createDiv({ cls: 'sn-split-display' });
|
||||
displayEl.createEl('span', { text: `Whisper: ${currentSplit}%` });
|
||||
displayEl.createEl('span', { text: `Deepgram: ${100 - currentSplit}%` });
|
||||
displayEl.createEl('span', { text: `General: ${currentSplit}%` });
|
||||
displayEl.createEl('span', { text: `Fast: ${100 - currentSplit}%` });
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -349,7 +349,7 @@ export class ProviderSettings {
|
|||
private renderMetrics(containerEl: HTMLElement): void {
|
||||
const metricsEl = containerEl.createDiv({ cls: 'sn-metrics-container' });
|
||||
|
||||
metricsEl.createEl('h4', { text: '📊 Performance metrics' });
|
||||
metricsEl.createEl('h4', { text: 'Performance metrics' });
|
||||
|
||||
// 각 Provider별 메트릭
|
||||
this.renderProviderMetrics(metricsEl, 'whisper');
|
||||
|
|
@ -407,17 +407,17 @@ export class ProviderSettings {
|
|||
*/
|
||||
private renderComparisonChart(containerEl: HTMLElement): void {
|
||||
const chartEl = containerEl.createDiv({ cls: 'sn-comparison-chart' });
|
||||
chartEl.createEl('h5', { text: '📈 Provider comparison' });
|
||||
chartEl.createEl('h5', { text: 'Provider comparison' });
|
||||
|
||||
// 간단한 막대 차트 (실제로는 Chart.js 등 사용 권장)
|
||||
const chartContent = chartEl.createDiv({ cls: 'sn-chart-content' });
|
||||
const bars = chartContent.createDiv({ cls: 'sn-chart-bars' });
|
||||
|
||||
const whisperBar = bars.createDiv({ cls: 'sn-chart-bar sn-chart-bar--whisper' });
|
||||
whisperBar.createEl('span', { cls: 'sn-bar-label', text: 'Whisper' });
|
||||
whisperBar.createEl('span', { cls: 'sn-bar-label', text: 'General' });
|
||||
|
||||
const deepgramBar = bars.createDiv({ cls: 'sn-chart-bar sn-chart-bar--deepgram' });
|
||||
deepgramBar.createEl('span', { cls: 'sn-bar-label', text: 'Deepgram' });
|
||||
deepgramBar.createEl('span', { cls: 'sn-bar-label', text: 'Fast' });
|
||||
|
||||
const legend = chartContent.createDiv({ cls: 'sn-chart-legend' });
|
||||
legend.createEl('span', { text: 'Overall performance score' });
|
||||
|
|
@ -434,10 +434,10 @@ export class ProviderSettings {
|
|||
|
||||
if (whisperConnected || deepgramConnected) {
|
||||
statusEl.addClass('sn-connection-status--connected');
|
||||
statusEl.setText('✅ connected');
|
||||
statusEl.setText('Connected');
|
||||
} else {
|
||||
statusEl.addClass('sn-connection-status--disconnected');
|
||||
statusEl.setText('⚠️ no providers configured');
|
||||
statusEl.setText('No providers configured');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -575,9 +575,9 @@ export class ProviderSettings {
|
|||
*/
|
||||
private showProviderInfo(provider: string): void {
|
||||
const info: Record<string, string> = {
|
||||
auto: '🤖 System will automatically select the best provider based on performance and availability',
|
||||
whisper: '🎯 OpenAI Whisper - high accuracy, supports 50+ languages',
|
||||
deepgram: '🚀 Deepgram - fast real-time transcription with excellent accuracy',
|
||||
auto: 'The system will automatically select the best provider based on performance and availability.',
|
||||
whisper: 'Balanced transcription with strong multilingual support.',
|
||||
deepgram: 'Fast transcription with strong real-time performance.',
|
||||
};
|
||||
|
||||
new Notice(info[provider] || 'Provider selected');
|
||||
|
|
@ -588,11 +588,11 @@ export class ProviderSettings {
|
|||
*/
|
||||
private showStrategyInfo(strategy: string): void {
|
||||
const info: Record<string, string> = {
|
||||
[SelectionStrategy.COST_OPTIMIZED]: '💰 Will choose the most cost-effective provider',
|
||||
[SelectionStrategy.PERFORMANCE_OPTIMIZED]: '⚡ Will choose the fastest provider',
|
||||
[SelectionStrategy.QUALITY_OPTIMIZED]: '✨ Will choose the most accurate provider',
|
||||
[SelectionStrategy.ROUND_ROBIN]: '🔄 Will alternate between providers equally',
|
||||
[SelectionStrategy.AB_TEST]: '🧪 Will split traffic for comparison',
|
||||
[SelectionStrategy.COST_OPTIMIZED]: 'Will choose the most cost-effective provider.',
|
||||
[SelectionStrategy.PERFORMANCE_OPTIMIZED]: 'Will choose the fastest provider.',
|
||||
[SelectionStrategy.QUALITY_OPTIMIZED]: 'Will choose the most accurate provider.',
|
||||
[SelectionStrategy.ROUND_ROBIN]: 'Will alternate between providers equally.',
|
||||
[SelectionStrategy.AB_TEST]: 'Will split traffic for comparison.',
|
||||
};
|
||||
|
||||
new Notice(info[strategy] || 'Strategy selected');
|
||||
|
|
@ -603,8 +603,8 @@ export class ProviderSettings {
|
|||
*/
|
||||
private getProviderDisplayName(provider: TranscriptionProvider): string {
|
||||
const names: Record<TranscriptionProvider, string> = {
|
||||
whisper: 'OpenAI Whisper',
|
||||
deepgram: 'Deepgram',
|
||||
whisper: 'General transcription',
|
||||
deepgram: 'Fast transcription',
|
||||
};
|
||||
return names[provider] || provider;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ export class ShortcutSettings {
|
|||
|
||||
if (conflicts.length > 0) {
|
||||
const conflictEl = containerEl.createDiv({ cls: 'shortcut-conflicts' });
|
||||
conflictEl.createEl('h4', { text: '⚠️ Shortcut conflicts detected' });
|
||||
conflictEl.createEl('h4', { text: 'Shortcut conflicts detected' });
|
||||
|
||||
const conflictList = conflictEl.createEl('ul');
|
||||
conflicts.forEach((conflict) => {
|
||||
|
|
@ -485,7 +485,7 @@ class ShortcutModal extends Modal {
|
|||
this.isRecording = true;
|
||||
this.recordedKeys.clear();
|
||||
|
||||
button.setButtonText('Recording... (Esc to cancel)');
|
||||
button.setButtonText('Recording... (press escape to cancel)');
|
||||
button.buttonEl.addClass('is-recording');
|
||||
|
||||
// 키 이벤트 리스너
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ export class AdvancedSettingsPanel {
|
|||
const headerEl = containerEl.createDiv({ cls: 'advanced-panel-header' });
|
||||
|
||||
headerEl.createEl('h4', {
|
||||
text: '⚙️ advanced configuration',
|
||||
text: 'Advanced configuration',
|
||||
cls: 'advanced-title',
|
||||
});
|
||||
|
||||
|
|
@ -96,11 +96,11 @@ export class AdvancedSettingsPanel {
|
|||
.setDesc('How the system selects providers when in auto mode')
|
||||
.addDropdown((dropdown) => {
|
||||
dropdown
|
||||
.addOption(SelectionStrategy.PERFORMANCE_OPTIMIZED, '⚡ performance first')
|
||||
.addOption(SelectionStrategy.COST_OPTIMIZED, '💰 cost optimized')
|
||||
.addOption(SelectionStrategy.QUALITY_OPTIMIZED, '✨ quality first')
|
||||
.addOption(SelectionStrategy.ROUND_ROBIN, '🔄 round robin')
|
||||
.addOption(SelectionStrategy.AB_TEST, '🧪 a/b testing')
|
||||
.addOption(SelectionStrategy.PERFORMANCE_OPTIMIZED, 'Performance first')
|
||||
.addOption(SelectionStrategy.COST_OPTIMIZED, 'Cost-optimized')
|
||||
.addOption(SelectionStrategy.QUALITY_OPTIMIZED, 'Quality first')
|
||||
.addOption(SelectionStrategy.ROUND_ROBIN, 'Round-robin')
|
||||
.addOption(SelectionStrategy.AB_TEST, 'Split testing')
|
||||
.setValue(
|
||||
this.plugin.settings.selectionStrategy ||
|
||||
SelectionStrategy.PERFORMANCE_OPTIMIZED
|
||||
|
|
@ -206,7 +206,7 @@ export class AdvancedSettingsPanel {
|
|||
// Monthly Budget
|
||||
new Setting(sectionEl)
|
||||
.setName('Monthly budget')
|
||||
.setDesc('Maximum monthly spending in usd (leave empty for unlimited)')
|
||||
.setDesc('Maximum monthly spending in dollars (leave empty for unlimited)')
|
||||
.addText((text) => {
|
||||
text.setPlaceholder('50.00')
|
||||
.setValue(this.plugin.settings.monthlyBudget?.toString() || '')
|
||||
|
|
@ -298,7 +298,7 @@ export class AdvancedSettingsPanel {
|
|||
// Post-processing
|
||||
new Setting(sectionEl)
|
||||
.setName('Enable post-processing')
|
||||
.setDesc('Apply nlp corrections to improve accuracy')
|
||||
.setDesc('Apply text corrections to improve accuracy')
|
||||
.addToggle((toggle) => {
|
||||
toggle
|
||||
.setValue(this.plugin.settings.enablePostProcessing || true)
|
||||
|
|
@ -321,11 +321,11 @@ export class AdvancedSettingsPanel {
|
|||
* A/B Testing 섹션
|
||||
*/
|
||||
private renderABTestingSection(containerEl: HTMLElement): void {
|
||||
const sectionEl = this.createSection(containerEl, 'A/B tests', 'ab-test-section');
|
||||
const sectionEl = this.createSection(containerEl, 'Split testing', 'ab-test-section');
|
||||
|
||||
// Enable A/B Testing
|
||||
new Setting(sectionEl)
|
||||
.setName('Enable a/b testing')
|
||||
.setName('Enable split testing')
|
||||
.setDesc('Compare providers to find optimal configuration')
|
||||
.addToggle((toggle) => {
|
||||
toggle.setValue(this.abTestEnabled).onChange(async (value) => {
|
||||
|
|
@ -399,7 +399,7 @@ export class AdvancedSettingsPanel {
|
|||
// Test Results Button
|
||||
new Setting(sectionEl)
|
||||
.setName('View results')
|
||||
.setDesc('See current a/b test results')
|
||||
.setDesc('See current test results')
|
||||
.addButton((button) => {
|
||||
button
|
||||
.setButtonText('View results')
|
||||
|
|
@ -880,7 +880,7 @@ export class AdvancedSettingsPanel {
|
|||
*/
|
||||
private showABTestResults(): void {
|
||||
// TODO: Implement A/B test results modal
|
||||
new Notice('A/b test results coming soon.');
|
||||
new Notice('Test results are coming soon.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue