@@ -6,10 +6,18 @@ const rootDir = process.cwd();
66const strict = process . argv . includes ( "--strict" ) ;
77const jsonOnly = process . argv . includes ( "--json" ) ;
88const pruneUnused = process . argv . includes ( "--prune-unused" ) ;
9+ const fixEnglishStyle = process . argv . includes ( "--fix-english-style" ) ;
910
1011const localeDir = path . join ( rootDir , "src" , "shared" , "i18n" , "locales" ) ;
1112const sourceDir = path . join ( rootDir , "src" ) ;
12- const englishStyleSkipKeys = new Set ( [ "app.name" ] ) ;
13+ const englishStyleSkipKeys = new Set ( [
14+ "app.name" ,
15+ "library.config.subtitleStyles.exportProfileStyleDocument" ,
16+ "library.workspace.header.videoEditing" ,
17+ "library.workspace.header.subtitleEditing" ,
18+ "library.workspace.header.speechToSubtitle" ,
19+ "library.workspace.dialogs.exportSubtitle.style" ,
20+ ] ) ;
1321const englishStylePreservePhrases = [
1422 "Dream Creator" ,
1523 "Apple" ,
@@ -148,19 +156,12 @@ const englishTitleCaseLowerWords = new Set([
148156 "via" ,
149157] ) ;
150158const englishSentenceBoundaryChars = new Set ( [ "." , "!" , "?" ] ) ;
159+ // Apple HIG defines title-style capitalization for compact actionable controls like
160+ // buttons and menu items, but uses sentence-style capitalization for labels and most prose.
151161const englishTitleStyleExplicitPatterns = [
152162 / ^ a p p \. s e t t i n g s \. t i t l e \. / ,
153- / ^ s e t t i n g s \. g a t e w a y \. d e t a i l s P a n e l \. s e c t i o n s \. / ,
154- / ^ s e t t i n g s \. g a t e w a y \. d e t a i l s P a n e l \. ( c o n t e x t T a b s | h t t p T a b s | t a l k T a b s | h e a r t b e a t T a b s ) \. / ,
155- / ^ s e t t i n g s \. g a t e w a y \. d e t a i l s P a n e l \. ( g a t e w a y \. c o n t r o l P l a n e | r u n t i m e \. ( m a x S t e p s | t o o l L o o p \. ( e n a b l e d | w a r n | c r i t i c a l | g l o b a l | h i s t o r y | d e t e c t o r G e n e r i c | d e t e c t o r P o l l | d e t e c t o r P i n g P o n g ) | c o n t e x t W a r n | c o n t e x t H a r d | c o m p a c t i o n M o d e | c o m p a c t i o n R e s e r v e T o k e n s | c o m p a c t i o n K e e p R e c e n t | c o m p a c t i o n R e s e r v e F l o o r | c o m p a c t i o n M a x H i s t o r y S h a r e | c o m p a c t i o n M e m o r y F l u s h E n a b l e d | c o m p a c t i o n M e m o r y F l u s h S o f t | c o m p a c t i o n M e m o r y F l u s h P r o m p t | c o m p a c t i o n M e m o r y F l u s h S y s t e m ) | q u e u e \. ( g l o b a l C o n c u r r e n c y | s e s s i o n C o n c u r r e n c y | l a n e M a i n | l a n e S u b a g e n t | l a n e C r o n ) | c r o n \. ( e n a b l e d | m a x C o n c u r r e n t R u n s | s e s s i o n R e t e n t i o n | r u n L o g M a x B y t e s | r u n L o g K e e p L i n e s ) | h e a r t b e a t \. ( e n a b l e d | p e r i o d i c E n a b l e d | r u n S e s s i o n | n o t i f i c a t i o n C e n t e r | o p e n N o t i f i c a t i o n s | t r i g g e r L a b e l | l a s t S t a t u s \. l a b e l | l a s t N o t i c e \. l a b e l | p r o m p t A p p e n d | i n c l u d e R e a s o n i n g | s u p p r e s s T o o l E r r o r W a r n i n g s | a c t i v e S t a r t | a c t i v e E n d | a c t i v e T i m e z o n e | t r i g g e r | s p e c \. i t e m s | s p e c \. u p d a t e d A t ) | s u b a g e n t s \. ( m a x D e p t h | m a x C h i l d r e n | m a x C o n c u r r e n t | m o d e l ) | h t t p \. ( m a x B o d y B y t e s | m a x U r l P a r t s | f i l e s \. ( u r l A l l o w l i s t | a l l o w e d M i m e s | m a x B y t e s | m a x C h a r s | m a x R e d i r e c t s | p d f M a x P a g e s | p d f M a x P i x e l s | p d f M i n T e x t C h a r s ) | i m a g e s \. ( u r l A l l o w l i s t | a l l o w e d M i m e s | m a x B y t e s | m a x R e d i r e c t s ) ) | c h a n n e l H e a l t h \. m i n u t e s | v o i c e \. ( e n a b l e d ) | v o i c e W a k e \. ( e n a b l e d ) | t a l k \. ( v o i c e A l i a s e s | o u t p u t F o r m a t | a p i K e y | i n t e r r u p t O n S p e e c h ) | t t s \. ( s t a t u s | p r o v i d e r | v o i c e I d | m o d e l I d | f o r m a t ) | v o i c e W a k e T r i g g e r s \. l a b e l ) $ / ,
156- / ^ s e t t i n g s \. g a t e w a y \. ( c h a n g e 3 d a v a t a r \. p i c k T i t l e | c h a n g e 3 d m o t i o n \. p i c k T i t l e | c h a n g e N a m e \. t i t l e | r e a d i n e s s \. ( r e a d y T i t l e | i n c o m p l e t e T i t l e ) | m o d e l \. ( a g e n t T i t l e | e m b e d d i n g T i t l e | i m a g e T i t l e ) ) $ / ,
157- / ^ s e t t i n g s \. ( m e m o r y \. s u m m a r y \. t i t l e | u s a g e \. o v e r v i e w \. t i t l e | g e n e r a l \. d o w n l o a d \. d i a l o g T i t l e | g e n e r a l \. p r o x y \. d i a l o g T i t l e | g e n e r a l \. a d v a n c e d \. m e n u B a r V i s i b i l i t y \. l a b e l | c a l l s \. s k i l l s \. s o u r c e s \. e m p t y T i t l e | c a l l s \. s k i l l s \. s e c u r i t y \. g r o u p s \. ( p a c k a g e _ w r i t e | d e p s _ w r i t e | c o n f i g _ w r i t e | s o u r c e _ w r i t e ) \. l a b e l | t o o l s \. b r o w s e r C o n t r o l \. s s r f S e c t i o n | s k i l l s \. l i s t T i t l e | c o n n e c t o r s \. l o g i n T i t l e | e x t e r n a l T o o l s \. r e l e a s e N o t e s T i t l e | p r o v i d e r \. m o d e l s \. m a n a g e \. t i t l e | p r o v i d e r \. m o d e l s \. m a n a g e \. i n v a l i d T i t l e | p r o v i d e r \. c u s t o m \. t i t l e | p r o v i d e r \. d e l e t e \. t i t l e | a b o u t \. a d v a n c e d \. u n l o c k e d T i t l e ) $ / ,
158- / ^ s e t t i n g s \. i n t e g r a t i o n \. c h a n n e l s \. ( c o n f i g \. g r o u p s \. c o l u m n s \. r e q u i r e M e n t i o n | r e s e t \. b u t t o n ) $ / ,
159- / ^ c r o n \. ( r u n s \. d e t a i l T i t l e | d i a l o g \. ( d e l e t e T i t l e | b u l k D e l e t e T i t l e | e d i t T i t l e | v i e w T i t l e | n e w T i t l e ) | c o l u m n s \. | o v e r v i e w \. c h a r t \. t i t l e $ ) / ,
160- / ^ l i b r a r y \. ( c o l u m n s \. | t o o l s \. o p t i o n a l T i t l e | r e s o u r c e s \. ( l i b r a r y I n f o T i t l e | f i l e I n f o T i t l e | r e c o r d I n f o T i t l e | c u r r e n t R e c o r d s T i t l e | d e l e t e L i b r a r y T i t l e ) | d o w n l o a d \. ( t i t l e | i n p u t T i t l e ) | t a s k \. ( d e l e t e F i l e s T i t l e | d e l e t e S u c c e s s T i t l e | d e l e t e F a i l e d T i t l e | b u l k D e l e t e S u c c e s s T i t l e | b u l k D e l e t e F a i l e d T i t l e | f a i l e d C h e c k T i t l e ) | f i l e \. ( d e l e t e F i l e s T i t l e | d e l e t e S u c c e s s T i t l e | d e l e t e F a i l e d T i t l e | b u l k D e l e t e S u c c e s s T i t l e | b u l k D e l e t e F a i l e d T i t l e ) | r o w M e n u \. r e n a m e T i t l e | o v e r v i e w \. c h a r t \. t i t l e | p r e v i e w \. i m a g e T i t l e | i m p o r t \. ( v i d e o P i c k e r T i t l e | s u b t i t l e P i c k e r T i t l e | u n s u p p o r t e d T i t l e | d i a l o g \. t a r g e t T i t l e ) | c o n f i g \. ( s a v e F a i l e d T i t l e | t a s k R u n t i m e \. ( t r a n s l a t e T i t l e | p r o o f r e a d T i t l e ) | v i d e o E x p o r t P r e s e t s \. ( s a v e d T i t l e | s a v e F a i l e d T i t l e | d e l e t e d T i t l e | d e l e t e F a i l e d T i t l e ) | s u b t i t l e S t y l e s \. ( a l l S t y l e s T i t l e | c r e a t e F o r m T i t l e | u n s a v e d T i t l e | i m p o r t F a i l e d T i t l e | i m p o r t G u i d e T i t l e | e x p o r t S u c c e e d e d T i t l e | e x p o r t F a i l e d T i t l e | p r e v i e w I n f o T i t l e | m o n o S t y l e S e c t i o n T i t l e | b i l i n g u a l M e t a S e c t i o n T i t l e | p r i m a r y S o u r c e T i t l e | s e c o n d a r y S o u r c e T i t l e | p r i m a r y S t y l e T i t l e | s e c o n d a r y S t y l e T i t l e | o v e r v i e w T i t l e | d e f a u l t s T i t l e | d e l i v e r y R e a d i n e s s T i t l e | f o n t M a n a g e m e n t T i t l e | r e f e r e n c e d F o n t s T i t l e | s t y l e S o u r c e s T i t l e | b r o w s e S o u r c e F a i l e d T i t l e | f o n t S o u r c e s T i t l e | s y n c F o n t S o u r c e S u c c e s s T i t l e | s y n c F o n t S o u r c e F a i l e d T i t l e | i n s t a l l U s e r F o n t S u c c e s s T i t l e | i n s t a l l U s e r F o n t F a i l e d T i t l e | i n s t a l l M a c h i n e F o n t S u c c e s s T i t l e | i n s t a l l M a c h i n e F o n t F a i l e d T i t l e | i m p o r t S o u r c e I t e m S u c c e s s T i t l e | i m p o r t S o u r c e I t e m F a i l e d T i t l e ) ) | w o r k s p a c e \. ( e m p t y T i t l e | t a b l e \. ( t i m e l i n e T i t l e | e d i t o r T i t l e ) | d i a l o g s \. ( e x p o r t V i d e o \. ( s u b t i t l e H a n d l i n g T i t l e | t r a c k M a p p i n g T i t l e ) | l a n g u a g e T a s k \. ( t i t l e | q a R e a l t i m e T i t l e | i s s u e B r e a k d o w n T i t l e | r e s t o r e O r i g i n a l T i t l e ) | i m p o r t S u b t i t l e \. ( t i t l e | n o r m a l i z a t i o n T i t l e | g u i d e l i n e I n h e r i t a n c e T i t l e ) ) | p r e v i e w \. p l a c e h o l d e r T i t l e | w a v e f o r m \. t i t l e | r e v i e w \. ( l o c k e d T i t l e | a p p l y S u c c e s s T i t l e | a p p l y F a i l e d T i t l e | d i s c a r d S u c c e s s T i t l e | d i s c a r d F a i l e d T i t l e ) | n o t i f i c a t i o n s \. ( t r a n s l a t i o n R e a d y T i t l e | p r o o f r e a d R e a d y T i t l e | q a R e v i e w R e a d y T i t l e | s a v e F a i l e d T i t l e | n o S u b t i t l e T r a c k T i t l e | o r i g i n a l R e s t o r e d T i t l e | r e s t o r e F a i l e d T i t l e | n o F i l e S e l e c t e d T i t l e | o p e n F i l e F a i l e d T i t l e | n o V i d e o S e l e c t e d T i t l e | n o P r e s e t S e l e c t e d T i t l e | e x p o r t Q u e u e d T i t l e | e x p o r t F a i l e d T i t l e | m o d u l e C o n f i g U n a v a i l a b l e T i t l e | p r o m p t P r o f i l e S a v e d T i t l e | s a v e P r o m p t P r o f i l e F a i l e d T i t l e | t r a n s l a t i o n Q u e u e d T i t l e | t r a n s l a t i o n F a i l e d T i t l e | p r o o f r e a d Q u e u e d T i t l e | p r o o f r e a d F a i l e d T i t l e | i m p o r t P r o f i l e R e a d y T i t l e ) ) ) $ / ,
161- / ^ ( g a t e w a y \. l o g s \. t i t l e | d e b u g \. ( s t a t u s \. t i t l e | c h a n n e l s \. t i t l e | m e s s a g e \. f r o n t e n d \. ( t o a s t T i t l e | n o t i f i c a t i o n T i t l e | d i a l o g T i t l e ) | m e s s a g e \. r e a l t i m e \. n o t i f y T i t l e ) | c h a t \. c o m p o s e r \. a t t a c h D i a l o g T i t l e | c h a t \. w e l c o m e \. e n t r y \. i t e m s \. ( a s s i s t a n t | p r o v i d e r s | m o d e l | g e n e r i c ) \. a c t i o n | c h a t \. t o o l s \. a p p r o v a l T o o l \. t i t l e | p r o d u c t M o d e \. o p t i o n s \. ( f u l l | d o w n l o a d ) \. ( t i t l e | a c t i o n ) | n o t i f i c a t i o n s \. f o o t e r \. c o d e s \. ( a p p U p d a t e | e x t e r n a l T o o l s U p d a t e ) \. t i t l e | n o t i f i c a t i o n s \. e m p t y \. t i t l e ) $ / ,
162163] ;
163- const englishTitleStyleHeuristicPattern = / ( \. t i t l e $ | T i t l e $ | \. l a b e l $ | \. b u t t o n $ | \. a c t i o n $ | c o l u m n s \. | T a b s \. | s e c t i o n s \. | S e c t i o n $ | d i a l o g T i t l e $ ) / ;
164+ const englishTitleStyleHeuristicPattern = / ( \. b u t t o n $ | \. a c t i o n $ | c o l u m n s \. | T a b s \. | s e c t i o n s \. | S e c t i o n $ | d i a l o g T i t l e $ | p i c k T i t l e $ ) / ;
164165const englishTitleStyleSentencePattern = / \? | \. { 1 , 3 } $ | \b ( i s | a r e | w a s | w e r e | a m | c a n ' t | c a n n o t | n e e d | n e e d s | s h o w s ? \s + u p | p l e a s e ) \b / i;
165166const zhGlossaryReplacements = [
166167 [ "External Tools" , "外部工具" ] ,
@@ -333,9 +334,6 @@ function shouldUseEnglishTitleCase(key, value) {
333334 if ( englishTitleStyleSentencePattern . test ( value ) ) {
334335 return false ;
335336 }
336- if ( / ^ c h a t \. w e l c o m e \. e n t r y \. / . test ( key ) || / ^ n o t i f i c a t i o n s \. c e n t e r \. c o d e s \. / . test ( key ) || / ^ p r o d u c t M o d e \. t i t l e $ / . test ( key ) ) {
337- return false ;
338- }
339337 return true ;
340338}
341339
@@ -471,7 +469,24 @@ function filterLocaleTree(input, usedSet, prefix = "") {
471469 return output ;
472470}
473471
474- const enSource = JSON . parse ( fs . readFileSync ( path . join ( localeDir , "en.json" ) , "utf8" ) ) ;
472+ function mapLocaleTree ( input , mapper , prefix = "" ) {
473+ const output = { } ;
474+ for ( const [ key , value ] of Object . entries ( input ) ) {
475+ const nextKey = prefix ? `${ prefix } .${ key } ` : key ;
476+ if ( value && typeof value === "object" && ! Array . isArray ( value ) ) {
477+ output [ key ] = mapLocaleTree ( value , mapper , nextKey ) ;
478+ continue ;
479+ }
480+ output [ key ] = mapper ( nextKey , String ( value ) ) ;
481+ }
482+ return output ;
483+ }
484+
485+ let enSource = JSON . parse ( fs . readFileSync ( path . join ( localeDir , "en.json" ) , "utf8" ) ) ;
486+ if ( fixEnglishStyle ) {
487+ enSource = mapLocaleTree ( enSource , normalizeEnglishLocaleValue ) ;
488+ fs . writeFileSync ( path . join ( localeDir , "en.json" ) , `${ JSON . stringify ( enSource , null , 2 ) } \n` ) ;
489+ }
475490const zhSource = JSON . parse ( fs . readFileSync ( path . join ( localeDir , "zh-CN.json" ) , "utf8" ) ) ;
476491const en = flatten ( enSource ) ;
477492const zh = flatten ( zhSource ) ;
0 commit comments