Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Add devtools integration #918

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Feb 14, 2025
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add display for missing translations
  • Loading branch information
Demivan committed Feb 14, 2025
commit 0751b5173cbf968b0138ec778bde5e1151ff5d14
50 changes: 48 additions & 2 deletions 50 src/devtools/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
import type { FluentBundle } from '@fluent/bundle'

import type { FluentVue } from 'src'
import type { App } from 'vue-demi'
import type { App, ComponentInternalInstance } from 'vue-demi'
import type { ResolvedOptions } from '../types'
import { setupDevToolsPlugin } from '@vue/devtools-api'
import { watchEffect } from 'vue-demi'
import { getCurrentInstance, watchEffect } from 'vue-demi'
import pseudoLocalize from './pseudoLocalize'

export function registerFluentVueDevtools(app: App, options: ResolvedOptions, fluent: FluentVue) {
let currentPseudoLocalize: ((str: string) => string) | undefined
const missingTranslations: WeakMap<ComponentInternalInstance, Set<string>> = new WeakMap()

// Hook into options and app
const oldWarnMissing = options.warnMissing
options.warnMissing = (key) => {
const instance = getCurrentInstance()

oldWarnMissing(key)

if (!instance)
return

missingTranslations.set(instance, missingTranslations.get(instance) ?? new Set())
missingTranslations.get(instance)!.add(key)
}

// Hook into bundle tranform
const hookedBundles = new WeakSet<FluentBundle>()
Expand Down Expand Up @@ -103,6 +118,37 @@ export function registerFluentVueDevtools(app: App, options: ResolvedOptions, fl
backgroundColor: 0x41B883,
})
}

const missing = missingTranslations.get(componentInstance)
if (missing != null && missing.size > 0) {
treeNode.tags.push({
label: 'missing translations',
textColor: 0xFFFFFF,
backgroundColor: 0xB00020,
})
}
})

api.on.inspectComponent(({ componentInstance, instanceData }) => {
if (!componentInstance?.proxy?.$options.fluent)
return

const missing = missingTranslations.get(componentInstance)

if (missing) {
instanceData.state.push({
type: 'fluent-vue',
key: 'missingTranslations',
editable: false,
value: {
_custom: {
type: 'set',
value: [...missing.values()],
display: JSON.stringify([...missing.values()]),
},
},
})
}
})

function handleSettingsChange(settings: {
Expand Down
Morty Proxy This is a proxified and sanitized view of the page, visit original site.