1
+ import sempy
1
2
import pandas as pd
2
3
from typing import List , Optional , Union
3
4
from sempy ._utils ._log import log
@@ -10,7 +11,7 @@ def translate_semantic_model(
10
11
languages : Union [str , List [str ]],
11
12
exclude_characters : Optional [str ] = None ,
12
13
workspace : Optional [str ] = None ,
13
- ):
14
+ ) -> pd . DataFrame :
14
15
"""
15
16
Translates names, descriptions, display folders for all objects in a semantic model.
16
17
@@ -29,6 +30,8 @@ def translate_semantic_model(
29
30
30
31
Returns
31
32
-------
33
+ pandas.DataFrame
34
+ Shows a pandas dataframe which displays all of the translations in the semantic model.
32
35
33
36
"""
34
37
@@ -302,3 +305,153 @@ def set_translation_if_exists(
302
305
lang ,
303
306
i ,
304
307
)
308
+ result = pd .DataFrame (
309
+ columns = [
310
+ "Language" ,
311
+ "Object Type" ,
312
+ "Table Name" ,
313
+ "Object Name" ,
314
+ "Translated Object Name" ,
315
+ "Description" ,
316
+ "Translated Description" ,
317
+ "Display Folder" ,
318
+ "Translated Display Folder" ,
319
+ ]
320
+ )
321
+ with connect_semantic_model (
322
+ dataset = dataset , readonly = True , workspace = workspace
323
+ ) as tom :
324
+
325
+ sempy .fabric ._client ._utils ._init_analysis_services ()
326
+ import Microsoft .AnalysisServices .Tabular as TOM
327
+
328
+ for c in tom .model .Cultures :
329
+ for tr in c .ObjectTranslations :
330
+ oType = str (tr .Object .ObjectType )
331
+ oName = tr .Object .Name
332
+ tValue = tr .Value
333
+ prop = str (tr .Property )
334
+
335
+ if tr .Object .ObjectType == TOM .ObjectType .Table :
336
+ desc = tom .model .Tables [oName ].Description
337
+ new_data = {
338
+ "Language" : c .Name ,
339
+ "Table Name" : oName ,
340
+ "Object Name" : oName ,
341
+ "Object Type" : oType ,
342
+ "Description" : desc ,
343
+ }
344
+ result = pd .concat (
345
+ [result , pd .DataFrame (new_data , index = [0 ])], ignore_index = True
346
+ )
347
+ condition = (
348
+ (result ["Language" ] == c .Name )
349
+ & (result ["Table Name" ] == oName )
350
+ & (result ["Object Name" ] == oName )
351
+ & (result ["Object Type" ] == oType )
352
+ )
353
+ elif tr .Object .ObjectType == TOM .ObjectType .Level :
354
+ hierarchyName = tr .Object .Parent .Name
355
+ tName = tr .Object .Parent .Parent .Name
356
+ levelName = "'" + hierarchyName + "'[" + oName + "]"
357
+ desc = (
358
+ tom .model .Tables [tName ]
359
+ .Hierarchies [hierarchyName ]
360
+ .Levels [oName ]
361
+ .Description
362
+ )
363
+ new_data = {
364
+ "Language" : c .Name ,
365
+ "Table Name" : tName ,
366
+ "Object Name" : levelName ,
367
+ "Object Type" : oType ,
368
+ "Description" : desc ,
369
+ }
370
+ result = pd .concat (
371
+ [result , pd .DataFrame (new_data , index = [0 ])], ignore_index = True
372
+ )
373
+ condition = (
374
+ (result ["Language" ] == c .Name )
375
+ & (result ["Table Name" ] == tName )
376
+ & (result ["Object Name" ] == levelName )
377
+ & (result ["Object Type" ] == oType )
378
+ )
379
+ elif tr .Object .ObjectType == TOM .ObjectType .Column :
380
+ tName = tr .Object .Table .Name
381
+ desc = tom .model .Tables [tName ].Columns [oName ].Description
382
+ display_folder = (
383
+ tom .model .Tables [tName ].Columns [oName ].DisplayFolder
384
+ )
385
+ new_data = {
386
+ "Language" : c .Name ,
387
+ "Table Name" : tName ,
388
+ "Object Name" : oName ,
389
+ "Object Type" : oType ,
390
+ "Description" : desc ,
391
+ "Display Folder" : display_folder ,
392
+ }
393
+ result = pd .concat (
394
+ [result , pd .DataFrame (new_data , index = [0 ])], ignore_index = True
395
+ )
396
+ condition = (
397
+ (result ["Language" ] == c .Name )
398
+ & (result ["Table Name" ] == tName )
399
+ & (result ["Object Name" ] == oName )
400
+ & (result ["Object Type" ] == oType )
401
+ )
402
+ elif tr .Object .ObjectType == TOM .ObjectType .Measure :
403
+ tName = tr .Object .Table .Name
404
+ desc = tom .model .Tables [tName ].Measures [oName ].Description
405
+ display_folder = (
406
+ tom .model .Tables [tName ].Measures [oName ].DisplayFolder
407
+ )
408
+ new_data = {
409
+ "Language" : c .Name ,
410
+ "Table Name" : tName ,
411
+ "Object Name" : oName ,
412
+ "Object Type" : oType ,
413
+ "Description" : desc ,
414
+ "Display Folder" : display_folder ,
415
+ }
416
+ result = pd .concat (
417
+ [result , pd .DataFrame (new_data , index = [0 ])], ignore_index = True
418
+ )
419
+ condition = (
420
+ (result ["Language" ] == c .Name )
421
+ & (result ["Table Name" ] == tName )
422
+ & (result ["Object Name" ] == oName )
423
+ & (result ["Object Type" ] == oType )
424
+ )
425
+ elif tr .Object .ObjectType == TOM .ObjectType .Hierarchy :
426
+ tName = tr .Object .Table .Name
427
+ desc = tom .model .Tables [tName ].Hierarchies [oName ].Description
428
+ display_folder = (
429
+ tom .model .Tables [tName ].Hierarchies [oName ].DisplayFolder
430
+ )
431
+ new_data = {
432
+ "Language" : c .Name ,
433
+ "Table Name" : tName ,
434
+ "Object Name" : oName ,
435
+ "Object Type" : oType ,
436
+ "Description" : desc ,
437
+ "Display Folder" : display_folder ,
438
+ }
439
+ result = pd .concat (
440
+ [result , pd .DataFrame (new_data , index = [0 ])], ignore_index = True
441
+ )
442
+ condition = (
443
+ (result ["Language" ] == c .Name )
444
+ & (result ["Table Name" ] == tName )
445
+ & (result ["Object Name" ] == oName )
446
+ & (result ["Object Type" ] == oType )
447
+ )
448
+
449
+ if prop == "Caption" :
450
+ result .loc [condition , "Translated Object Name" ] = tValue
451
+ elif prop == "Description" :
452
+ result .loc [condition , "Translated Description" ] = tValue
453
+ else :
454
+ result .loc [condition , "Translated Display Folder" ] = tValue
455
+ result .fillna ("" , inplace = True )
456
+
457
+ return result
0 commit comments