@@ -411,16 +411,30 @@ def language(instance):
411411
412412@cyber_observable_check ("2.1" )
413413def software_language (instance ):
414- """Ensure the 'language' property of software objects is a valid ISO 639-2
415- language code.
414+ """Ensure the 'language' property of software objects is a valid RFC 5646
415+ language code. ISO 639-2 codes are accepted for backward compatibility
416+ but will generate warnings.
416417 """
417418 if ('type' in instance and instance ['type' ] == 'software' and
418419 'languages' in instance ):
419420 for lang in instance ['languages' ]:
420- if lang not in enums .SOFTWARE_LANG_CODES :
421+ if lang in enums .LANG_CODES :
422+ # Valid RFC 5646 language code
423+ continue
424+ elif lang in enums .SOFTWARE_LANG_CODES :
425+ # ISO 639-2 code - accept but warn
426+ import logging
427+ logger = logging .getLogger (__name__ )
428+ logger .warning ("The 'languages' property of object '%s' "
429+ "contains an ISO 639-2 language code ('%s'). "
430+ "RFC 5646 language codes are preferred for STIX 2.1. "
431+ "Consider updating to RFC 5646 format."
432+ % (instance ['id' ], lang ))
433+ else :
434+ # Invalid language code
421435 yield JSONError ("The 'languages' property of object '%s' "
422- "contains an invalid ISO 639-2 language "
423- " code ('%s') ."
436+ "contains an invalid language code ('%s'). "
437+ "Expected RFC 5646 language code ."
424438 % (instance ['id' ], lang ), instance ['id' ])
425439
426440
0 commit comments